#include "bsp_uart.h" #include "lwrb.h" #include "CH58x_uart.h" #include "shell_port.h" #include "SLEEP.h" // https://www.cnblogs.com/iot-fan/p/14744671.html lwrb_t Uart1Rx; lwrb_t Uart1Tx; uint8_t uart1_tx_buf[UART1_TX_BUFFER_LENGTH] = {0}; uint8_t uart1_rx_buf[UART1_RX_BUFFER_LENGTH] = {0}; // 串口接收 unsigned int BSP_Uart1_Receive_Data(void *buf, unsigned int len) { return lwrb_read(&Uart1Rx, buf, len); } // 串口发送数据 unsigned int BSP_Uart1_Send_Data(const void *buf, unsigned int len) { unsigned int ret; ret = lwrb_write(&Uart1Tx, buf, len); // UART1_INTCfg(ENABLE, RB_IER_THR_EMPTY); BSP_BlockSleep(); BSP_UART1_TxLoop(); BSP_RequestSleep(); return ret; } unsigned int BSP_Uart1_Send_String(const void *buf) { return BSP_Uart1_Send_Data(buf, strlen((const char *)buf)); } /** * \brief Buffer event function */ static void Uart1_evt_fn(struct lwrb *buff, lwrb_evt_type_t evt, lwrb_sz_t bp) { 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; default: break; } } void UART1_FifoInit(void) { lwrb_init(&Uart1Tx, uart1_tx_buf, sizeof(uart1_tx_buf)); lwrb_init(&Uart1Rx, uart1_rx_buf, sizeof(uart1_rx_buf)); // lwrb_set_evt_fn(&Uart1Rx, Uart1_evt_fn); } // DEBUG void BSP_UART1_Init(uint32_t baudrate) { // GPIOPinRemap(ENABLE, RB_PIN_UART1); /* 配置串口1:先配置IO口模式,再配置串口 */ GPIOA_SetBits(bTXD1); // GPIOB_ModeCfg(bRXD1, GPIO_ModeIN_PU); // RXD-配置上拉输入 GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平 // 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打开,触发点4字节 R8_UART1_LCR = RB_LCR_WORD_SZ; R8_UART1_IER = RB_IER_TXD_EN; R8_UART1_DIV = 1; } // UART1_ByteTrigCfg(UART_1BYTE_TRIG); // 中断方式接收数据 // 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); UART1_FifoInit(); SHELL_Init(); } // https://www.cnblogs.com/iot-fan/p/13439293.html // tx process // 本查询函数需要扔到主循环不断调用 void BSP_UART1_TxLoop(void) { uint8_t data; while (R8_UART1_TFC < UART_FIFO_SIZE) { // 判断发送软件缓冲区,是否空,如果不空,就一个一个读出来,填到硬件fifo里 if (lwrb_get_full(&Uart1Tx)) { lwrb_read(&Uart1Tx, &data, 1); // 把软件缓冲区的数据填到uart的硬件发送fifo里 UART1_SendByte(data); } else { break; } } } void BSP_UART1_TxLowPower(void) { uint8_t data; // 判断发送软件缓冲区,是否空,如果不空,就一个一个读出来,填到硬件fifo里 while (lwrb_get_full(&Uart1Tx)) { lwrb_read(&Uart1Tx, &data, 1); // 把软件缓冲区的数据填到uart的硬件发送fifo里 UART1_SendByte(data); } } /********************************************************************* * @fn UART1_IRQHandler * * @brief UART1中断函数 * * @return none */ __INTERRUPT __HIGH_CODE void UART1_IRQHandler(void) { switch (UART1_GetITFlag()) { case UART_II_LINE_STAT: // 线路状态错误 { UART1_GetLinSTA(); break; } case UART_II_RECV_RDY: case UART_II_RECV_TOUT: // 接收超时 // lwrb_write(&Uart1Rx, &R8_UART1_RBR, 1); while (R8_UART1_RFC) { shellHandler(&shell, R8_UART1_RBR); } break; case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送 // 串口中断发送会可能影响蓝牙 break; case UART_II_MODEM_CHG: // 只支持串口0 break; default: break; } } int reboot(void) { PFIC_SystemReset(); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), reboot, reboot, "reboot");