STM32串口通信的 USART_ClearFlag(USART1,USART_FLAG_TC); 添加后程序出现bug;( USART_ClearFlag(USART_TypeDef* USART)
引言:串口通信是一种很重要的通信方式,我在在平时制作项目的时候经常会使用到串口通信,有时候因为很多模块需要使用串口通信来实现和MCU的通信和数据传输,有时候在调试程序的时候需要用到串口使用printf()的重定向来对程序运行进行监视和调试,最近我在制作一个小项目的时候就遇见了一个问题,就是在串口中断函数中,当向上位机发送一个数据之后,如果此时调用库函数USART_ClearFlag(USART1,USART_FLAG_TC); 就会发现程序莫名其妙的发生故障,但是将这一句去掉之后程序就可以正常运行了,对于一个具有强迫症的我的说,就很无语也很不理解很想知道为什么会这个样子,接下来我们就来讨论一下串口中断中要不要添加USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);
一、拓展了解:
USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); 作用是清除相应的标志位,函数入口参数有两个,USART_TypeDef* USARTx和uint16_t USART_FLAG;
USART_TypeDef* USARTx: 是对应的串口号,比如这里是串口1,就写USATR1;(注意:串口四在STM32F103里是UART4,少了一个‘S’,具体怎么表示可以右键,go to difinition 进行查看;
uint16_t USART_FLAG:是清楚的标志位,有接受标志位、发送标志位等等,结合使用情况,同样右键+go to difinition 进行查看;
二、问题所在
之所以会有这样的问题,是因为在初学STM321系列开发板教程中所教的是在使用串口发送函数之后,需要调用标志位清楚函数将发送中断标志位清除,如下:
在理论学习中这样的方式是没有任何问题出现的,但是在实际项目中串口交换的数据就不是那么简单的单一数据的接收和数据发送了,数据量非常大。可是此时,当我按照上图例程里面的思路写好了串口中断函数,发现程序会出现运行的bug,会莫名的卡死!!
就在百思不得其解的时候我发现当我把USART_ClearFlag(USART1,USART_FLAG_TC)这一句去掉就可以正常运行程序了。下面是教学视频里的串口中断函数和例程里的中断函数对比:
例程中使用了USART_ClearFlag(USART1,USART_FLAG_TC);并且程序正常运行:
实际中需要这样处理,不能调用USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);否则程序混乱:(最后一行的注解表示不能添加的语句)
u8 RX_STA_DEMO; //接受标志位,第一个握手信号标志位0x80,第二个0x08
u8 RX_BUF_DEMO[USART_RX_LEN]; //数据存放数组,0x5a,0x5a为握手信号
void USART1_IRQHandler(void) //串口1中断服务程序
{u8 data_one=0;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾){data_one = USART_ReceiveData(USART1); //接收数据 if((RX_STA_DEMO & 0x80) !=SET) //没有接受完成数据则开始处理接收{if((RX_STA_DEMO & 0x40)) // 是否接收到倒数第二个握手信号0x0d{if(data_one == 0x0a) // 这一次是不是最后一个握手信号0x0a{ RX_STA_DEMO |= 0x80; // 是则标志位置1表示接收完成一组数据}else // 握手信号是错误的则数据错误RX_STA_DEMO &= 0x00; // 错误数据便清除标志位 }else if(data_one == 0x0d) //判断数据是不是倒数第二个握手信号0x0d{RX_STA_DEMO |= 0x40; // 是就第二个握手信号标志位置一}else{RX_BUF_DEMO[RX_STA_DEMO & 0x3F]=data_one; //不是握手信号则接收数据存放到BUFRX_STA_DEMO++; //统计接收数据的个数if(RX_STA_DEMO>USART_RX_LEN-1)RX_STA_DEMO=0;//超过最大数据,清零重新接收}}USART_SendData(USART1,data_one);while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);}
// USART_ClearFlag(USART1,USART_FLAG_TC); //不能加上这句!!!
}
三、总结
在参阅了其他各大STM32开发板教程,并结合实际使用情况后,最终得出结论: 在使用串口中断函数处理数据时,不用调用函数 USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG) 清除发送完成标志位,否则程序可能会发生异常混乱!
注:以上是我个人在项目中遇到的情况和总结,如果大家有什么问题或者了解具体原因的希望能在评论区留下指导建议,非常感谢!
STM32串口通信的 USART_ClearFlag(USART1,USART_FLAG_TC); 添加后程序出现bug;( USART_ClearFlag(USART_TypeDef* USART)相关推荐
- STM32串口通信配置(USART1+USART2+USART3+UART4) (转)
一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*====================================================================== ...
- STM32串口通信配置(USART1+USART2+USART3+UART4)
一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*====================================================================== ...
- STM32串口通信详解以及通信异常或者卡死常见问题分析
STM32串口通信详解以及通信异常或者卡死常见问题分析 目录 STM32串口通信详解以及通信异常或者卡死常见问题分析 一.常见的异常问题 二.STM32的串口简介 1.串口的通讯方式 ①按数据传输方向 ...
- STM32串口通信、串口调试助手
STM32系列博客: STM32学习之旅① 开发环境搭建 STM32学习之旅② 固件库的使用及工程模板的建立 STM32学习之旅③ 从点灯到代码移植 STM32学习之旅④ USART串口和上位机通信 ...
- stm32串口通信(初学者对于串口通信的理解)
stm32串口通信(初学者对于串口通信的理解) 标签: stm32串口通信单片机 2015-01-24 10:12 987人阅读 评论(0) 收藏 举报 分类: stm32 版权声明:本文为博主原创 ...
- STM32串口通信中使用printf发送数据配置方法 开发环境 Keil
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 已有 12456 次阅读2011-6-29 23:29 | 在STM32串口通信程序中使用printf发送数据, ...
- STM32——串口通信
STM32--串口通信 宗旨:技术的学习是有限的,分享的精神是无限的. 一.异步串口通信协议 STM32 的串口非常强大,它不仅支持最基本的通用串口同步.异步通信,还具有 LIN 总线功能(局域互联网 ...
- STM32串口通信(串口中断、FIFO机制)之安富莱代码学习笔记
创建串口设备结构体 typedef struct {USART_TypeDef *uart;/*STM32内部串口设备指针*/uint8_t *pTxBuf;/*发送缓冲区*/uint8_t *pRx ...
- 嵌入式作业(七):基于Ardunio的STM32串口通信
嵌入式作业(七) 0 作业要求 1 Ardunio 完成STM32的串口通信 (1)安装Ardunio IDE (2)stm32串口通信 2 基于串口通信的标准库与hal库的区别 (1)hal库 (2 ...
最新文章
- 2022-2028年中国工业4.0深度调研及投资前景预测报告(全卷)
- Prism安装、MVVM基础概念及一个简单的样例
- 2、Linux基础练习题
- 双绞线传输距离_详细了解弱电工程最常用到的网络传输介质:同轴电缆、双绞线、光纤...
- 构建高性能.NET应用之配高可用IIS服务器-第五篇 IIS常见问题之:工作进程回收机制(中)
- 2021河南高考成绩查询郸城一高,郸城一高在河南有多牛 2021年高考成绩
- imread函数 matlab_地理人,你会用Matlab吗?
- Windows Phone Developer Registration 开发人员无法连接注册解决
- 苹果Siri 部门前负责人加入微软人工智能部门
- 排序函数c语言流程图,各种排序的流程图 大家帮忙弄一下
- Vmware虚拟机使用Nat方式连接笔记本无线网卡
- 谈谈如何正确的送领土
- 我的世界java出生蘑菇岛,《我的世界》出生就有蘑菇岛和海底神庙的地图,附近还有村庄!...
- json格式转换工具包
- iOS13.3越狱插件推荐
- 熊克斐:技术夜未眠 从码畜到CTO
- ActiveX是什么?界面开发有哪些好用的ActiveX控件推荐?
- 浙江工商大学计算机技术专硕,浙江工商大学会计专硕(MPAcc)项目介绍
- 【HTML】07-表单
- Qt多线程http下载器之一:仿百度网盘的http下载器
热门文章
- ipaddress库:Python中网络地址的处理
- 服务器阵列卡安装win7系统,乐扩阵列卡IO-PCE9230-4IR组阵列方法和windows7系统安装到阵列组详细讲解(附视频) - 常见问题 - 技术支持 - 乐扩...
- 杀毒软件公司在网络上设置“诱捕蜜罐”
- 从零开始学Java编程语言 方法得当依然能学好
- 基于SSM小区智能物业管理
- 学习在UE中导入 Morph Targets 资源
- 青鸟迷你游戏平台:游戏点击率
- SAP MDG和SAP MDM的区别
- 【全文】工信部正式发布《公共互联网网络安全突发事件应急预案》
- 锂离子蓄电池充电方法