打印
[STM32F1]

STM32 HAL库 UART串口接收数据异常导致卡死

[复制链接]
14639|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liu510706140|  楼主 | 2018-5-25 17:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liu510706140 于 2018-6-2 11:51 编辑

程序框架用STM32CubeMX生成。
有一个项目要用到串口通讯,异常数据会使串口直接卡死,而且不会恢复,只能重新上电才能恢复。
仿真查询,会一直进中断死在这边:
void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */

  /* USER CODE END USART3_IRQn 0 */
  HAL_UART_IRQHandler(&huart3);
  /* USER CODE BEGIN USART3_IRQn 1 */

  /* USER CODE END USART3_IRQn 1 */
}

网上查询了有很多类似的情况,错误由ORE导致,这个错误置起来后一直清不掉

原因找到了,但是不知道怎么解决,但是网上也找不到解决方法,只能自己解决了
1、先查手册,查看错误标志有哪些,要怎么清掉,不会上传图片所以手册截图就不发了
2、怎么调用HAL库文件清错误标志
#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__))    获取错误标志
#define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__))清标志
3、建一个错误回调函数,下面这个我试过可以用,
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
        uint32_t isrflags   = READ_REG(huart->Instance->SR);//手册上有讲,清错误都要先读SR
        if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET)
        {
                READ_REG(huart->Instance->DR);//PE清标志,第二步读DR
                __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_PE);//清标志
        }
        if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET)
        {
                READ_REG(huart->Instance->DR);//FE清标志,第二步读DR
                __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_FE);
        }
        
        if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET)
        {
                READ_REG(huart->Instance->DR);//NE清标志,第二步读DR
                __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_NE);
        }        
        
        if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET)
        {
                READ_REG(huart->Instance->CR1);//ORE清标志,第二步读CR
                __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_ORE);
        }        


}

新手写的不好,希望对有需要的人有点参考!
沙发
feiqi1| | 2018-6-8 21:26 | 只看该作者
不错的资料,值得借鉴与学习呀

使用特权

评论回复
板凳
guohuimao| | 2019-5-25 19:40 | 只看该作者
使用HAL库来开发UART全双工通信的方案,这是在给自己挖墓呀.....两个方案死在串口上面了,不知查过多少网页,给ST的技术人员写过多少邮件打过多少电话了.....

使用特权

评论回复
评论
13277120295 2019-9-22 14:01 回复TA
你也是使用HAL库中的串口操作么?此时我遇到了一个棘手的问题,感觉是串口的问题,用STM32的芯片,然后屏幕会偶尔出现死机状态 
地板
惊世不惊心| | 2019-7-30 17:03 | 只看该作者
多谢楼主阿,解决了我心头大患!!!说到底还是寄存器**好阿

使用特权

评论回复
5
zhjiehua| | 2019-9-3 14:04 | 只看该作者
我也遇到这个问题,同样添加了错误回调函数还是会出现串口接收卡死的问题,后来直接不用HAL库的串口接收程序了

使用特权

评论回复
评论
13277120295 2019-9-22 14:02 回复TA
您好,您遇到了什么问题呢,是不是偶尔的串口出现错误,然后导致STM32驱动的东西出现死机状态 
6
forward2012| | 2019-10-29 15:12 | 只看该作者
zhjiehua 发表于 2019-9-3 14:04
我也遇到这个问题,同样添加了错误回调函数还是会出现串口接收卡死的问题,后来直接不用HAL库的串口接收程 ...

兄弟 用原来的标准库没有卡死现象吗,我也是加了错误回调函数也是不行,因为ORE置位后 后面发来的数据感觉压根就进不去中断的样子(中断函数里面有错误处理,是读SR和DR),必须在主循环中加入读SR的语句才能清除这个标志,不知道HAL为啥这样呢

使用特权

评论回复
7
yklstudent| | 2019-10-29 22:54 | 只看该作者
中断内检测处理不能解决这个问题?

使用特权

评论回复
8
逍遥李| | 2020-7-22 10:16 | 只看该作者
神奇的是我2018年使用HAL库当时版本很好用的,现在他们库升级好几代了,结果问题一大堆……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝