STM32的USART中断死循环,形成死机。

直接说重点:我用的是 STM32F103 芯片 USART2_IRQHandler 总是中断,程序死循环。

1、出现问题:

原程序的中断处理程序是:

void 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);
     // do something at this;
  }
}

运行结果:程序开始是正常的,但运行一段时间后,会不断进入中断,USART_GetITStatus 检查又没有中断发生。本函数一退出就重新再进入,就这样死循环了。

2、原因分析:

查了若干资料,参考手册,如下:

(1)打开RXNEIE,默认会同时打开RXNE和ORE中断。

(2)必须第一时间清零RXNE,如没及时清零,下一帧数据过来时就会产生Overrun error!

(3)错误就是ORE导致的。

(4)解决办法要清除ORE

有了这个基础,直接上解决方案:

3、解决办法:

void USART2_IRQHandler(void)
{
  u8 key = 0;
  USART_ClearFlag(USART2,USART_FLAG_TC | USART_FLAG_ORE); //清除中断标志和ORE标志
  if(USART_GetITStatus(USART2,USART_IT_RXNE)!=Bit_RESET)//检查指定的usart是否发生了中断
  {
     key=USART_ReceiveData(USART2);
     // do something at this;
  }
}

改后程序就正常啦!!!

4、参考资料

《STM32串口中断卡死主循环问题分析》    http://blog.csdn.net/origin333/article/details/49992383

时间: 2025-01-02 14:39:43

STM32的USART中断死循环,形成死机。的相关文章

交换机死机,导致ceph ( requests are blocked ) 异常解决方法

问题描述: 万兆交换机死机后,导致在交换机上的ceph 的cluster网络会中断,用户正在对数据块的访问没有完成导致请求被blocked,同时部分pg会处于不同步状态,因此交换机重启后,通过ceph health会发现ceph集群不在OK 状态 health HEALTH_ERR 1 pgs inconsistent; 1 pgs repair; 2 requests are blocked > 32 sec; 1 scrub errorspg 6.89 is active+clean+inc

嵌入式/X86下linux系统死机及内存优化

一.  CPU 过高或死锁导致系统卡死 1. CPU占用过高 (1)开线程太多导致CPU占用过高,系统卡死 解决:优化应用层业务逻辑,有些业务不必开线程就不开 (2)频繁清缓存导致读spi-flash频繁,引起CPU过高 解决:在内核中文件系统部分进行处理,不去清缓存,然后在应用层用后台服务进程清缓存.这样可能导致系统内存不够用,这样就需要再对系统内存进行优化 2. CPU死锁 (1)Spinlock+死等导致死锁 (2)应用层pthread_mutex_lock死锁 3.  CPU过热导致系统

stm32之USART通信

任何USART通信,需要用到2个对外连接的引脚:RxD,TxD: RxD是输入引脚,用于串行数据接收: TxD是输出引脚,用于串行数据发送: SCLK引脚:发生器时钟输出(同步模式下,异步模式下不需要) 在IrDA模式(红外模式)下需要下列引脚: IrDA_RDI: 红外模式下的数据输入: IrDA_TDO:红外模式下的数据输出: 调制解调模式下需要: nCTS:清除发送: nRTS:发送请求: 数据的接收/发送过程示意图: 异步串行通信协议需要定义以下5个内容: 1.起始位 2.数据位(8/9

在使用Windows时防止电脑死机的技巧

一般情况下,我们新建某个快捷方式时,总会在图标左下角出现一个小箭头,很不美观,下面是去除这个小箭头的方法: 首先,单击"开始"按钮,选择"运行",在运行对话框中输入regedit命令后回车,即可进入注册表编辑器,选择HKEY_CLASSES_ROOT/lnkfile,在右边的窗口中找到字符串值"isshortcut",按DELETE键将其删除.然后,仍在HKEY_CLASSES_ROOT / 下找到piffile,同样在其右边窗口中将字符串值&q

USART中断接收程序

//usart.h #ifndef __USART_H__ #define __USART_H__ #include "stm32f10x.h" #include <stdio.h> void GPIO_Configuration(void); void NVIC_Configuration(void); void USART_Configuration(void); #endif //usart.c #include "usart.h" //加入以下代

linux系统死机分析及解决方法

一.常见死机原因 二.日志分析 日志系统,通过rsyslog.service服务进行控制,分别用于记录系统内核和各应用程序的日志信息.配置文件/etc/rsyslog.conf /var/log/messages    记录系统内核消息及各种应用程序的公共日志信息,包括启动.IO错误.网络错误.程序报错等,对于未使用独立日志文件的应用程序或服务,一般都可以从该文件获得相关事件的日志记录信息. /var/log/cron    记录crond计划任务产生的事件消息 /var/log/dmesg  

【转】ipad死机了,无法退出,也无法关机,怎么办

原文网址:http://zhidao.baidu.com/link?url=oTz6J78hmtCAKddhwu1ITUiPmLnVJIaA_v_0dZblPaIJUhuMdyTCdS6H2737GXyPo7HfHWbktKU_FjlxWg2pGK1vNcF1Knqe_08qTuoQ5Fu 1,当遇到ipad死机,开不了机,没有任何反应时,此时可以尝试将电源和主屏Home键同时按住,保持在10秒以上.看能不能强制重启. 2,如果强制重新启动成功的话,随后可以在屏上看到一个苹果标志.重新启动成功以

记录一次追查server死机&amp; 登录异常情况

linux 服务器死机了,于是追查原因. 查看boot.log [email protected]:/var/log$ less boot.log 看不出异常 显示开机信息 [email protected]:/var/log$ less dmesg 区别;(未明) /var/log/boot.log --- System boot log /var/log/dmesg --- print or control the kernel ring buffer /var/log/messages看看

服务器老是死机,重启后就可以了。。已解决

服务器没过多久又死机了,重启后又可以,开始以为是软件的问题,重装了干净的系统,结果没多久还是出现这个问题,在安装系统的时候非常缓慢,排除了软件问题,应该是硬件有问题了,内存.CPU经过替换法排查都没有问题,想到安装系统的时候非常缓慢,怀疑是硬盘有问题,下载了硬盘检测软件,结果一看,居然很多坏道,马上了一个新硬盘,后面再也没出现这种情况. 分析原因:硬盘有坏道,当系统读取到坏道的时候卡机或死机. 服务器老是死机,重启后就可以了..已解决,布布扣,bubuko.com