GD32串口一直进溢出中断
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);
//用户数据处理函数
}
}
查看手册
即表示数据有接收的情况下,再接收到一个字节,就会置位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
变量操作不当容易导致溢出 检查一下你的中断优先级设置,有时候不正确的优先级设置会导致中断处理不当。
数据接收过快导致的? 在串口中断服务函数中,按顺序读取 状态寄存器 和 数据寄存器,以清除 ORE 标志位。 检查硬件连接,确保波特率匹配。 溢出中断标志位未正确清除。 DMA 或中断优先级问题。 硬件问题吧! 使用 环形缓冲区 存储接收数据,中断中仅存储数据,不进行复杂处理。
在主循环中处理缓冲区数据,减少中断处理时间。 优化中断处理逻辑,减少中断处理时间。 波特率不匹配? 用 DMA 接收数据。 添加中断溢出清零操作即可。没有啥事的!
页:
[1]