历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2018年10月15日 | STM32中USART接收中断问题使单片机死机

发布者:phi31 来源: eefocus关键字:STM32  USART  接收中断  死机 手机看文章 扫描二维码
随时随地手机看文章

问题描述:

在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发送!问题就出来,不到1分钟时间,通讯没有反应了,死机了。USART配置代码如下:

void uart_config(void)

{

USART_InitTypeDef USART_InitStructure;

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_None;

USART_InitStructure.USART_Mode = USART_Mode_Rx

USART_Mode_Tx;

USART_InitStructure.USART_Clock = USART_Clock_Disable;

USART_InitStructure.USART_CPOL = USART_CPOL_Low;

USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;

USART_InitStructure.USART_LastBit = USART_LastBit_Enable;

USART_Init(USART1, &USART_InitStructure);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

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);

return;//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;

ucRS485Buff[ucRcePtr++] = USART_ReceiveData(USART1);

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

}

2.为什么会一直跑到接收中断?

断点之后发现(USART_GetITStatus(USART1, USART_IT_RXNE)==RESET的,也就是说没有数据接收到也进了中断,而且在USART配置中我也只打开了接收中断!没有数据送过来应该是不可能进入中断的!

3.响应了什么中断?

我想通过函数(USART_GetITStatus()把所有中断状态都读出来,但失败了,USART_IT_XXX所有中断状态都是RESET!也就是说没有中断也进入到这个中断服务程序来了!?

4.找资料

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);

return;//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;

ucRS485Buff[ucRcePtr++] = USART_ReceiveData(USART1);

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)读到.

以上来自http://blog.csdn.net/zyboy2000/article/details/8677256

本人对问题的解释是:

只要接收中断打开,即RXNEIE设置为1,那么ORE中断也会自动打开,ORE为溢出错误;当接收移位寄存器被传递到USART_RDR寄存器中将产生接收中断,RXNE会被硬件置1,当读取USART_RDR寄存器中的数据同时也会自动将RXNEIE清零。溢出中断的产生是当RXNE=1时(也就是上次数据还没被读取),串口接收寄存器又接收好了一个字节的数据并准备往USART_RDR寄存器去转移的时候,ORE标志位会被置1,而ORE标志位必须软件清零,由于代码代码中未对该标志位清零,所以单片机会在中断出死机。可适当添加相关函数清除标志位:

 if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
   USART_ClearFlag(USART2, USART_FLAG_ORE);
}
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}


关键字:STM32  USART  接收中断  死机 引用地址:STM32中USART接收中断问题使单片机死机

上一篇:STM32F4的USART6的LIN2.0和汽车Window Lifter driver通信
下一篇:STM32寄存器模板的创建问题

推荐阅读

在设计“单片机控制线路板”时,一般需有4部分电路:“电源电路部分”、“晶振电路部分”、“复位电路部分”、“下载电路部分”;对不同的“IC芯片”,工作所需“电源电压”各不相同,大多为“+3.3V”或“+5.0V”;“晶振电路部分”和“复位电路部分”也需根据“芯片”对应的“datasheet”进行设计,特别是“复位电路部分”,必须参考手册,确定“低电平复...
近日,在位于北京的信通院实验室,中兴通讯V2X-OBU(车载单元,V2X意为Vehicle to Everything,指在自动驾驶框架下汽车将与所有的道路参与者进行通信)完成了包含三大部分的V2X协议一致性(PC5接口安全、网络层和消息层的协议一致性)测试用例共66条,实验结果全部通过。这标志着,中兴通讯V2X-OBU通过了最关键的一个里程碑,已为10月上海“四跨”互联...
一群游泳者站在浅水区,在游泳池旁嬉戏,这只海豚看起来像在主题公园表演杂技的海豚,但不为人知的是,这个海洋生物竟然是机器人。“当我第一次看到海豚时,我认为它是真实的,”一位经过的游客说道。据外媒报道,这只机器人海豚是由美国工程公司Edge Innovations设计的,耗资2600万美元,该工程公司在加利福尼亚设有动画和特殊效果部门。它希望有一天可...
2021年10月13日-15日,全球领先的汽车与智能交通技术供应商博世在上海举办博世汽车与智能交通技术创新体验日。作为全球领先的汽车与智能交通技术供应商,博世带来了丰富的产品并展现了其在智能汽车、电动出行、自动驾驶等领域的技术积累。驾驶辅助升级版包含1个博世第五代前雷达、4个博世第五代角雷达、1个博世第三代多功能摄像头、1个辅助驾驶域控制器、...

史海拾趣

问答坊 | AI 解惑

哪位可以帮我设计一个测试电感同名端的电路

我的电感是用于高频变压器,其中震荡线圈只有8圈,是环行变压器。哪位大哥可以抛砖引玉给小弟指点指点啊!怎么可以设计一个简单的电路就可以测试同名端了…

查看全部问答∨

FreeRTOS资料小集

    刚才在网上找到一个FreeRTOS资料小集,看了一下,确实不错。赞美一下原作者。     LPC1434上可以运行FreeRTOS, 前面已经有人调试成功了。     特把FreeRTOS资料小集出来贴在这里供大家参考。 [ ...…

查看全部问答∨

中文的vs2005上装的ce编译出来的内核,启动很慢??为什么?

我用的是中文的vs2005,同事用的是英文的2005。编译同样的代码,我的系统启动就很慢,但是同事的就很快,真是奇怪了 配置的组件啥的都一样,很奇怪啊,希望给位帮忙分析一下,看下是哪里的问题?…

查看全部问答∨

关于片内64K程序与P2口

初次接触51,程序,数据,和IO空间没有分开,复用了,有点疑惑,对于AT89C51ED2这款MCU,使用其片内64KROM时,对P0,和P2口有什么限制,也就是说用了64k程序空间后,我还可以把P0,和P2口用于I/0口么?…

查看全部问答∨

protel如何清除template?

我在画原理图的时候,把template设成某个文档了。 然后在每个新建的文档中,都默认有所设文档中的内容。 点菜单中的清除,只能把当前文档的清掉。新建的还是有。 如何彻底清除呢?…

查看全部问答∨

WINCE6.0下如何进行快速编译

经过google,在ARM-WinCE老师的博客里面有如下描述: 在WinCE下面,创建工程,然后编译是需要花很长时间的。当我们第一编译完工程以后,如果需要改我们的驱动或者BSP,我们是不需要重新编译整个工程的: 1. 如果更改了driver,以WinCE6.0为例,我 ...…

查看全部问答∨

STM32助您轻松迈入32位单片机的世界/STM32-SKRMB138

2008-0515批量供货******************************一、寻找全国各地电子市场代理零售商,包括芯片零售和开发工具代理销售等,有意向请联系我。mxchip@163.com二、目前接受预订:http://www.mxchip.com/_shenqing/index.php?attrib************ ...…

查看全部问答∨

【招聘】 【上海】待遇:5k以上 单片机开发工程师

公司性质:创业公司工作地点:上海 徐家汇 招聘人数:1 学历:不限性别:不限待遇:5k或以上工作职责描述:1、在技术研发项目中,负责基于单片机的软件设计、电路设计;2、负责项目的技术文档编制等工作;任职资格要求:1、精通单片机编 ...…

查看全部问答∨

无线通信距离

最近接到一个项目,要用到无线通信模块。它的通信距离要达到500m以上  有哪位仁兄做过这方面的东西  或有什么好的想法没有  希望能给小弟好的建议…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved