打印
[STM32F1]

STM32串口溢出中断问题

[复制链接]
766|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 zhang062061 于 2021-1-22 16:12 编辑

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

    解决办法:
    1.判断并清除溢出中断标志。清除溢出标志只需要依次读取SR和DR寄存器即可。在串口中断中添加如下程序:
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE))//溢出标志
{
  uint32_t temp = USART1->SR;
  temp = USART1->DR;
}

对于使用STM32CubeMX生成的程序,编写串口错误回调函数即可。
  
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
  if(huart->ErrorCode & HAL_UART_ERROR_ORE)//溢出错误
  {
    uint32_t temp = huart->Instance->SR;
    temp = huart->Instance->DR;
  }
}

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



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










使用特权

评论回复
沙发
drer| | 2021-2-5 20:40 | 只看该作者
非常感谢楼主分享的解决方案

使用特权

评论回复
板凳
gwsan| | 2021-2-5 20:45 | 只看该作者
还需要一直判断标志位吗

使用特权

评论回复
地板
kxsi| | 2021-2-5 20:49 | 只看该作者
是不是因为传输数据过多引发的啊

使用特权

评论回复
5
nawu| | 2021-2-5 20:53 | 只看该作者
这个需要手动清除吗

使用特权

评论回复
6
qcliu| | 2021-2-5 20:56 | 只看该作者
也是很不错的一种解决办法

使用特权

评论回复
7
zhang062061|  楼主 | 2021-2-6 15:34 | 只看该作者
nawu 发表于 2021-2-5 20:53
这个需要手动清除吗

不需要手动清除

使用特权

评论回复
8
zhang062061|  楼主 | 2021-2-6 15:35 | 只看该作者
gwsan 发表于 2021-2-5 20:45
还需要一直判断标志位吗

在中断中判断就行

使用特权

评论回复
9
zhang062061|  楼主 | 2021-2-6 15:36 | 只看该作者
kxsi 发表于 2021-2-5 20:49
是不是因为传输数据过多引发的啊

是因为接收中断被更高优先级的中断打断引起的

使用特权

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

本版积分规则

18

主题

41

帖子

0

粉丝