STM32 HAL V1.1.2的HAL_UART_IRQHandler似乎有几个bug(完整代码请参见HAL源文件):1. 假设调用UART_Transmit_IT发送,如果此时Rx有多于一个字节的数据过来,那么就会出现Overrun Err,HAL_UART_IRQHandler会被调用,并且进入处理错误的代码中
- /* UART Over-Run interrupt occured -----------------------------------------*/
- if((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
- {
- __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
-
- huart->ErrorCode |= HAL_UART_ERROR_ORE;
- /* Set the UART state ready to be able to start again the process */
- huart->State = HAL_UART_STATE_READY;
- }
复制代码
这时候State变成了Ready。那么当前字节发送完成后,再次进入HAL_UART_IRQHandler,调用UART_Transmit_IT
- /* UART in mode Transmitter ------------------------------------------------*/
- if((__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESET))
- {
- UART_Transmit_IT(huart);
- }
复制代码 UART_Transmit_IT先检查State是否为Tx或者RxTx。由于这时候State是Ready,所以直接返回Busy。退出IRQ。由于TXE仍然是Set的,所以又进入IRQ,但是又被UART_Transmit_IT返回Busy。导致Tx用于无法完成,并且IRQ一直在运行。
2. UART_Receive_IT应该也有问题:
- if(--huart->RxXferCount == 0)
- {
- while(HAL_IS_BIT_SET(huart->Instance->ISR, UART_FLAG_RXNE)) //等待RXNE Clear。如果由于Rx后面立即有数据过来,可能会导致RXNE Set。由于这时候不再读取RDR了,RXNE永远是Set的,就永远死循环在这里了。
- {
- }
- __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
复制代码 我接触ST才几天,这些问题是我在运行Example中实际遇到的。总体感觉这个HAL库bug很多,特别是UART,非常的不好用(感觉只能当作玩具)。当然,其他部分我没有怎么用,所以不清楚是否有问题。
不知道大家有没有遇到这些问题。
多谢
|
请问应该怎么处理?
我刚用STM32不久,急着做一个项目,但是串口经常报OVERRUN错误,不知怎么解决,请赐教!