历史上的今天
今天是:2024年12月03日(星期二)
2018年12月03日 | STM32F10x系列UART中断异常调试经历
2018-12-03 来源:eefocus
硬件环境: STM32F105RCT6
软件环境:FreeRTOSV8
问题描述:采用中断方式接收数据,然后将收到的一帧数据放入消息队列,然后有专门的一个任务用来从消息队列中取数据并处理。jlink调试以及烧录运行都是可以的,但是当随着通信频率的增加以及运行时间的加长,系统会出现“死机”(即,不停的进入中断而致使主程序流程无法执行);
问题分析:根据现象猜测 1、是否为堆栈溢出了呢? 2、是否频率太高了呢? 3、是否标志位忘记没有清除呢?
然后逐项进行测试:
1、查htm文件确定大概需要的堆栈,发现确实存在溢出的可能:

而我分配的为:然后更改为0x00000800,烧录测试,还是存在同样问题,然后在调试串口中增加命令,来通过命令交互读取各任务运行时占用的堆栈,占用堆栈获取采用:uxTaskGetStackHighWaterMark(),发现并没有任务的堆栈随着时间推移而增加,所以暂时排除堆栈溢出的原因。
2、将发送频率降低然后长时间运行,400ms的发送频率(UART配置的波特率为9600,数据帧长度为8字节),烧录运行后大约1小时后就有可能复现问题。所以觉得应该是别的地方还是存在问题,频率过高并不是导致该问题的根本原因,高频率只是让问题更容易出现。
3、将所有的串口错误的中断检测均加上,看是哪儿出现了异常,中断捕获采用USART_GetITStatus,在捕获到中断后,清楚中断置位,发现长时间运行后还是不停进入中断,但是USART_GetITStatus检测到的所有中断位均是reset,为什么会一直进入中断呢,即使已经不发送数据了,然后想到可以通过USART_GetFlagStatus来检测;将所有的检测错误的方式均换成USART_GetFlagStatus,发现存在ORE中断置位,然后在结果为set时,清除置位;长时间运行程序,OK,问题没有复现。发送频率改为10ms,运行一晚上问题没有复现,到此问题得以解决。
结论:在使用串口中断接收数据时,ORE中断应通过USART_GetFlagStatus来进行捕获。
史海拾趣
|
一个单片机应用系统的硬件电路设计包含两部分内容:一是系统扩展,即单片机内部的功能单元,如ROM、RAM、I/O、定时器/计数器、中断系统等不能满足应用系统的要求时,必须在片外进行扩展,选择适当的芯片,设计相应的电路。二是系统的配置,即按照系 ...… 查看全部问答> |
|
用VS2005调试的wince应用程序,在开发板上运行的时候出现如下错误: 致命的应用程序错误 应用程序test.exe执行了一个非法操作,将被关闭。若问题持续出现,请与供应商联系。 程序:Test.exe 异常:0xc00000FD 地址:00011860 问题出现在哪呢 ...… 查看全部问答> |
|
MTK6225 手机开发板(含源代码) 有诚意者请联系 Qq:296662705 硬件特性: 1、 CPU:mtk6225 2、 TFLASH 卡接口 3、 176X220 2.6寸TFT LCD,最高支持320*240*16的TFT LCD 4、 4线触摸屏接口 5、 双声道音频输出 6、 一个Camera 130万像素 ...… 查看全部问答> |
|
LM386电源电压4--12V,音频功率0.5w。LM386音响功放是由NSC制造的,它的电源电压范围非常宽,最高可使用到15V,消耗静态电流为4mA,当电源电压为12V时,在8欧姆的负载情况下,可提供几百mW的功率。它的典型输入阻抗为50K。特性(Features): 静态 ...… 查看全部问答> |
|
嵌入式系统的发展促进 了智能设备的网络化, 针对家庭智能化 问题 , 提出了智能家居系统的应用模型, 设计了一种基于MS P 4 3 0 F 1 4 9单片机的具有网络接口的智能设备控制器, 分析其硬件接 口电路 、 软件层次结构和应用软件开发方法, 实现了 ...… 查看全部问答> |




