STM32F10x系列UART中断异常调试经历

硬件环境: 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来进行捕获。

    

你可能感兴趣的:(STM32)