[研电赛技术支持] GD32串口一直进溢出中断

[复制链接]
 楼主| Xiashiqi 发表于 2025-4-12 20:08 | 显示全部楼层 |阅读模式
GD32单片机在调试串口时,在#1处打断点,会导致串口溢出中断,再全速运行,会不断地进#2处,但不会进#1。

void USART0_IRQHandler(void)
{
  uint8_t dat;

  if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) //#2
  {
    dat= usart_data_receive(USART0);        //#1       
    usart_interrupt_flag_clear(USART0,USART_INT_FLAG_RBNE);
    //用户数据处理函数   
  }
}


查看手册

2418367f7734b2b1f0.png

6778467f7733e03fd1.png

即表示数据有接收的情况下,再接收到一个字节,就会置位ORERR。这里默认开启了溢出中断。这里和51单片机和ST的芯片有所不同。所以在串口接收中断中,需考虑这种情况,下面是优化之后的代码

void USART0_IRQHandler(void)
{
  uint8_t dat;

  if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE_ORERR))
  {   
    dat= usart_data_receive(USART0);                //#2
    usart_interrupt_flag_clear(USART0,USART_INT_FLAG_RBNE_ORERR);
    return;
  }
  if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))
  {
    dat= usart_data_receive(USART0);                //#1
    usart_interrupt_flag_clear(USART0,USART_INT_FLAG_RBNE);
    //用户数据处理函数   
  }
}



在#1处打断点,会导致串口溢出中断,再全速运行,会直接进#2处,再全速运行,能正常运行了。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/lljss1980/article/details/127115652

huquanz711 发表于 2025-4-16 08:18 来自手机 | 显示全部楼层
变量操作不当容易导致溢出
懒癌晚期患者 发表于 2025-4-16 13:17 | 显示全部楼层
检查一下你的中断优先级设置,有时候不正确的优先级设置会导致中断处理不当。
onlycook 发表于 2025-4-17 11:05 | 显示全部楼层
数据接收过快导致的?
probedog 发表于 2025-4-17 11:07 | 显示全部楼层
在串口中断服务函数中,按顺序读取 状态寄存器 和 数据寄存器,以清除 ORE 标志位。
elephant00 发表于 2025-4-17 11:10 | 显示全部楼层
检查硬件连接,确保波特率匹配。
laocuo1142 发表于 2025-4-17 12:00 | 显示全部楼层
溢出中断标志位未正确清除。
flycamelaaa 发表于 2025-4-17 13:00 | 显示全部楼层
DMA 或中断优先级问题。
stormwind123 发表于 2025-4-17 14:00 | 显示全部楼层
硬件问题吧!
classroom 发表于 2025-4-17 15:00 | 显示全部楼层
使用 环形缓冲区 存储接收数据,中断中仅存储数据,不进行复杂处理。
在主循环中处理缓冲区数据,减少中断处理时间。
jcky001 发表于 2025-4-17 18:00 | 显示全部楼层
优化中断处理逻辑,减少中断处理时间。
两只袜子 发表于 2025-4-17 19:03 | 显示全部楼层
波特率不匹配?
cr315 发表于 2025-4-17 19:20 | 显示全部楼层
用 DMA 接收数据。
神话编织者 发表于 2025-4-20 23:09 | 显示全部楼层
添加中断溢出清零操作即可。没有啥事的!
elsaflower 发表于 2025-5-4 19:55 | 显示全部楼层
当串口接收数据速度超过CPU处理速度时,数据会堆积在接收寄存器中。若上一个字节未被及时读取,而新字节又到达,就会触发溢出错误(ORE)。
vivilyly 发表于 2025-5-4 21:56 | 显示全部楼层
配置DMA接收中断,并在DMA传输完成后处理数据。
updownq 发表于 2025-5-13 16:04 | 显示全部楼层
结合串口空闲中断(IDLE)检测数据帧结束,实现高效接收
lzmm 发表于 2025-5-13 19:58 | 显示全部楼层
在保证通信效率的前提下,适当降低波特率,以减少数据接收压力。
qiufengsd 发表于 2025-5-13 20:37 | 显示全部楼层
若使用DMA接收数据,但DMA缓冲区已满或未及时处理数据,也可能导致串口溢出。
beacherblack 发表于 2025-5-13 21:53 | 显示全部楼层
中断处理代码尽可能简洁高效,避免在中断服务程序中执行耗时操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

220

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部