近期在通过PC与单片机经串口通信时,造成单片机定时复位,开始怀疑看门狗故障,将看门狗关闭后,问题依然。经监测发现,是由于长时间,高频通信造成USART一直进中断,没有喂狗造成的单片机复位。于是寻找是什么原因造成程序一直进入USART中断。实际上我没有查找资料,只是在网上搜寻结果,但是真的有解决方法。
这里只介绍为什么造成程序一直进入USART中断和解决方法。
1.为什么会一直跑到接收中断?
断点之后发现(USART_GetITStatus(USART1, USART_IT_RXNE)==RESET的,也就是说没有数据接收到也进了中断,而且在USART配置中我也只打开了接收中断!没有数据送过来应该是不可能进入中断的!
2.响应了什么中断?
我想通过函数(USART_GetITStatus()把所有中断状态都读出来,但失败了,USART_IT_XXX所有中断状态都是RESET!也就是说没有中断也进入到这个中断服务程序来了!?
只要接收中断打开,即RXNEIE设置为1,那么ORE中断也自动打开了。
可是USART_GetITStatus(USART1, USART_IT_ORE )== RESET!!!!
找到USART_GetITStatus(USART1, USART_IT_RXNE)函数,发现只有当USART_IT_ERR中断使能时,才能读到ORE中断。
在这里要指出这个BUG:产生ORE中断了,但使用USART_GetITStatus()函数却无法读到这个中断被SET起来!
3.问题解决
接收中断程序中增加如下代码,问题解决。
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1,
USART_IT_RXNE) != RESET)来判断
{
USART_ReceiveData(USART1);
}
这句话的意思:是将接受到的无用数据丢弃。
注意问题:
1.USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中断,那么ORE中断也同时被开启了。
2.ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断)。