打印
[STM32F1]

STM32串口溢出中断问题

[复制链接]
1307|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccook11|  楼主 | 2024-5-30 08:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对于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+空闲中断的方式。


使用特权

评论回复
沙发
laocuo1142| | 2024-6-13 14:35 | 只看该作者
那种方法比较好使

使用特权

评论回复
板凳
EmmaTT| | 2024-6-18 22:07 | 只看该作者
当然是DMA比较好啊

使用特权

评论回复
地板
突然下起雨| | 2024-6-30 14:36 | 只看该作者
中断嵌套:如果串口接收中断被更高优先级的中断(比如定时器中断或其他紧急中断)打断,并且该高优先级中断执行时间较长,那么串口接收中断可能无法在数据到达时及时处理,导致溢出。

使用特权

评论回复
5
wang6623| | 2024-6-30 14:58 | 只看该作者
Flash写入:在单片机进行内部Flash擦写操作时,会暂时禁止某些中断响应,包括串口接收中断。如果擦写操作时间过长,也可能导致串口接收中断无法及时响应。

使用特权

评论回复
6
理想阳| | 2024-6-30 15:29 | 只看该作者
因为程序中没有及时处理串口中断吗?

使用特权

评论回复
7
雨果喝水| | 2024-8-29 13:01 | 只看该作者
可以在串口接收中断服务程序中添加如下代码来处理溢出错误

使用特权

评论回复
8
星辰大海不退缩| | 2024-8-29 23:58 | 只看该作者
直接实用其实也是最好的

使用特权

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

本版积分规则

34

主题

1283

帖子

0

粉丝