STM32F103VCT6 UART发送丢失最后一个字节的问题解决
需积分: 5 43 浏览量
更新于2024-09-07
收藏 237KB PDF 举报
STM32F103VCT6在使用UART进行通信时遇到一个问题,即在进入STOP低功耗模式前,通过USART3发送的命令报文会丢失最后一个字节。这个问题经过一系列的测试和代码修改得到了解决。
在STM32微控制器的设计中,STOP模式是一种节能模式,允许设备在不需执行任何操作时降低功耗。然而,在进入STOP模式前,系统通常需要完成一些必要的设置,包括通过UART发送特定命令。在这种情况下,客户发现通过USART3发送的报文在到达最后一字节时出现问题,导致数据不完整。
初步调研显示,通过示波器观察到报文确实缺少了最后一个字节。尝试使用Windows超级终端进行长时间接收,没有发现类似问题,这表明问题可能与系统进入STOP模式有关。进一步的代码修改和测试揭示,当在进入STOP模式前加入一个GPIO翻转操作时,报文能够完整发送。这表明进入STOP模式的速度可能快于UART发送数据的速率。
原来的问题在于,代码使用了USART_FLAG_TXE标志来判断数据是否发送完成,而这个标志只表示数据已加载到移位寄存器,但并不意味着数据实际已经通过串口线传输。因此,STM32在数据尚未完全发送出去时就进入了STOP模式,导致最后一个字节丢失。
为解决此问题,代码被修改为使用USART_FLAG_TC(Transmit Complete)标志,这个标志表明数据不仅已加载到移位寄存器,而且已经成功发送完毕。应用这一修改后,报文在PB7翻转前能完整发送,从而在进入STOP模式前确保数据的完整性。
结论是,正确地使用USART_FLAG_TC作为数据发送完成的依据,而不是USART_FLAG_TXE,能避免在STOP模式启动前数据丢失。这为STM32开发者提供了一个重要教训,即在处理低功耗模式与UART通信的交互时,必须确保数据发送操作的完成状态。
建议使用STM32的开发者在处理UART发送时,要正确理解并使用状态寄存器USART_SR中的标志位,尤其是与数据发送完成相关联的USART_FLAG_TXE和USART_FLAG_TC,以确保数据完整无误地发送。在进入STOP模式或任何可能导致中断数据传输的操作前,应当等待USART_FLAG_TC标志置位,以确保所有数据都已发送完毕。
2021-01-04 上传
2022-07-14 上传
2014-04-15 上传
2018-12-13 上传
2023-07-28 上传
2023-09-12 上传
HankWong17
- 粉丝: 1
- 资源: 6
最新资源
- 构建基于Django和Stripe的SaaS应用教程
- Symfony2框架打造的RESTful问答系统icare-server
- 蓝桥杯Python试题解析与答案题库
- Go语言实现NWA到WAV文件格式转换工具
- 基于Django的医患管理系统应用
- Jenkins工作流插件开发指南:支持Workflow Python模块
- Java红酒网站项目源码解析与系统开源介绍
- Underworld Exporter资产定义文件详解
- Java版Crash Bandicoot资源库:逆向工程与源码分享
- Spring Boot Starter 自动IP计数功能实现指南
- 我的世界牛顿物理学模组深入解析
- STM32单片机工程创建详解与模板应用
- GDG堪萨斯城代码实验室:离子与火力基地示例应用
- Android Capstone项目:实现Potlatch服务器与OAuth2.0认证
- Cbit类:简化计算封装与异步任务处理
- Java8兼容的FullContact API Java客户端库介绍