硬件环境: 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来进行捕获。
关键字:STM32F10x系列 UART 中断异常
引用地址:
STM32F10x系列UART中断异常调试经历
推荐阅读最新更新时间:2024-03-16 16:19
NO.12 MSP432进行串口通信
首先,我们要明白什么是串口通信。 串口指的是串行通信,要把CPU并行处理的数据转换成串行处理的数据进行发送。英文是UART。 关于串口使用其实非常简单,使用串口需要至少两台设备进行通信。每台设备要公地(一根线),有一个发送数据端口TX(一根线),有一个接收数据端口RX(一根线)。总共需要三根线进行数据传输。 其中TX只能用来发送数据,RX只能用于接收数据。假设我们有两台设备A和B,在AB之间实现串口通信需要将TXA和RXB连接,将RXA和TXB连接。简单说就是,你这个发送端发送的数据要送到人家接收端口,你的接收端口接收人家发送过来的数据。可以同时进行,这叫串口。两台设备要能够进行通信的话,一定要有相同的配置
[单片机]
一知半解学CubeMX——UART:Printf实现
一知半解学习环境: 1、CubeMX 4.23.0 2、uVision 5.14.2 3、MCU 启明 STM32F407 开发板(高配版) V3.1 一知半解学习目标: 1、掌握CubeMX下RCC以及SYS的相关配置; 2、掌握CubeMX下串口配置; 3、掌握Printf的实现套路; 一知半解实现过程: 1、配置系统调试接口及时基时钟源; 2、配置外部高速时钟源; 3、根据原理图配置对应串口(USART1); 4、配置时钟树; 5、配置串口参数,保持默认参数即可; 6、生成工程,并添加程序; 首先,打开工程,在usart.c文件的最后添加如下程序;
[单片机]
基于STM32的HAL库学习(2)UART串口学习
1、串口的模式有3种,一是查询模式,二是中断模式,三是DMA模式 HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制 HAL_UART_Receive();串口轮询模式接收,使用超时管理机制 HAL_UART_Transmit_IT();串口中断模式发送 HAL_UART_Receive_IT();串口中断模式接收 HAL_UART_Transmit_DMA();串口DMA模式发送 HAL_UART_Transmit_DMA();串口DMA模式接收 2、阻塞传输是调用这个函数并在等待时间内一直等待操作完成。 HAL_UART_Transmit HAL_UART_Receive
[单片机]
COTEX-M3中断和异常
中断和异常 ARMv7‐M 开创了一个全新的异常模型,CM3 采用了它。请你一定要划清界线:这种异常模型跟传统ARM 处理器使用的完全是两码事。新的异常模型“使能”了非常高效的异常处理。它支持16‐4‐1=11 种系统异常(保留了4+1 个档位),外加240 个外部中断输入。在CM3 中取消了FIQ 的概念(v7 前的ARM 都有这个FIQ,快中断请求),这是因为有了更新更好的机制——中断优先级管理以及嵌套中断支持,它们被纳入CM3 的中断管理逻辑中。因此,支持嵌套中断的系统就更容易实现FIQ。 CM3 的所有中断机制都由NVIC 实现。除了支持240 条中断之外,NVIC 还支持16‐4‐1=11 个内部异常源,可以实现faul
[单片机]
msp430f5529 uart pwm adc
//msp430f5529的串口使用程序使用示例 //--------------------------------------------- uart 头文件 -------------------------------------------------------------// #ifndef UART_H_ #define UART_H_ #include msp430f5529.h #include config.h //默认为115200 void USCIA0_Init(void); void USCIA0_SendChar(u8 c); u8 USCIA0_ReceiveChar(
[单片机]
MCU_S3C2410之UART分析
功能分析 寄存器分析 代碼分析 ///////////////////////////////////////////////////////////////////////UART 初始化///////////////////////////////////////////////////////////////////////////////////// void Uart_Init(int pclk,int baud) { int i; if(pclk == 0) pclk = PCLK; //APB IS USED FOR APB rUFCON0 = 0x0; //关闭UART0的FIFO rUFCON
[单片机]
msp430f5419/38学习笔记之USCI:UART模式
msp430f541x、msp430f543x多达4个通用串行通信接口(USCI)模块,支持多种串行通信模式,不同的 USCI 模块支持不同的模式。 USCI_Ax模块支持: UART模式; IrDA通信的脉冲整形; LIN通信的自动波特率检测; SPI模式; USCI_Bx模块支持: IIC模式; SPI模式; UART模式: 在异步模式下,USCI_Ax模块通过两个外部引脚UCAxRXD和UCAxTXD将芯片连接到外部系统。当UCSYNC 位清零时,选择UART模式。 UART模块特征包括: 带奇校验、偶校验或非奇偶校验的7或8位数据; 独立的发送和接收移位寄存器; 独立的
[单片机]
MB89P475的UART/SIO结构与应用
摘要:MB89P475是富士通公司生产的八位单片机。该单片机具有丰富的软、硬件资源和良好的EMC性能,可广泛应用于家电控制等产品中。该器件内含两路UART/SIO接口,非常适用于计算机集中控制和管理的多级通信控制系统中。文中介绍了该单片机的特点和UART/SIO结构,给出了MB89P475在LSP300型中央空调的计算机集控系统中的设计应用方法。
关键词:MB89P475;单片机;中央空调;计算机集控系统
MB89P475是富士通公司生产的F2MC-8L MB89470单片机系列产品。该产品具有丰富的软、硬件资源和良好的EMC性能,
而且其程序空间(16k%26;#215;8bits PROM)和数据空间(512%26;
[单片机]