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

Alipay 支付唤起 h5 测试

测试地址 https://recharge.apps.oppomobile.com/recharge-center/recharge/?from=message try { //唤起客户端快捷参数 var data = {"requestType":"SafePay","fromAppUrlScheme":"alipays","dataString":"h5_ro...

六桥风月IT随笔 1万+

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

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

qq_66218338的博客 1753

Ubuntu20.04安全重启后WiFi图标消失?MT7922网卡驱动修复全攻略

本文详细解析了Ubuntu20.04安全重启后WiFi图标消失的问题,特别是针对MT7922网卡驱动失效的情况。通过诊断命令和分步解决方案,包括禁用PCIe ASPM、更新无线固件和升级HWE内核,帮助用户快速恢复网络连接。文章还提供了进阶排查技巧和系统优化建议,确保WiFi稳定运行。

weixin_29202687的博客 370

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

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

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

嵌入式环境下XML配置文件解析实践

在资源受限的嵌入式环境中,如何轻量级地解析XML配置文件成为关键。通过简化语法结构与优化内存使用,实现快速读取和解析配置文件,提升系统启动效率与稳定性。

weixin_31869917的博客 400

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

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

xiahailong90的博客 2万+

ClickHouse集群扩容实战:用clickhouse-copier搞定数据迁移与分片重平衡

本文详细介绍了使用clickhouse-copier工具实现ClickHouse集群从3分片到5分片的平滑扩容实战。通过分片级并行处理、原子性保证等核心机制,该工具能高效完成数据迁移与分片重平衡,同时保持服务连续性。文章涵盖集群拓扑规划、表结构检查、迁移配置、执行监控及迁移后优化等关键步骤,为大数据量场景下的ClickHouse扩容提供完整解决方案。

weixin_29091837的博客 294

网络安全 | 企业网络安全的十大挑战及解决方案

网络安全 | 企业网络安全的十大挑战及解决方案,随着信息技术的飞速发展,企业数字化转型进程不断加速,网络安全问题日益成为企业运营与发展面临的关键挑战。本文深入剖析企业网络安全的十大挑战,包括网络攻击日益复杂、数据泄露风险、内部威胁、物联网安全、云安全、合规性要求、移动办公安全、供应链安全、人才短缺以及安全预算有限等,并针对每个挑战详细阐述相应的解决方案,旨在为企业构建全面、有效的网络安全体系提供指导与参考,助力企业在复杂多变的网络环境中保障自身信息资产安全,实现可持续发展。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

STM32CubeMX-串口中断实验

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

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

Python 陌生代码库阅读之道:从零起步到一周掌控 5 万行老项目的实战策略

文中特别强调"自顶向下+画图+注释"的基础阅读心法,并提供了具体的代码示例和命令行技巧。对于大型项目,建议先建立核心流程的骨架认知,再逐步填充细节,同时注重文档化和测试覆盖率的提升。 掌握这套方法后,开发者可以将陌生代码库的阅读效率提升3倍以上,在一周内建立起对5万行级别项目的整体掌控力。

铭渊老黄 507

STM32 串口中断总结

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

richardgann的博客 5万+

PCL 切片法实现点云模型的体积测量、面积测量(二)

通过PCL VTK进行切片法,实现点云模型的体积测量、面积测量。

weixin_43896283的博客 1712

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

li348858320的博客 8024

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32串口之空闲中断

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

#elseif 1万+

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

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【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、付费专栏及课程。

余额充值