STM32 串口USART调试Error

发布者:tgdddt最新更新时间:2017-11-08 来源: eefocus关键字:STM32  串口  USART  调试Error 手机看文章 扫描二维码
随时随地手机看文章

关于stm32串口接收大量数据导致死机,即使加了看门狗也死机的情况,论坛上已有热心网友分享乐宝贵经验,至于效果,应该是有的。未能免俗,也来分享,狗尾续貂了。

原文网站:http://bbs.21ic.com/icview-160999-1-1.html 感谢这位网友分析问题。

首先,造成死机的原因多种多样,本人做的实验室用串口接收飞控数据,波特率57600。大量数据导致串口中断频繁,理想情况下,设置好中断优先级应该是可以有条不紊的处理数据。我遇到的情况是

1、  设置看门狗,只用定时器喂狗,main函数没有做任何处理,串口开了一段时间,main函数挂了,可是喂狗一直在跑,程序不复位,那也就说某些外设在不断的跑,或者跑飞,main函数回不来;

2、  第一种情况不会使程序复位,于是在main函数里边设置定时器的标志位,main函数处理之后,定时器才能喂狗,这种情况程序跑飞,喂狗便不成功,自动复位。

3、  两种情况都未能解决问题,于是只好模块测试,最后分析到时串口中断频繁,卡死在串口中断里面

找了网上资源,了解到的是串口数据频繁,会造成一个中断溢出现象,也就是说本次数据没有处理完成,下一次数据又进来了,导致所谓的溢出错误STM32 <wbr>串口USART调试Error

那么问题来了,按照常规思维,在初始化串口时,原本没有打开所谓的溢出错误中断,也就是ORE中断,为何会产生这个中断呢?看到数据手册,坑爹的逻辑来了,STM32 <wbr>串口USART调试Error

手册写的是你只要接收中断打开,即RXNEIE设置为1,那么ORE中断也自动打开了。

这不符合正常逻辑,于是乎在串口2中断里面应该做相应的处理,防止产生意想不到的中断,因此,中断函数应该写的严谨一些

void USART2_IRQHandler(void)

{

         uint8_t ch;       

                           

                   if(USART_GetFlagStatus(USART2, USART_FLAG_PE) != RESET) 

                   {         

      USART_ReceiveData(USART2); 

      USART_ClearFlag(USART2, USART_FLAG_PE);                 

                   } 

     

   if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET) 

    { 

     USART_ReceiveData(USART2); 

     USART_ClearFlag(USART2, USART_FLAG_ORE);

                  

   } 

    if (USART_GetFlagStatus(USART2, USART_FLAG_FE) != RESET) 

    { 

      USART_ReceiveData(USART2); 

      USART_ClearFlag(USART2, USART_FLAG_FE);

    } 

    

         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)

         {                                           

//               USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志

                   ch = USART_ReceiveData(USART2);

                    USART_ClearITPendingBit(USART2, USART_IT_RXNE);                

         }

}

因此,在中断里面,即使产生了所谓的溢出中断,也不会导致程序死在串口中断。

另一个是本人试验中犯的低级错误,串口接收使用的是循环数组接收,数组序号不断往上加,而在main函数中循环获取数据,那么问题来了。STM32 <wbr>串口USART调试Error

箭头里面的==号应该写为>= 这样防止变量++之后溢出而不归零,于是把这问题改了

STM32 <wbr>串口USART调试Error

在此之上,把 USART2_BUFFER_LEN调大,stm32内存大着呢,随便用,竟然神一般的好了,腰不疼,腿不酸,程序跑了一个多小时,还在!

以此分享,共同进步!


关键字:STM32  串口  USART  调试Error 引用地址:STM32 串口USART调试Error

上一篇:STM32单片机串口接收不定长无标志位字符串定时器判断结束
下一篇:STM32正交编码器驱动,引入(突变)带进位的位置环和速度环

推荐阅读最新更新时间:2024-03-16 15:43

STM32学习——内存管理实验
SD卡的内容啃了好久,终于要搞定了,在这之前先学习内存管理的知识。 内存管理,是指软件运行时对内存资源的分配和使用,本次介绍的是分块式内存管理。 内存管理分为内存池和内存管理表,内存池是由n个大小相等的内存块组成,对应的内存管理表表示该内存块是否被占用(0:未被占用;非0:已被占用),且它的数值为连续被占用的内存块数;假如为5,表示包括该内存块在内,共有5个连续的内存块被占用。 它的分配方向是由顶层向底层分配,即先分配第n个内存块,接着第n-1个。 在申请下一个内存时,一定要释放前一次的内存,否则会丢失内存资源。 将src指向的n个字节复制到des指向的地址中; 往s指向的地址中写入count个的c; 内存表与内
[单片机]
stm32地址空间
如图是一张stm32的内存映射图,其中代码区是从0x0800 0000开始的,他的结束地址是0x0800 0000加上实际芯片的flash大小,他的ram的起始地址是0x2000 0000,然后结束地址依然是加上芯片实际的ram大小。 附一张手册地址映射说明:
[单片机]
<font color='red'>stm32</font>地址空间
stm32 按键控制实验
一旦用到按键,一个关键的问题就是消抖,如果对这个问题不管的话,会引起很多难以控制的问题,最常见的就是反复进入中断导致程序飞出。 目前我手里的这款32有四个按键,上PA0是高电,左下右PE234是低电 操作步骤: 持续胡扫描key.c #include system.h #define KEY_LEFT_Pin GPIO_Pin_2 //定义K_LEFT管脚 #define KEY_DOWN_Pin GPIO_Pin_3 //定义K_DOWN管脚 #define KEY_RIGHT_PinGPIO_Pin_4 //定义K_RIGHT管脚 #define KEY_UP_Pin GPIO_Pin_0 //定义K
[单片机]
stm32 串口接收不定长数据 亲测可行
/**************** USART1中断处理函数******************/ void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET) { if(Rx_Counter 64) { Rx_buffer =USART_ReceiveData(USART1); //接收一字节数据存入数组中 } } else if(USART_GetITStatus(USART1,USART_IT_IDLE)!= RESET) {
[单片机]
SPI(STM32
SPI 是英语S erial Peripheral interface的缩写,是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI是一种高速的,全双工,同步的通信总线 Standard SPI, Dual SPI, Quad SPI Standard SPI: 标准SPI通常就称SPI,它是一种串行外设接口规范 CLK, /CS, DI, DO, /WP, /Hold 全双工模式,输入和输出可以同时进行(mosi,miso分别对应的是DI和DO) Dual SPI: CLK, /CS, IO0, IO1, /WP, /Hold 半双工模式,mosi和miso对应
[单片机]
UCOS2_STM32_任务间信号量通信(一)_ 应用实例描述
Ⅰ、写在前面 本文主要讲述UCOS2基于STM32硬件平台下,两个任务之间利用信号量进行通信实现的方法,具体实现原理将在后面文章讲述。 本文主要站在应用的角度来分析信号量通信,与芯片相关的底层这里不过多描述。本文虽然是STM32F1的芯片,但也适合其他芯片的学习(应用层)。 今天提供的工程代码也适用于STM32其他系列芯片(下载我前面移植好的其他系列工程,替换bsp和app下面相关文件就行。 当然,里面LED、按键和串口驱动如果不是对应的引脚,请适当改一下)。 与本文相关的UCOS移植和内核的讲述可以进入我微信公众号“历史消息”查看。 关于本文的更多详情请往下看。 Ⅱ、本文要点 1.软件工程源代码下载 我将今天所讲述内容源
[单片机]
UCOS2_STM32_任务间信号量通信(一)_ 应用实例描述
STM8 I口模拟串口通信
使用普通的IO口,模拟串口协议, 和PC端串口调试软件实现通信。 网上找了很多资料,有很多网友有些程序,但是感觉都不是很完整,无意间看到ST官方居然有实现,直接下载代码开始用。 针对官方的IO口模拟串口软件,简单介绍下用到资源。 由于模拟的串口RX脚,对于电平的输入判断用到定时器的输入捕获功能,所以官方用的是定时器3的通道2。 我自己在STM8S003F3P6最小系统上,移植到了TIM2的CH1即PD4用来做串口的RX脚,和PC端串口调试器的TX脚连接。 模拟串口的TX脚没有特殊要求,我这里用的PD3。。。。 修改了MAIN里面的函数,实现模拟串口直接发送接收到的数据。 PPS,关于串口波特率的配置,
[单片机]
TMS320C3X串口扩展技术
    摘要: 介绍了TMS320C3X DSP串口的一种扩展方法,给出该接口电路的Verilog HDL实现。该接口电路已被作者应用到实际系统中,仿真和实践证明该电路稳定可靠,具有一定的应用价值。     关键词: 数字信号处理器 硬件描述语言 接口电路 TMS320C3X是TI公司生产的第三代数字信号处理器,目前已相继推出C30、C31、C32和VC33等四种类型,由于其性价比高而被广泛应用于各个领域中。 TMS320C3X是一种32bit的浮点DSP,其程序、数据和外设地址都映射在同一存储空间,并有丰富的寻址方式和较大的寻址空间,因此对外设的访问非常灵活方便。但在实际应用中往往也要考虑一些不利
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved