GD32串口一直进溢出中断的bug分析与解决办法
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); //用户数据处理函数 } }
这个bug是一个典型的中断处理不完全的案例。在没有Uart FIFO的MCU硬件设计中,MCU可能因为处理更高优先级的中断而来不及接收串口数据,从而导致了串口数据溢出的问题。在这个案例里,软件设计人员开启了Uart的OE中断,即溢出中断。故当发生溢出时,MCU直接进入了溢出中断,而设计人员这时并未完善代码,串口中断函数里面没有清除溢出中断的操作,导致MCU一直触发了溢出中断,反复进入串口中断。
解决办法
解决办法其实也非常简单,在进入中断处理函数里面时,先检查是否溢出中断触发,或者检查溢出标志位是否置位,如果置位则清除溢出中断即可。通常,这时的串口接收数据也做丢弃处理。
解决办法其实也非常简单,在进入中断处理函数里面时,先检查是否溢出中断触发,或者检查溢出标志位是否置位,如果置位则清除溢出中断即可。通常,这时的串口接收数据也做丢弃处理。