STM32串口一直进中断解决方法

解决STM32串口溢出中断问题(一直进中断服务函数) 现象:MCU为STM32L431,使用uCOS-III作为实时操作系统,使用串口接收升级数据包后,不能进行任务调度,发现程序没有跑飞,而是一直进入串口中断。串口的ISR寄存器如下: 串口中断服务函数的判断条件是: ```c if( SET == __HAL_UART_GET_IT_SOURCE(&huart[BLE_UART], UART_IT_RXNE)) { } 但是没有数据的情况下,也能进入,查看手册中串口中断描述: ![在这里插入图片描述](https://img-blog.c 阅读详情

今天在使用USART模块,遇到了一些问题并解决了,于是发贴共享。

问题描述:
在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!问题就出来,不到1分钟时间,通讯没有反应了。USART配置代码如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void uart_config(void)  
  2. {  
  3.     USART_InitTypeDef USART_InitStructure;  
  4.     USART_InitStructure.USART_BaudRate = UART_GetBaud(BaudRate);  
  5.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
  6.     USART_InitStructure.USART_StopBits = USART_StopBits_1;  
  7.     USART_InitStructure.USART_Parity = USART_Parity_No;  
  8.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
  9.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  
  10.     USART_InitStructure.USART_Clock = USART_Clock_Disable;  
  11.     USART_InitStructure.USART_CPOL = USART_CPOL_Low;  
  12.     USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;  
  13.     USART_InitStructure.USART_LastBit = USART_LastBit_Enable;  
  14.     /* Configure USART1 */  
  15.     USART_Init(USART1, &USART_InitStructure);  
  16.     /* Enable USART1 receive interrupt */  
  17.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  
  18.     /* Enable the USART1 */  
  19.     USART_Cmd(USART1, ENABLE);  
  20. }  

分析问题:

1.为什么没有通讯了?
通过仿真器仿真,发现程序一直进入接收中断中,由于我没有使用中断发送,于是程序就死在了接收中断,也就没有数据发送到电脑上来。接收中断代码如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void UART_Receive(void)  
  2. {  
  3.    //正在处理上一条通讯,接收到数据不处理  
  4.     if(bRecieveOK)  
  5.     {  
  6.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
  7.             USART_ClearITPendingBit(USART1, USART_IT_RXNE);  
  8.         return;//processing receive data,don't receive again  
  9.     }  
  10.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
  11.     {  
  12.         if(MoudBusExpir == 0)  
  13.         {  
  14.             ucRcePtr = 0;  
  15.             MoudBusExpir = 20;//50ms  
  16.         }  
  17.         else  
  18.             MoudBusExpir = 20;  
  19.         /* Read one byte from the receive data register */  
  20.         ucRS485Buff[ucRcePtr++] = USART_ReceiveData(USART1);  
  21.         /* Clear the USART1 Receive interrupt */  
  22.         USART_ClearITPendingBit(USART1, USART_IT_RXNE);  
  23.     }  
  24. }  

2.为什么会一直跑到接收中断?
断点之后发现(USART_GetITStatus(USART1, USART_IT_RXNE)==RESET的,也就是说没有数据接收到也进了中断,而且在USART配置中我也只打开了接收中断!没有数据送过来应该是不可能进入中断的!

3.响应了什么中断?
我想通过函数(USART_GetITStatus()把所有中断状态都读出来,但失败了,USART_IT_XXX所有中断状态都是RESET!也就是说没有中断也进入到这个中断服务程序来了!?

4.找资料
STM32F10x微控制器参考手册(2009年12月第10版)P541发现如下说明:

也就是说只要接收中断打开,即RXNEIE设置为1,那么ORE中断也自动打开了。
可是USART_GetITStatus(USART1, USART_IT_ORE )== RESET!!!!
找到USART_GetITStatus(USART1, USART_IT_RXNE)函数,发现只有当USART_IT_ERR中断使能时,才能读到ORE中断。
在这里要指出这个BUG:产生ORE中断了,但使用USART_GetITStatus()函数却无法读到这个中断被SET起来!

5.把ORE中断标志位清除
既然找到了是什么中断,那么把相应的中断标志位清除,就应该可以了吧?
USART_ClearITPendingBit(USART1, USART_IT_ORE);
但是,结果是没有任何效果!清除之后,马上读ORE中断状态,USART_GetITStatus(USART1, USART_IT_ORE)==RESET.程序仍然跑死在接收中断。再使用另一个函数USART_GetFlagStatus(USART1, USART_FLAG_ORE) = SET,原来ORE标志位还没有清除。

6.问题解决
为什么清除不掉?头疼了,再找找资料,有发现,在P523页如下图:


接收中断程序改为(注意这一句://注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断):

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void UART_Receive(void)  
  2. {  
  3.     if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断  
  4.     {  
  5.         USART_ReceiveData(USART1);  
  6.     }  
  7.    //正在处理上一条通讯,接收到数据不处理  
  8.     if(bRecieveOK)  
  9.     {  
  10.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
  11.             USART_ClearITPendingBit(USART1, USART_IT_RXNE);  
  12.         return;//processing receive data,don't receive again  
  13.     }  
  14.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
  15.     {  
  16.         if(MoudBusExpir == 0)  
  17.         {  
  18.             ucRcePtr = 0;  
  19.             MoudBusExpir = 20;//50ms  
  20.         }  
  21.         else  
  22.             MoudBusExpir = 20;  
  23.         /* Read one byte from the receive data register */  
  24.         ucRS485Buff[ucRcePtr++] = USART_ReceiveData(USART1);  
  25.         /* Clear the USART1 Receive interrupt */  
  26.         USART_ClearITPendingBit(USART1, USART_IT_RXNE);  
  27.     }  
  28. }  

总结:
注意问题: 1.USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中断,那么ORE中断也同时被开启了。
               2.ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)

BUG建议: 1.在STM32库中,能不能修改USART_GetITStatus()函数对USART_IT_ORE中断的处理? 也就是我只要打开了接收中断,那么有ORE中断时,我也能使用USART_GetITStatus(USART1,USART_IT_ORE)读到.
       其它:在找资料的同时,发现STM32F10x微控制器参考手册(2009年12月第10版)中文翻译P538有错误,如下图:


英文P696如下图:






我很会写BUG ——第一篇,STM32中断函数的重复定义 今天配置Usart.c和Usart.h串口通讯文件时编译后报错。 Error: L6200E: Symbol USART1_IRQHandler multiply defined (by usart.o and stm32f10x_it.o). Not enough information to list image symbols. Not enough information to list load addresses in the image map. 经过了漫长的检查,发现程序本身的编写. 阅读详情

相关推荐

STM32的USART串口通讯程序

文章目录 文章目录文章目录寄存器与固态库一、了解串口通信及准备工作1.串口通信简介2.STM32 的 USART 简介3.实验环境二、USART串口实验总结 寄存器与固态库 基于寄存器与基于固件库的stm32 LED流水灯例子的编程方式差异比较: 1、基于寄存器方式的开发特点: (1)具体参数更直观; (2)程序运行占用资源少。 (3)寄存器更贴近底层,对外设的工作原理和运行机理会有更深的理解 (4)寄存器版式直接对内部寄存器进行操作,需要我们对寄存器非常熟悉 它的缺陷也不可忽视,如下: (1)开发速度

big_west的博客 6233

USART1_IRQHandler 函数

到了这一步,就说明这一串数据已经完完全全的接收完了USART_RX_STA = 1100 0000 0000 0100,最高位为1:代表接收到了0x0a,第十四位为1:代表接收到了0x0d,第0位到第13位为4,代表接收到了4位有效数据(a、b、c、d)我们可以清晰的看到bit13~0位是4,代表接收到了4个数据(a,b,c,d),第14位为1,是因为接收到了数据0x0d,也和最上面给的表对上了,然后程序向下执行,接收到了0x0d(回车),那下一个就是接收0x0a(换行)了。...

C语言学习 1万+

stm32cubemx下stm32中断与串口DMA通信

一、外部中断知识点 二、外部中断,实现LED亮熄 1.创建工程

qq_60678931的博客 4345

正点原子STM32-串口中断服务函数USART1_IRQHandler关于USART_RX_STA的学习笔记

正点原子STM32-串口中断服务函数USART1_IRQHandler关于USART_RX_STA的学习笔记

weixin_51361165的博客 1万+

STM32 不断进入串口中断问题 解决方法

本文主要阐述如何解决STM32 不断进入中断,却无数据,无法清除中断的问题

LingYiZhangFanKai的专栏 1万+

STM32的CubeMX关于串口中断接

作为刚工作不久的小白,刚接触STM32的HAL库,工作中使用到了,就记录下自己遇到的问题,希望看到的大佬多多指教。 1、关于串口的初始化函数:     MX_USART2_UART_Init()---波特率、奇偶校验等配置             HAL_UART_Init()---会将 huart->RxState = HAL_UART_STATE_READY;     HAL_U...

qq_41092963的博客 9529

STM32使用SRAM方式仿真不进串口中断的解决方法

在时钟设置语句中或在main.c初始化语句中加入:    NVIC_SetVectorTable(0x20000000,0x0); 原理是让中断向量表映射到SRAM中。

boyfig的博客 1692

AD620仪表放大器模块实战:从双电源切换到单电源供电的完整指南(附原理图)

本文深入探讨了AD620仪表放大器模块从双电源切换到单电源供电的常见陷阱与正确方案。通过解析AD620的内部架构与电气特性,指出其“天生”依赖双电源,简单的跳线改装会导致芯片损坏或失效。文章提供了基于AD623芯片的真正单电源替代方案,并附有原理图与实战波形对比,为便携式设备设计提供了完整指南。

weixin_29231027的博客 372

STM32串口空闲中断 上电就进IDLE(空闲中断)分析及解决方法

/使能串口空闲中断。在配置stm32f0单片机串口DMA空闲接收时,发现程序一上电就会跳入中断函数(没有发送数据)将以下两行配置代码置于配置最末端(即初始化所有串口相关功能后再开启中断和使能串口)USART_Cmd(USART1, ENABLE);查找帮助时发现了一篇文章。

qq_66218338的博客 1753

【AI基础学习系列】二十一、一文搞懂GPT

本文系统介绍了GPT(Generative Pre-trained Transformer)模型的核心内容。首先阐述了GPT的本质是基于Transformer的预训练语言模型,其创新在于使用单向Transformer编码器。其次详细解析了GPT架构,包括输入层的Tokenization和Embedding处理、Transformer解码器堆叠的核心组件(自注意力机制、前馈神经网络等)以及预训练和微调两阶段训练过程。接着说明了GPT的工作原理:通过无监督预训练学习语言统计规律,再结合有监督微调适应具体任务。

ASH_GUARDIAN的博客 1688

lofar谱 matlab_一种用于分类识别的线谱增强及特征提取方法与流程

本发明属于声信号处理技术领域,具体涉及一种用于分类识别的线谱增强及特征提取方法。背景技术:水下声音目标的被动探测和识别领域中,利用舰船辐射噪声对舰船类型进行识别是十分常见的。舰船辐射噪声通常由机械噪声,螺旋桨噪声和水动力噪声三部分构成,前两种信号是噪声的线谱和连续谱的主要来源。其中线谱由于具有较高的信噪比,并且携带着声源特征信息,而被广泛研究和应用。但是目前的识别方法中,因为连续谱信息缺乏较为明确...

weixin_39517859的博客 5476

STM32 HAL 库串口 DMA + 空闲中断接收不定长数据:从原理到排查“上电误进 IDLE“

本文提出了一种基于STM32的嵌入式串口通信优化方案,通过DMA+串口空闲中断(IDLE)实现不定长数据的高效接收。相比传统定长轮询或逐字节中断方式,该方案在115200波特率下可实现零丢帧率,CPU占用率从38%降至1%以下。文章详细解析了IDLE中断的触发机制(总线空闲超过1字节时间即86.8μs),给出了CubeMX配置要点和核心代码实现,并重点解决了"上电误触发IDLE中断"的常见问题。实测表明,该方法能稳定处理1-512字节随机长度数据,帧结束检测延迟仅87.2μs,为高波特率大数据量场景提供了可

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 876

告别Keil4!手把手教你用Keil C51 V9.61编译51单片机代码(附最新激活方法)

本文详细介绍了Keil C51 V9.61在51单片机开发中的全栈升级指南,包括编译速度提升、调试器性能优化和现代开发支持等核心优势。通过智能安装方案、项目迁移实战和新特性深度应用,帮助开发者告别Keil4,大幅提升开发效率。附有最新激活方法和实用技巧,适用于嵌入式开发工程师。

weixin_26886855的博客 421

STM32串口中断卡死主循环一直进中断问题分析

在一项目中,使用STM32作为主控,程序运行一段时间后概率出现主循环卡死现象。 问题分析如下: 1、程序USART2不停接收并处理串口数据,波特率115200; 2、主循环卡死; 3、USART1中断及TIM2中断响应函数运行正常;(USART1及TIM2中断优先级均比USART2高) 4、出现现象后,拔掉USART2的接收数据线,现象不能回复正常; 5、出现现象后,拔掉后再插入US...

xiahailong90的博客 2万+

偏最小二乘结构方程(PLS-SEM)_TomatoSCI分析日记

①模型整体拟合指标(Goodness-of-Fit, GOF),这个可以看做整体的R方了,上限是1;②指标载荷的具体值;然而,当数据中包含潜变量(即由多个观测指标组合而成的综合概念)时,贝叶斯结构方程不太适用。指标过少(1-2 个)会削弱潜变量的解释力,而指标过多可能增加噪声,影响模型稳定性。如果指标较多,可考虑进一步划分潜变量,但应确保每个指标有意义。掌握这两类方法后,在处理多变量、因果或路径分析研究时,可以根据数据特点与研究需求灵活选择。对于一般的多变量研究,这两类结构方程均为常用且有效的分析方案。

qq_44684643的博客 2011

如何找回mysql删除的表_mysql误删表如何恢复,恢复被删除表的步骤说明

小编寄语想必大家都知道,Oracle ACE李真旭(Roger)是国内最专业的Oracle 数据库恢复专家。但知识都是触类旁通,真正的专家,从来不会局限在一个方向上。今天分享的内容,是他在MySQL数据恢复上所做的尝试。本文主要分享在没有备份的情况下,MySQL数据库如何恢复被删除的表。包含两个主要的场景:1、drop table后的恢复2、truncate table后的恢复正文:我们都知道,M...

weixin_35725389的博客 6784

STM32CubeMX-串口中断实验

文章目录STM32CubeMX笔记-串行口中断接收一、初始准备1.硬件平台2.软件平台二、操作步骤1.CubeMX生成初始化代码2.Keil编写串口中断回调函数3.程序下载,观察现象三、源码仓库 STM32CubeMX笔记-串行口中断接收 一、初始准备 1.硬件平台 使用正点原子STM32F4探索者 2.软件平台 STM32CubeMX软件平台 Keil5软件平台 STM32CubeProgrammer下载平台 二、操作步骤 1.CubeMX生成初始化代码 芯片选择 打开cube软件,点击MCU选择

嵌入式学习记录站点 1万+

8、干式变压器

干式变压器的发展,是人类不断挑战材料科学和热物理极限的过程,每一次技术突破,都是在。温度升高,ε_r反而下降(因为分子活动性增强,极化响应变慢)。:固体导热的热阻比液体对流大一个数量级,这是无法逾越的物理规律。Nomex在高温下不是逐渐分解,而是保持性能直到一个临界点。如果 T_a = 40°C,则 T_c = 146.7°C。干式变压器(固体介质分隔):热场、电场、流场(空气)形成三维氢键网络,即使在高温下也能保持机械强度。:不是在现有技术上修修补补,而是寻找新的。仍在H级绝缘允许范围内(≤180°C)

renpeng2692873032的博客 228

STM32 串口中断总结

本文以USART1为例,叙述串口中断的编程过程。 1、先来讲述一下在应用串口中断时涉及到的一些库文件。 首先对于STM32外设库文件的应用编程,misc.c和stm32f10x_rcc.c是肯定要添加到。 接下来就是我们要用到的相关外设了。毫无疑问,串口文件stm32f10x_usart.c是必须的。串口通信是对通用GPIO端口引脚的功能复用,所以还需要stm32f10x_gpi

richardgann的博客 5万+

龙芯2K1000 OTG双模驱动深度解析

是Synopsys公司开发的USB 2.0 OTG控制器IP核,龙芯2K1000内置该IP,作为唯一的OTG控制器(PCI Dev4 Func0),物理基地址0x40000000。核心能力:同时支持Host主机模式(接U盘/键盘)、Device设备模式(虚拟串口ttyGS0)、OTG双模自动切换速率驱动路径:内核源码PMON:启用otg0设备树内核:开启HOSTPERIPHERALG_SERIAL启动参数脚本:sysfs角色切换+开机自启Host按以上配置,龙芯2K1000 DWC2 OTG可完美实现。

weixin_44932366的博客 376

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

STM32串口中断卡死主循环一直进中断问题

这篇STM32串口中断卡死问题 原作者写的太好了,特意转载一下 在一项目中,使用STM32作为主控,程序运行一段时间后概率出现主循环卡死现象。 问题分析如下: 1、程序USART2不停接收并处理串口数据,波特率115200; 2、主循环卡死; 3、USART1中断及TIM2中断响应函数运行正常;(USART1及TIM2中断优先级均比USART2高) 4、出现现象后,拔掉USART2的接收数据线,现象不能回复正常; 5、出现现象后,拔掉后再插入USART2的接收数据线,现象不能回复正常; 6

li348858320的博客 8024

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32串口之空闲中断

背景 在做Nbiot的一个路灯项目,NBiot模块一般都是串口接口,使用AT指令集,对接中国移动onenet平台。先用串口助手去测试,流程测试OK之后需要在MCU上重新写一遍。一开始用的STC15系列的MCU,然后跟平台之间对接协议很多,代码量较大,所以换到了STM32F1系列的MCU。 在STC15MCU上面通过串口接收数据只能老老实实用接收中断来做,每接收一帧数据都需要判断帧头帧尾,一帧结束再处理。之前就听说过STM32串口上面有帧中断,一直没有用过,然后才有了这篇博...

#elseif 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【STM32的HAL库开发】CubeMX配置HAL库,不进串口中断的问题

【STM32的HAL库开发】串口中断开发环境在main.c添加代码(1/2)在stm32f4xx_it.c添加代码(2/2)注意附代码 开发环境 cubemx V5.5.0 + MDK Keil V5.29.0.0 + STM32F429NIH 在main.c添加代码(1/2) 在main函数中,初始化uart后执行 ==__HAL_UART_ENABLE_IT(&huart1,UART_...

qq_41100189的博客 8922

STM32的串口中断详解

中断配置 使能接收中断 中断服务函数 1. 中断服务函数名称查找 2. 中断服务函数 3. 可以选择的串口中断类型 此处定义 其他文件中的声明 extern u8 USART_RX_BUF[USART_REC_LEN] 最大接收字节数 extern u16 USART_RX_STA 接收状态标记 extern u16 USART_RX_STA bit15 bit14 bit13~0 接收完成标志 接收到0x0D标...

Code for Coffee 1万+
上一篇: stm32L151串口中断假如发送一个字节0x36,串口中断总是接收到0x00,连续点击几次发送,才能接收到0x36
下一篇: java16进制字符串与字符串互相转换
小白study
博客等级 码龄12年 659粉丝 25原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值