STM32 串口进入中断,但是没有检查到接收数据位!!!!
最近做项目有概率遇到串口进入中断(LED闪烁来判断),但是没有检查到接收数据位 USART_IT_RXNE ,导致一直卡在判断语句 USART_GetITStatus(USART2, USART_IT_RXNE) != RESET,导致程序卡死。通过keil 调试模式的软件复位都没有用,需要硬件复位才行。通过百度发现这个现象挺常见的。这边我也整理一下,方便后面的查看。
1.问题定位:通过硬件发现问题后,进入keil 调试模式判断下问题在何处
在接收判断前后加入printf,来定位问题在何处。通过PC串口输出来定位,发现只能输出111111,不输出222222,说明中断是有触发,但是没有检查到接收数据位
2.问题分析
遇到问题先百度:通过查看大佬的分析----产生ORE中断了,但使用USART_GetITStatus()函数却无法读到这个中断被SET起来!(https://blog.csdn.net/love_maomao/article/details/8234039)
本质问题:RXNE还没来得及复位(数据可能可能被读传走也有可能没有被传走),就接收到新的字符,导致溢出错误,从而触发串口2的中断相应,这和HardFault_Handler错误挺像的,都是都是溢出导致的硬件错误,后面也会讲下这个问题。
并不是RXNE 触发的USART2_IRQHandler中断,而是ORE触发USART2_IRQHandler中断,和我一开始理解的有误,我理解成是RXNE触发。
在打开接收使能时,会一起开始ORE中断使能,没有办法通过关闭ORE使能来规避问题。因此需要检查到ORE标志位后,需要手动清除ORE标志位。
3.解决办法:
使用USART_ClearITPendingBit();无法清除ORE的标志位,该函数只有CTS,LDB,TC和RXNE。
查找库函数手册:
最终加一个判断:
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) // 检查 ORE 标志
{
USART_ClearFlag(USART2,USART_FLAG_ORE);
USART_ReceiveData(USART2);
rxIndex = 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步