STM32 HAL库关于串口中断烧录程序后可以正常运行,断电重启后无法进入中断的问题分析以及解决方法
1、情景描述:
最近在做一个项目,X86的上位机通过串口控制MCU,使用串口中断接收上位机数据时,MCU在上电的情况下烧录程序,可以正常接收上位机的数据,在断电重启后,一直进入不了中断回调函数,上电的情况是X86上电,MCU也同时上电。
2、原因分析:
造成这个的原因是因为硬件上电的时候,因为X86跟MCU是同时上电的,上电后会把串口的电平拉高,这个高电平触发了MCU的串口中断,导致MCU的串口中断误以为接收到了一个数据,例如 HAL_UART_Receive_IT(&huart1, (uint8_t *)Rx_buff, 5) 这里,上电后MCU误以为接收了一个数据,还剩下4个数据没有接收,然后上位机每次发送5个数据过来后MCU中断数据接收个数错误,所以一直无法进入中断回调函数。
我们看到 HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) ,里面的 RxXferCount 是告诉我们中断要接收的剩余数据量大小,根据上面举例子的话,上电时因为那个高电平的原因导致 RxXferCount 变成了4,如下图打印信息所示

接着我们重新看回 HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) 函数里的调用回调函数部分,下图所示,发现 RxXferCount 要为0的时候才会调用中断回调函数,依旧以上面例子说明,当MCU误以为上电时的高电平为数据时,上位机再发送5个数据下来,RxXferCount 就永远无法变成0,所以导致一直进入不了中断回调函数。

3、解决方法:
3.1软件解决方法
软件解决的时候,我们要知道导致这个问题的根源是 RxXferCount 这个值被误判了,所以我们只需要在上电的时候,对这个值进行修正即可;
首先我们定义一个标志位,用来标志MCU的状态是刚上电的状态
char uart_error_flag=;
接着我们编写函数对 RxXferCoun 值进行处理
/***
函数名:void uart_error(void)
说 明:解决刚上电时,由于串口电平拉高,导致串口中断误以为接收到了一个字节,
导致后面接收数据个数一直错误,无法进入中断回调函数问题
传入值:无
传出值:无
**/
void uart_error(void)
{
if( (huart1.RxXferCount < Rxdsize) && (uart_error_flag==) )
{
/*RxXferCount 告诉我们剩余空间大小,如果剩余空间和总空间不一样,则说明中断收到数据了*/
printf("huart1.RxXferCount = %d\r\n",huart1.RxXferCount);
uart_error_flag = ;
huart1.RxXferCount = ; //修改剩余空间,防止无法进入回调
}
}
最后我们在 main 函数里的 while 循环前调用即可
int main(void)
{ HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init(); //初始化打印信息串口
MX_USART1_UART_Init(); //初始化中断接收串口
HAL_UART_Receive_IT(&huart1, (uint8_t *)Rx_buff, Rxdsize); //打开串口中断接收
uart_error(); //处理上电时串口中断误判的问题
while ()
{
/* 注意要在中断回调函数里重新打开串口中断接收,否则串口中断接收只能接收一次 */
}
}
3.2 硬件解决方法
硬件解决方法比较粗暴,就是做一个电源延时电路,等X86重新上电后,再给MCU上电。
补充说明:
使用DMA接收时候不会出现这种情况,不过使用DMA接收,如果上位机发送数据过快,会出现数据粘包现象,例如上位机发送是数据一包是5个数据,如果上位机发送数据过快(20ms以内),MCU就好会把接收到的好几包数据当做一包数据来处理,例如把3包数据当做1包数据来处理,这样MCU就会误以为一包数据的15个了,出现误判的情况,不过它接收的数据是准确的,就是分包能力没有串口中断强。
STM32 HAL库关于串口中断烧录程序后可以正常运行,断电重启后无法进入中断的问题分析以及解决方法的更多相关文章
- STM32 HAL库 UART 串口读写功能笔记
https://www.cnblogs.com/Mysterious/p/4804188.html STM32L0 HAL库 UART 串口读写功能 串口发送功能: uint8_t TxData[10 ...
- STM32 HAL库之串口详细篇
一.基础认识 (一) 并行通信 原理:数据的各个位同时传输 优点:速度快 缺点:占用引脚资源多,通常工作时有多条数据线进行数据传输 8bit数据传输典型连接图: 传输的数据是二进制:11101010, ...
- (4)STM32使用HAL库实现串口通讯——理论讲解
一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...
- stm32 hal库串口通信资料汇集
串口的发送接收函数:HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制.HAL_UART_Receive();串口轮询模式发送,使用超时管理机制.HAL_UART_Transm ...
- 【情人节选帽子】TCS34725颜色传感器和Python图形界面编程(STM32 HAL库)
截图 描述: l STM32 HAL库编程 l 使用模拟IIC通信,方便程序移植 l Python界面编写,蘑菇头的帽子是什么颜色 l STM32 HAL库串口通信 l Python界面使用 ...
- 【有趣的全彩LED | 编程】用STM32 HAL库让WS2812B为你所动
一.效果展示 观看演示效果:https://www.bilibili.com/video/BV1dv411Y7x3 使用STM32 HAL库编程 PWM+DMA控制输出,CubeMX生成初始工程 实现 ...
- 【春节歌曲回味 | STM32小音乐盒 】PWM+定时器驱动无源蜂鸣器(STM32 HAL库)
l STM32通过PWM与定时器方式控制无源蜂鸣器鸣响 l STM32小音乐盒,歌曲进度条图形显示与百分比显示,歌曲切换 l 编程使用STM32 HAL库 l IIC OLED界面编程,动画实 ...
- stm32 HAL库笔记(零)
最近在设计四旋翼飞行器,用stm32f407,有三种开发方式可以选择:一.寄存器开发.二:库函数开发.三:HAL库开发,考虑了一下,选择了HAL库,原因如下: 1. 寄存器开发相对较慢,寄存器很多,配 ...
- STM32 HAL库详解 及 手动移植
源: STM32 HAL库详解 及 手动移植
随机推荐
- HDFS中NameNode发生故障没有备份从SecondNameNode恢复
1.Secondary NameNode目录结构 Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照. 在/opt/module/hadoop ...
- HDU.6186.CSCource.(前缀和数组和后缀和数组)
明天后天是南昌赛了嘤嘤嘤,这几天就先不更新每日题目了,以后补题嘤嘤嘤. 今天和队友做了一套2017年广西邀请赛,5个题还是有点膨胀...... 好了,先来说一下有意思的题目吧...... CS Cou ...
- Spark-Core RDD概述
一.什么是RDD 1.RDD(Resilient Distributed DataSet)弹性分布式数据集 2.是Spark中最基本的数据抽象 3.在代码中是一个抽象类,它代表一个弹性的.不可变的.可 ...
- HDU 1024 Max Sum Plus Plus (递推)
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- MFC框架各部分指针获取方式
MFC框架各部分指针获取方式 前人在CSDN总结的,曾经帮助过我,整理总结一下,希望也能帮助一下别人. 获得CWinApp 获得CMainFrame 获得CChildFrame 获得CDocument ...
- 《A chorus section detection method for musical audio signals and its application to a music listening section》
Abstract: 重复的副歌识别对音乐理解的计算模型(computational model)至关重要,应用层面有:音乐副歌识别预览,音乐检索等. 传统检测的难点:变调,起始点和结束点(both e ...
- 你浏览器的书签栏还够用么? - 程序员学点xx 特辑
lluxury 运维开发时间 为什么会想到这个话题,是因为最近看到的一条广告:注册 xx 送2048GB资料.yann 暗自感慨:"都9012年了,还有人分享家里的祖传硬盘".2T ...
- fanc委托在项目中使用
一,上代码 using System; namespace FuncDemo { class Program { static void Main(string[] args) { //无参数的fan ...
- 01-HTML控件
1.HTML (常用标签 网页的基本结构)2.CSS (常用样式 网页的显示效果)3.JavaScript (用户交互效果 动态效果)4.jQuery (JavaScript库 简化原生js操作)5. ...
- latex算法步骤如何去掉序号
想去掉latex算法步骤前面的序号,如下 我想去掉每个算法步骤前面的数字序号,1,2,3,因为我已经写了step.我们只需要引用a lgorithmic这个包就可以了,代码如下: \usepackag ...