你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL_UART_IRQHandler的几个bug

[复制链接]
gkcclm 发布时间:2015-5-22 23:01
STM32 HAL  V1.1.2的HAL_UART_IRQHandler似乎有几个bug(完整代码请参见HAL源文件):1. 假设调用UART_Transmit_IT发送,如果此时Rx有多于一个字节的数据过来,那么就会出现Overrun Err,HAL_UART_IRQHandler会被调用,并且进入处理错误的代码中
  1.    /* UART Over-Run interrupt occured -----------------------------------------*/
  2.   if((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
  3.   {
  4.     __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
  5.    
  6.     huart->ErrorCode |= HAL_UART_ERROR_ORE;
  7.     /* Set the UART state ready to be able to start again the process */
  8.     huart->State = HAL_UART_STATE_READY;
  9.   }
复制代码


这时候State变成了Ready。那么当前字节发送完成后,再次进入HAL_UART_IRQHandler,调用UART_Transmit_IT


  1.   /* UART in mode Transmitter ------------------------------------------------*/
  2.   if((__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESET))
  3.   {
  4.     UART_Transmit_IT(huart);
  5.   }
复制代码
UART_Transmit_IT先检查State是否为Tx或者RxTx。由于这时候State是Ready,所以直接返回Busy。退出IRQ。由于TXE仍然是Set的,所以又进入IRQ,但是又被UART_Transmit_IT返回Busy。导致Tx用于无法完成,并且IRQ一直在运行。

2. UART_Receive_IT应该也有问题:
  1. if(--huart->RxXferCount == 0)
  2.     {
  3.       while(HAL_IS_BIT_SET(huart->Instance->ISR, UART_FLAG_RXNE))        //等待RXNE Clear。如果由于Rx后面立即有数据过来,可能会导致RXNE Set。由于这时候不再读取RDR了,RXNE永远是Set的,就永远死循环在这里了。
  4.       {
  5.       }
  6.       __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
复制代码
我接触ST才几天,这些问题是我在运行Example中实际遇到的。总体感觉这个HAL库bug很多,特别是UART,非常的不好用(感觉只能当作玩具)。当然,其他部分我没有怎么用,所以不清楚是否有问题。

不知道大家有没有遇到这些问题。


多谢
收藏 2 评论14 发布时间:2015-5-22 23:01

举报

14个回答
waiman-156411 回答时间:2015-5-23 09:07:00
小数据还行。大数据传输还是自己写循环指针好一些
netlhx 回答时间:2015-5-25 09:40:57
要先检测计数器,如果计数器为0才会出现这种情况
captainliuy 回答时间:2015-6-3 17:50:22
串口确实不好用,我最近的工程是使用DMA循环模式接收1字节,回调中写入buffer中
captainliuy 回答时间:2015-6-3 17:52:08
提供的接口是不太好用,但是最近工程用了四个串口也都跑下来了
captainliuy 回答时间:2015-6-3 18:09:17
串口是双工的,可以接收也可以发送,但是处理器处理可不是双工的,发送的时候,如果进来2个以上的数据自然会产生溢出错误,这时候在设为Ready后会调用HAL_UART_ErrorCallback,具体看你自己怎么处理了
wolfgang2015 回答时间:2015-11-27 16:02:38
最近调试STM32L4的串口,也发现了多多少少的问题。HAL的串口是不怎么好用。要自己改造。
tangxhhh 回答时间:2016-3-17 07:58:38
captainliuy 发表于 2015-6-3 18:09
串口是双工的,可以接收也可以发送,但是处理器处理可不是双工的,发送的时候,如果进来2个以上的数据自然 ...

请问应该怎么处理?
我刚用STM32不久,急着做一个项目,但是串口经常报OVERRUN错误,不知怎么解决,请赐教!
bfl111 回答时间:2017-2-22 14:52:11
想请前辈指点一下怎么解决的OVERRUN的错误的?
jackten 回答时间:2017-4-25 17:22:44
楼主   在哪里拿到uart接收到的数据?能截个图看看吗
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版