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

USART中断接收无响应的问题分析-电子产品世界论坛
USART中断接收无响应的问题分析
问题描述:
客户工程师提出,在使用STM32F103 的USART 做串口通讯时,发现了一个问题,当设备正常通信一段时间后,串口就不再响应外部通信请求了。
一、基本情况:
1.1 客户除了使用USART 通信,还开启了定时器中断来进行数据采集.
1.2 定时器的优先级比串口接收的优先级高.
1.3 定时器处理数据操作比较频繁.
1.4 客户使用的STM32F1 标准库(版本V3.5.0).
二、经调试,进行现象重现与问题定位后发现:
2.1 出现异常问题的时,程序不断的进入串口接收中断,不能执行其它功能。
2.2 发现ORE 标志为‘1’,说明程序发生了串口溢出错误.
2.3 客户在进入串口中断后会调用USART_GetITStatus(USART2,USART_IT_RXNE)
来获取RXNE的值.如果RXNE为1 则去读取DR寄存器的数据,读取后RXNE为0,但是ORE
的标志仍为1,依然进入了串口中断.
经过分析和阅读ST MCU芯片参考手册可得到以下信息:
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事件依然发生了,R1+R2操作是不能处理的。
3.4 因此我们要在应用中对ORE标志进行处理,当判断发生ORE中断的时候,我们再读一次USART_DR的值,这样如果没有新的Overrun 溢出事件发生的时候,ORE会被清除,然后程序就不会因为ORE未被清除而一直不断的进入串口中断了,代码处理如下:
对于上述情况,当我们使能了USART串口接收中断,ORE中断也就开启了。为了消除在通过读序列(USART_SR/USART_DR)过程中产生的溢出错误,我们可以尝试在应用程序中针对ORE标志做些处理来清除ORE标志,使得串口通信可以正常的持续工作。客户也可以在做串口通信时增加帧检验功能,如CRC校验等,当发生ORE时,帧校验肯定是通不过的,这样以避免误响应。
SR和DR一起清就可以了。
熊猫写上代码了么?
这个32系列不错哎~~我也准备搞个系列,嘿嘿
问题总结的相当系统,有因有果,超赞
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有STM32 例程 串口实验-土地公文库
STM32 例程 串口实验
STM32 例程 串口实验
注意:IDLE位不会再次被置位,直到RXNE位被置位 (即又检测到一次空闲总线)位3 ORE:溢出错误 (Overrun error)RXNE = 1的同时,移位寄存器中接收到的当前数据,准备转移至RDR寄存器时,该位被硬件置位。如果USART_CR1中的RXNEIE = 1,则产生中断。该位由软件序列清零(先读USART_SR,后读USART_CR)。0:没有溢出错误;1:检测到溢出错误。注意:该位被置位时,RDR寄存器中的数据不会丢失,但是移位寄存器中的数据会被覆盖。在多缓冲通信模式下,如果设置了EIE位,则ORE置位会产生中断。位2 NE:噪声错误标志 (Noise error)在接收到的帧中检测到噪声时,该位由硬件置位。该位由软件序列清除 (先读USART_SR,再读USART_DR)。0:没有检测到噪声;1:检测到噪声。注意:该位不会产生中断,因为它和RXNE一起出现,硬件会在设置RXNE标志时产生中断。在多缓冲通信模式下,如果设置了EIE位,则NE置位会产生中断。位1 FE:帧错误 (Framing error)当检测到同步错位,过多的噪声或者断开符,该位被硬件置位。由软件序列将其清零(先读USART_SR,再读USART_DR)。0:没有检测到帧错误;1:检测到帧错误或者break符。注意:该位不会产生中断,因为它和RXNE一起出现,硬件会在设置RXNE标志时产生中断。如果当前传输的数据既产生了帧错误,又产生了溢出错误,硬件还是会继续该数据的传输,并且只设置ORE位。在多缓冲通信模式下,如果设置了EIE位,则FE置位会产生中断。位0 PE:校验错误 (Parity error)在接收模式下,如果出现奇偶校验错误,该位被硬件置位。由软件序列对其清零(先读USART_SR,再读USART_DR)。在清除PE位前,软件必须等待RXNE标志位被置’1’。如果USART_CR1中的PEIE = 1,则产生中断。0:没有奇偶校验错误;1:奇偶校验错误。[编辑] USART_DR (Data Register)数据寄存器第8 / 48页
全文分48页阅读据counterpoint发布的数据,2017年全球前六大手机芯片企……
2018年才刚过没多久,区块链概念股一片火热。沉寂已久的……
近日三星电子宣布开发出核心电池技术,其研究机构三星先……
近年来汽车电子的发展迅猛,各种LED大灯、辅助驾驶、主动……
前不久,罗德与施瓦茨公司(R&S)召开新品发布会,推出了一……
演讲人:徐济炜时间: 10:00:00
演讲人:沈剑安时间: 10:00:00
演讲人:孙彬时间: 10:00:00
预算:¥30000预算:¥250000
广东省广东省
关于STM32的串口溢出中断
[导读]关于STM32的串口溢出中断
&之前遇到奇怪的问题:本文引用地址:
串口中断处理函数中加了溢出中断处理:
if(USART_GetITStatus(USART1,USART_IT_ORE) != RESET) //产生溢出中断
Utemp = USART_ReceiveData(USART1); //扔掉接收的数据
USART_ClearITPendingBit(USART1, USART_IT_ORE); //清溢出中断标志位
参考手册ISR寄存器:
位 3 ORE: 溢出错误
在RXNE=1 的的条件下(也就是上次数据还没有读走),串口接收寄存器又接收好
了一个字节的数据并准备往RDR 寄存器去转移的时候,会由硬件将这个位置1。
由软件向USART_ICR 寄存器的ORECF 位写1,可以清除这个标志。
如果USART_CR1 寄存器中的RXNEIE 位或EIE 位是1,就会产生中断请求。
0: 没有溢出错误
1: 检测到溢出错误
CR1中的RXNEIE已经使能,实际溢出发生时keil中观察ORE的确被置位为1。
然鹅,,,,,,,,
就算ORE置位为1,这个if语句也不通过。。。。。
后来网上找到这句话:
&ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE)
读到(没有使能USART_IT_ERR中断时)&
惊奇的发现还有USART_GetFlagStatus可以用!
USART_GetITStatus(USART1,USART_IT_ORE)这个函数在USART_IT_ERR未使能时并不能正确ORE的正确状态!!!!!!
可以使用USART_GetFlagStatus(USART1,USART_FLAG_ORE)读取,或者初始化时使能USART_IT_ERR。关于USART_IT_ERR在库函数中的定义:
(##) USART_IT_ERR: specifies the interrupt source for Error interrupt (Frame
error, noise error, overrun error)
补充一下这俩函数的区别(看库函数更直接):
IT主要就是与中断相关的,检查USART中断产生与否,当USART发送完成后会有USART_IT_TC中断,因此可以用来判断,而USART_GetFlagStatus是USART标志位设置与否,其中就有发送完成标志位USART_Flag_TC所以也可用来判断。而最终都是操作ISR寄存器
在上个月初意法半导体(ST)公布的截至日的第一季度财报上,ST宣布
2015年第一季度净收入总计17.1亿美元,毛利率为33.2%,每股净亏损0.03美元。虽然季节性需求疲软影响了传感器、功率及汽车产品的收入业绩......关键字:
意法半导体(STMicroelectronics,简称ST)与位于意大利的国际性科学技术研究机构&&意大利理工学院(Istituto
Italiano di
Tecnologia,IIT)宣布签订一份合作协议,双......关键字:
21ic讯 意法半导体发布新款STM32Cube&开发平台中间件,让开发人员可以在该开发平台上开发STM32 F2 120MHz ARM&
Cortex&-M3微控制器应用。STM32C......关键字:
我 要 评 论
热门关键词关于STM32的串口溢出中断
09:21:57来源: eefocus 关键字:&&&&
之前遇到问题:&中断处理函数中加了处理:if(USART_GetITStatus(USART1,USART_IT_ORE)&!= RESET)&&//产生溢出中断{&&&&&&&Utemp = USART_ReceiveData(USART1);&&&&&&&&&&&//扔掉接收的数据&&&&&&&USART_ClearITPendingBit(USART1, USART_IT_ORE);&&&&&&//清溢出中断}参考手册ISR:位 3 ORE: 溢出错误在RXNE=1 的的条件下(也就是上次数据还没有读走),串口接收寄存器又接收好了一个字节的数据并准备往RDR 寄存器去转移的时候,会由硬件将这个位置1。由软件向USART_ICR 寄存器的ORECF 位写1,可以清除这个标志。如果USART_CR1 寄存器中的RXNEIE 位或EIE 位是1,就会产生中断请求。0: 没有溢出错误1: 检测到溢出错误CR1中的RXNEIE已经使能,实际溢出发生时keil中观察ORE的确被置位为1。然鹅,,,,,,,,就算ORE置位为1,这个if语句也不通过。。。。。后来网上找到这句话:“ORE中断只能使用USART_GetFlagStatus(USART1,&USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)”惊奇的发现还有USART_GetFlagStatus可以用!USART_GetITStatus(USART1,USART_IT_ORE)这个函数在USART_IT_ERR未使能时并不能正确ORE的正确状态!!!!!!可以使用USART_GetFlagStatus(USART1,USART_FLAG_ORE)读取,或者时使能USART_IT_ERR。关于USART_IT_ERR在库函数中的定义:(##) USART_IT_ERR: specifies the
source for Error interrupt&&&(Frame , noise error, overrun error)&&补充一下这俩函数的区别(看库函数更直接):IT主要就是与中断相关的,检查USART中断产生与否,当USART发送完成后会有USART_IT_TC中断,因此可以用来判断,而USART_GetFlagStatus是USART标志位设置与否,其中就有发送完成标志位USART_Flag_TC所以也可用来判断。而最终都是操作ISR寄存器
关键字:&&&&
编辑:什么鱼
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
关注eeworld公众号快捷获取更多信息
关注eeworld服务号享受更多官方福利
热门关键词
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

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

 

随机推荐