STM32F103VCT6 UART发送丢失最后一个字节的问题解决
需积分: 5 11 浏览量
更新于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标志置位,以确保所有数据都已发送完毕。
962 浏览量
105 浏览量
118 浏览量
153 浏览量
481 浏览量
HankWong17
- 粉丝: 1
- 资源: 6
最新资源
- awesome-frontend:精选的很棒的前端资源列表
- 电脑软件m3u8-下载合并配合浏览器嗅探插件使用.rar
- fun-with-WebRTC-part-1:我关于 WebRTC 的文章的第 1 部分的代码存储库
- dCampTokyo2020:2020年东京d.camp研讨会工具
- vqa.pytorch:Pytorch中的可视问题解答
- 基于webpack 5 + lerna 的 可视化学习仓库.zip
- 蓝绿扁平化商务工作总结图表大全PPT模板
- 最近播放器指南针
- ADO_AOK_Demo_DEMO_AOK_Vc_
- grid-gmaps-box:用于 Google Maps API v3 的网格框
- myHtmlCssCourse
- Mockify-crx插件
- fpl_reader:foobar2000 .fpl播放列表阅读器
- 红色扁平化工作计划图表大全PPT模板
- 行进
- Day-24:第 24 天 @ironyard