diff --git a/bspMCU/bsp_uart.c b/bspMCU/bsp_uart.c index 5ef8a64..79dce8c 100644 --- a/bspMCU/bsp_uart.c +++ b/bspMCU/bsp_uart.c @@ -159,4 +159,23 @@ void UART_RX_IRQHandler(TComCtrl *_ptComCtrl) #endif } +void UART_RX_ERRORHandler(TComCtrl *_ptComCtrl) +{ + TUartUserData *ptUartUserData = (TUartUserData *)_ptComCtrl->m_pUserData; + if (NULL == ptUartUserData) return; + /* 先读 RDR,清除残留 RXNE */ + volatile uint32_t dummy = ptUartUserData->m_uart->Instance->RDR; + (void)dummy; + + /* 清除 ORE 等错误标志 */ + ptUartUserData->m_uart->Instance->ICR = USART_ICR_ORECF | USART_ICR_FECF | USART_ICR_PECF | USART_ICR_NECF; + + /* HAL 发生 ORE 时内部会锁住 huart,必须解锁后 + 才能重新启动 Receive_IT */ + __HAL_UNLOCK(ptUartUserData->m_uart); + + /* 重新启动中断接收 */ + HAL_UART_Receive_IT(ptUartUserData->m_uart, &ptUartUserData->m_temp, 1); +} + #endif diff --git a/bspMCU/include/bsp_uart.h b/bspMCU/include/bsp_uart.h index 3df9c50..dc4ea94 100644 --- a/bspMCU/include/bsp_uart.h +++ b/bspMCU/include/bsp_uart.h @@ -37,6 +37,7 @@ extern TUartUserData *UART_userdata_init(int _iID, int32_t _uiBaudRate, uint32_t extern void UART_IT_init(TComCtrl *_ptComCtrl); extern void UART_DMA_RX_IRQHandler(TComCtrl *_ptComCtrl); extern void UART_RX_IRQHandler(TComCtrl *_ptComCtrl); +extern void UART_RX_ERRORHandler(TComCtrl *_ptComCtrl); #endif #endif /* end of include guard: BSP_UART_H */ diff --git a/project b/project index 86e867c..bb250aa 160000 --- a/project +++ b/project @@ -1 +1 @@ -Subproject commit 86e867c5d8efd261ce78e0ee480771e8b6e8a7f7 +Subproject commit bb250aa22b82811f6f752bb266d19092e6a78b61