USART高速、海量数据通信故障和解决方法

近期在通过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中断)。

 

永不止步步 发表于11-23 16:26 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:345327个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号