OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3406|回复: 0

解决STM32串口溢出错误导致死机的问题

[复制链接]

17

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2015-1-7
在线时间
101 小时
发表于 2021-1-20 23:06:24 | 显示全部楼层 |阅读模式
本帖最后由 zhang062061 于 2021-1-20 23:09 编辑

    之前调试程序,遇到了串口溢出中断的问题,导致主程序被卡死。这里总结分享一下经验,希望对读者有用。   
    对于STM32F103系列单片机,使能接收中断后,溢出中断就会自动被使能。那什么时候会发生溢出中断呢?在RXNE=1 的的条件下(也就是上次数据还没有读走),串口接收寄存器又接收好了一个字节的数据并准备往RDR 寄存器去转移的时候,会产生溢出中断。    产生溢出中断典型的情况有:
    1.串口接收中断被更高优先级的中断打断,且打断时间比较长。       2.擦写单片机内部flash时,耗时较长,导致串口中断无法响应。   
    串口接收的数据越频繁,发生溢出中断的概率越大,如果程序中没有对溢出中断进行处理,就会导致程序死机等情况。

    解决办法:
    1.判断并清除溢出中断标志。清除溢出标志只需要依次读取SR和DR寄存器即可。在串口中断中添加如下程序:
  1. if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE))//溢出标志
  2. {
  3.   uint32_t temp = USART1->SR;
  4.   temp = USART1->DR;
  5. }
复制代码
对于使用STM32CubeMX生成的程序,编写串口错误回调函数即可。
  1. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
  2. {
  3.   if(huart->ErrorCode & HAL_UART_ERROR_ORE)//溢出错误
  4.   {
  5.     uint32_t temp = huart->Instance->SR;
  6.     temp = huart->Instance->DR;
  7.   }
  8. }
复制代码

另外一种方法就是不使能接收中断,比如采用DMA+空闲中断的方式。可以参考公众号的文章《STM32CubeMX之串口通信


欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。


gzh.png






https://shop72315368.taobao.com
承接软硬件项目开发
微信搜索 “嵌入式技术开发”,关注我的公众号
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 23:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表