如何消除串口接收中断溢出(ORE)中断造成的假死机

STM8S处理串口中断注意_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM8S处理串口中断注意
&&STM8S串口中断异常处理
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢[STM32] 关于USART接收中断的BUG和注意事项 - CSDN博客
[STM32] 关于USART接收中断的BUG和注意事项
今天在使用USART模块,遇到了一些问题并解决了,于是发贴共享。
问题描述:
在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!问题就出来,不到1分钟时间,通讯没有反应了。USART配置代码如下:
void uart_config(void)
& & USART_InitTypeDef USART_InitS
& & USART_InitStructure.USART_BaudRate = UART_GetBaud(BaudRate);
& & USART_InitStructure.USART_WordLength = USART_WordLength_8b;
& & USART_InitStructure.USART_StopBits = USART_StopBits_1;
& & USART_InitStructure.USART_Parity = USART_Parity_No;
& & USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
& & USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
& & USART_InitStructure.USART_Clock = USART_Clock_D
& & USART_InitStructure.USART_CPOL = USART_CPOL_L
& & USART_InitStructure.USART_CPHA = USART_CPHA_2E
& & USART_InitStructure.USART_LastBit = USART_LastBit_E
& & /* Configure USART1 */
& & USART_Init(USART1, &USART_InitStructure);
& & /* Enable USART1 receive interrupt */
& & USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
& & /* Enable the USART1 */
& & USART_Cmd(USART1, ENABLE);
分析问题:
1.为什么没有通讯了?
通过仿真器仿真,发现程序一直进入接收中断中,由于我没有使用中断发送,于是程序就死在了接收中断,也就没有数据发送到电脑上来。接收中断代码如下:
void UART_Receive(void)
& &//正在处理上一条通讯,接收到数据不处理
& & if(bRecieveOK)
& && &&&if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
& && && && &USART_ClearITPendingBit(USART1, USART_IT_RXNE);
& && &&&//processing receive data,don't receive again
& & if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
& && &&&if(MoudBusExpir == 0)
& && && && &ucRcePtr = 0;
& && && && &MoudBusExpir = 20;//50ms
& && &&&else
& && && && &MoudBusExpir = 20;
& && &&&/* Read one byte from the receive data register */
& && &&&ucRS485Buff[ucRcePtr++] = USART_ReceiveData(USART1);
& && &&&/* Clear the USART1 Receive interrupt */
& && &&&USART_ClearITPendingBit(USART1, USART_IT_RXNE);
2.为什么会一直跑到接收中断?
断点之后发现(USART_GetITStatus(USART1, USART_IT_RXNE)==RESET的,也就是说没有数据接收到也进了中断,而且在USART配置中我也只打开了接收中断!没有数据送过来应该是不可能进入中断的!
3.响应了什么中断?
我想通过函数(USART_GetITStatus()把所有中断状态都读出来,但失败了,USART_IT_XXX所有中断状态都是RESET!也就是说没有中断也进入到这个中断服务程序来了!?
STM32F10x微控制器参考手册(2009年12月第10版)P541发现如下说明:
也就是说只要接收中断打开,即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起来!
5.把ORE中断标志位清除
既然找到了是什么中断,那么把相应的中断标志位清除,就应该可以了吧?
USART_ClearITPendingBit(USART1, USART_IT_ORE);
但是,结果是没有任何效果!清除之后,马上读ORE中断状态,USART_GetITStatus(USART1, USART_IT_ORE)==RESET.程序仍然跑死在接收中断。再使用另一个函数USART_GetFlagStatus(USART1, USART_FLAG_ORE) = SET,原来ORE标志位还没有清除。
6.问题解决
为什么清除不掉?头疼了,再找找资料,有发现,在P523页如下图:
接收中断程序改为:
void UART_Receive(void)
& & if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断
& && &&&USART_ReceiveData(USART1);
& &//正在处理上一条通讯,接收到数据不处理
& & if(bRecieveOK)
& && &&&if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
& && && && &USART_ClearITPendingBit(USART1, USART_IT_RXNE);
& && &&&//processing receive data,don't receive again
& & if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
& && &&&if(MoudBusExpir == 0)
& && && && &ucRcePtr = 0;
& && && && &MoudBusExpir = 20;//50ms
& && &&&else
& && && && &MoudBusExpir = 20;
& && &&&/* Read one byte from the receive data register */
& && &&&ucRS485Buff[ucRcePtr++] = USART_ReceiveData(USART1);
& && &&&/* Clear the USART1 Receive interrupt */
& && &&&USART_ClearITPendingBit(USART1, USART_IT_RXNE);
注意问题:1.USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中断,那么ORE中断也同时被开启了。
& && && && && &2.ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)
BUG建议:1.在STM32库中,能不能修改USART_GetITStatus()函数对USART_IT_ORE中断的处理?也就是我只要打开了接收中断,那么有ORE中断时,我也能使用USART_GetITStatus(USART1,USART_IT_ORE)读到.
本文已收录于以下专栏:
相关文章推荐
STM32F103XX的ADC的采样时钟最快14MHz,最快采样率1MHz。
这个ADC时钟是从哪来的呢。我们看下面这个STM32的时钟结构图:
我们大多使用STM3...
观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统、订阅——发布系统等。因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以GUI系统来说,应用的UI...
关注公众号
在公众号里回复“”秘密“”两个字
http://task.csdn.net/m/task/home?task_id=398 领取奖励
提示:根据公众号里的自动回复,完成...
LinearLayout xmlns:android="/apk/res/android"
xmlns:app="http://schema...
JavaEE 6及以上版本的web.xml问题?MyEclipse JavaEE 6版本开始web.xml突然消失不见?没这回事,只是不太必须而已,有需要的项目可以自行进行添加或在创建项目的时候点击n...
注:本文的高斯模糊只能显示,如果想要保存模糊后的图片,请参考另一篇文章:http://blog.csdn.net/fan7983377/article/details/
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)查看: 1225|回复: 0
USART 中断方式接收无响应问题的一种情况 及其处理方法
下载分13788 分
原创币0 点
下载157 次
上传1609 次
金币5586 ¥
主题帖子积分
会员等级:
笔记本维修
问题:此问题由客户工程师提出,客户在使用STM32F103的USART做串口通讯时,发现了一个问题,当设备正常通信一段时间后,串口不响应外部的通信请求了.文中配图引用自STM32F103的中文版本用户手册,下载链接为:
调研:一、经过调研:1.1 客户除了使用USART做串口通信,还开启了定时器中断来进行数据采集.1.2 定时器的优先级比串口接收的优先级高.1.3 定时器处理数据操作也比较频繁.1.4 客户使用的STM32F1标准库(版本V3.5.0).二、经过问题复现和使用ST-LINK在线调试和定位发现:2.1 在出现这个问题的时候,程序不断的进入串口接收中断,不能够运行到main主函数处理其他任务了.2.2 发现ORE标志为‘1’,也就说明程序是发生了串口溢出错误.2.3 客户在进入串口中断后会调用USART_GetITStatus(USART2, USART_IT_RXNE)来获取RXNE的值.如果RXNE为1则去读取DR数据寄存器的数据,读取后RXNE为0,但是ORE的标志依然为1,依然进入了串口中断.三、经过分析以及我们可以通过我们芯片的用户手册可以得到以下信息:3.1 程序不断进入串口中断是因为ORE标志始终为1,没有被用户清除掉:
从上图红色部分我们可以看到,如果串口接收中断开启了,那么ORE为1时就会产生中断.3.2.从下图我们可以看到,顺序执行对USART_SR和USART_DR的操作就会清除ORE的标志,客户在中断中执行了以下操作,那为什么ORE标志还没有被清除呢?(R1执行了读USART_SR操作,R2执行了读USART_DR操作).
3.3 我们可以看手册中下表的解释:3.3.1 ORE表征的是一个历史事件,当ORE为1时,表明至少有1个数据已经丢失.3.3.2这有2种可能发生的情况,RXNE为1的情况R3和RXNE为0的情况R4,如下图中的解释.
3.3.3我们从上图可以看出,3.2图中的R1+R2操作只能处理RXNE为1的情况;当RXNE为0的特殊情况, 就是在读序列器件(在USART_SR寄存器读访问和USART_DR读访问之间)接收到新的数据,数据SR虽然被读过了,但是overrun事件依然发生了,以上操作是不能够处理的:
3.4 因此我们要在应用中对ORE标志进行处理,即当判断发生ORE中断的时候,我们再读一次USART_DR的值,这样如果没有新的Overrun溢出事件发生的时候,ORE会被清除,然后程序就不会因为ORE未被清除一直不断的进入串口中断了,代码处理如下:
结论:对于这种情况,我们可以看到USART串口接收中断使能了,那ORE中断也就开启了;为了消除在通过读序列(USART_SR/USART_DR)的过程中产生的溢出错误,我们可以尝试在应用程序中需要针对ORE标志做一个处理来清除ORE标志,使得串口通信可以正常的继续工作.建议客户在做串口通信时需要增加帧检验功能,如CRC校验等...,当发生ORE时,帧校验肯定是通不过的,不会造成从机误响应.
重要通知 - 请仔细阅读意法半导体公司及其子公司(“ST”)保留随时对ST 产品和/ 或本文档进行变更、更正、增强、修改和改进的权利,恕不另行通知。买方订货之前应获取关于ST 产品的最新信息。ST 产品的销售依照订单确认时的相关ST 销售条款。买方自行负责对ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。ST 不对任何知识产权进行任何明示或默示的授权或许可。转售的ST 产品如有不同于此处提供的信息的规定,将导致ST 针对该产品授予的任何保证失效。ST 和ST 徽标是ST 的商标。所有其他产品或服务名称均为其各自所有者的财产。本文档中的信息取代本文档所有早期版本中提供的信息。
承接:青岛地区笔记本维修业务,有意者站内信或留言。
Powered by Discuz! X3.4 -ALicensed
& 2017 Comsenz Inc.STM32的USART中断死循环,形成死机。 - ARM单片机 - 电子工程世界网
STM32的USART中断死循环,形成死机。
09:24:15来源: eefocus 关键字:&&&&
直接说重点:我用的是 F103 芯片 2_IRQHandler 总是中断,程序死循环。1、出现问题:的中断处理程序是: USART2_IRQHandler(void){& u8 key = 0;& USART_ClearFlag(USART2,USART_FLAG_TC ); //清除中断标志& if(USART_GetITStatus(USART2,USART_IT_RXNE)!=Bit_RESET)//检查指定的usart是否发生了中断& {& & &key=USART_ReceiveData(USART2);& & &// & }}运行结果:程序开始是正常的,但运行一段时间后,会不断进入中断,USART_GetITStatus 检查又没有中断发生。本函数一退出就重新再进入,就这样死循环了。2、原因分析:查了若干资料,参考手册,如下:(1)打开RXNEIE,默认会同时打开RXNE和ORE中断。(2)必须第一时间清零RXNE,如没及时清零,下一据过来时就会Overrun error!(3)就是ORE导致的。(4)解决办法要清除ORE&有了这个基础,直接上解决方案:3、解决办法:void USART2_IRQHandler(void){& u8 key = 0;& if(USART_GetITStatus(USART2,USART_IT_RXNE)!=Bit_RESET) //检查 USART 是否发生中断& {& & & USART_ClearITPendingBit(USART2,USART_IT_RXNE); // 清中断标志& & & key=USART_ReceiveData(USART2);& & & // save key at here.& }&&if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) // 检查 ORE 标志& {& & & USART_ClearFlag(USART2,USART_FLAG_ORE);& & & USART_ReceiveData(USART2);& }}改后程序就正常啦!!!4、参考资料《STM32中断卡死主循环问题分析》 & &http://blog.csdn.net/origin333/article/details/《STM32串口中断详细比较》 &/link?url=LOKe2MjxexxJSim2HNuTDGP3Tn5OQLu79u0oG7rHY7JPMaxQgIQPk-0y-OUxo9mMUvCObnP0bp5zw6W3udBeIFBzd-nUuzQpN1bJ6m5EReS
关键字:&&&&
编辑:什么鱼 引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
热门关键词
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

我要回帖

更多关于 linux 串口中断接收 的文章

 

随机推荐