BLE_TYQ_CH584M/BSP/src/bsp_uart.c

157 lines
3.8 KiB
C
Raw Normal View History

2024-12-02 17:03:41 +08:00
#include "bsp_uart.h"
#include "lwrb.h"
2024-12-12 15:49:10 +08:00
#include "CH59x_uart.h"
2024-12-02 17:03:41 +08:00
#include "shell_port.h"
2024-12-12 15:49:10 +08:00
lwrb_t Uart1Rx;
lwrb_t Uart1Tx;
2024-12-02 17:03:41 +08:00
uint8_t uart1_tx_buf[UART1_TX_BUFFER_LENGTH] = {0};
uint8_t uart1_rx_buf[UART1_RX_BUFFER_LENGTH] = {0};
2024-12-12 15:49:10 +08:00
// <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>
2024-12-02 17:03:41 +08:00
unsigned int BSP_Uart1_Receive_Data(void *buf, unsigned int len)
{
2024-12-12 15:49:10 +08:00
return lwrb_read(&Uart1Rx, buf, len);
2024-12-02 17:03:41 +08:00
}
2024-12-12 15:49:10 +08:00
// <20><><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-12-02 17:03:41 +08:00
unsigned int BSP_Uart1_Send_Data(const void *buf, unsigned int len)
{
unsigned int ret;
2024-12-12 15:49:10 +08:00
ret = lwrb_write(&Uart1Tx, buf, len);
// UART1_INTCfg(ENABLE, RB_IER_THR_EMPTY);
2024-12-02 17:03:41 +08:00
return ret;
}
2024-12-12 15:49:10 +08:00
unsigned int BSP_Uart1_Send_String(const void *buf)
2024-12-02 17:03:41 +08:00
{
2024-12-12 15:49:10 +08:00
return BSP_Uart1_Send_Data(buf, strlen((const char *)buf));
2024-12-02 17:03:41 +08:00
}
/**
* \brief Buffer event function
*/
2024-12-12 15:49:10 +08:00
static void Uart1_evt_fn(struct lwrb *buff, lwrb_evt_type_t evt, lwrb_sz_t bp)
2024-12-02 17:03:41 +08:00
{
switch (evt)
{
case LWRB_EVT_RESET:
printf("[EVT] Buffer reset event!\r\n");
break;
case LWRB_EVT_READ:
printf("[EVT] Buffer read event: %d byte(s)!\r\n", (int)bp);
break;
case LWRB_EVT_WRITE:
printf("[EVT] Buffer write event: %d byte(s)!\r\n", (int)bp);
break;
2024-12-12 15:49:10 +08:00
default:
break;
2024-12-02 17:03:41 +08:00
}
}
void UART1_FifoInit(void)
{
2024-12-12 15:49:10 +08:00
lwrb_init(&Uart1Tx, uart1_tx_buf, sizeof(uart1_tx_buf));
lwrb_init(&Uart1Rx, uart1_rx_buf, sizeof(uart1_rx_buf));
2024-12-02 17:03:41 +08:00
2024-12-12 15:49:10 +08:00
// lwrb_set_evt_fn(&Uart1Rx, Uart1_evt_fn);
2024-12-02 17:03:41 +08:00
}
2024-12-12 15:49:10 +08:00
// DEBUG
void BSP_UART1_Init(uint32_t baudrate)
2024-12-02 17:03:41 +08:00
{
2024-12-12 15:49:10 +08:00
// GPIOPinRemap(ENABLE, RB_PIN_UART1);
2024-12-02 17:03:41 +08:00
/* <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<49><4F>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD> */
2024-12-12 15:49:10 +08:00
GPIOA_SetBits(bTXD1);
2024-12-12 19:38:57 +08:00
// GPIOB_ModeCfg(bRXD1, GPIO_ModeIN_PU); // RXD-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-12-12 15:49:10 +08:00
GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA); // TXD-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ
// UART1_DefInit();
{
UART1_BaudRateCfg(baudrate);
R8_UART1_FCR = (2 << 6) | RB_FCR_TX_FIFO_CLR | RB_FCR_RX_FIFO_CLR | RB_FCR_FIFO_EN; // FIFO<46>򿪣<EFBFBD><F2BFAAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽ<EFBFBD>
R8_UART1_LCR = RB_LCR_WORD_SZ;
R8_UART1_IER = RB_IER_TXD_EN;
R8_UART1_DIV = 1;
}
2024-12-12 19:38:57 +08:00
// UART1_ByteTrigCfg(UART_1BYTE_TRIG);
2024-12-02 17:03:41 +08:00
// <20>жϷ<D0B6>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-12-12 19:38:57 +08:00
// UART1_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY);
// UART1_INTCfg(ENABLE, RB_IER_LINE_STAT | RB_IER_RECV_RDY);
// PFIC_EnableIRQ(UART1_IRQn);
2024-12-02 17:03:41 +08:00
UART1_FifoInit();
2024-12-12 15:49:10 +08:00
SHELL_Init();
2024-12-02 17:03:41 +08:00
}
2024-12-12 15:49:10 +08:00
// https://www.cnblogs.com/iot-fan/p/13439293.html
// tx process
// <20><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>
void BSP_UART1_TxLoop(void)
2024-12-02 17:03:41 +08:00
{
uint8_t data;
2024-12-12 15:49:10 +08:00
while (R8_UART1_TFC < UART_FIFO_SIZE)
2024-12-02 17:03:41 +08:00
{
2024-12-12 15:49:10 +08:00
// <20>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>Ƿ<EFBFBD><C7B7><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>һ<EFBFBD><D2BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>Ӳ<EEB5BD><D3B2>fifo<66><6F>
if (lwrb_get_full(&Uart1Tx))
2024-12-02 17:03:41 +08:00
{
2024-12-12 15:49:10 +08:00
lwrb_read(&Uart1Tx, &data, 1);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uart<72><74>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>fifo<66><6F>
UART1_SendByte(data);
2024-12-02 17:03:41 +08:00
}
2024-12-12 15:49:10 +08:00
else
{
2024-12-02 17:03:41 +08:00
break;
2024-12-12 15:49:10 +08:00
}
2024-12-02 17:03:41 +08:00
}
}
/*********************************************************************
2024-12-12 15:49:10 +08:00
* @fn UART1_IRQHandler
2024-12-02 17:03:41 +08:00
*
* @brief UART1<EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD>
*
* @return none
*/
__INTERRUPT
__HIGH_CODE
2024-12-12 15:49:10 +08:00
void UART1_IRQHandler(void)
2024-12-02 17:03:41 +08:00
{
2024-12-12 15:49:10 +08:00
switch (UART1_GetITFlag())
2024-12-02 17:03:41 +08:00
{
case UART_II_LINE_STAT: // <20><>·״̬<D7B4><CCAC><EFBFBD><EFBFBD>
{
2024-12-12 15:49:10 +08:00
UART1_GetLinSTA();
2024-12-02 17:03:41 +08:00
break;
}
case UART_II_RECV_RDY:
2024-12-12 15:49:10 +08:00
case UART_II_RECV_TOUT: // <20><><EFBFBD>ճ<EFBFBD>ʱ
// lwrb_write(&Uart1Rx, &R8_UART1_RBR, 1);
while (R8_UART1_RFC)
2024-12-02 17:03:41 +08:00
{
2024-12-12 15:49:10 +08:00
shellHandler(&shell, R8_UART1_RBR);
2024-12-02 17:03:41 +08:00
}
break;
case UART_II_THR_EMPTY: // <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><D5A3>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-12-12 15:49:10 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>жϷ<D0B6><CFB7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-12-02 17:03:41 +08:00
break;
case UART_II_MODEM_CHG: // ֻ֧<D6BB>ִ<EFBFBD><D6B4><EFBFBD>0
break;
default:
break;
}
}
2024-12-12 15:49:10 +08:00
int reboot(void)
{
PFIC_SystemReset();
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC),
reboot, reboot, "reboot");