发 帖  
原厂入驻New
[资料]

【每日一知识点】在STM32F1上用UART发送数据丢失最后一个字节,你知道怎么回事吗?

2021-3-23 10:23:24  512 单片机 STM32 UART 串口通信
分享
问题:
该问题由某客户提出,发生在 6 STM32F103VCT6 器件上。据其工程师讲述:在其产品的设计中要使用STM32 的 STOP 低功耗模式。而在使 STM32 进入 STOP 模式之前,需要对整个系统做一些设置工作,其中一项工作是通过 USART3 向某个功能模组发送一个命令报文。在实测中发现,该报文没有发全,总是缺少最后一个字节。
调研:
使用示波器观察 STM32 在进入 STOP 模式前从 USART3 发出的最后一个报文,确认的确缺少正常报文的最后一个字节。编写测试程序,每一秒钟从 USART3 发送一次该报文。借助 windows 的超级终端接收,经长时间观察,未见异常。修改其软件,将进入 STOP 模式的代码用 while(1)替代,如表(一)所示: 3-23-1.png
重新编译、执行。使用示波器观察,程序在执行到 while(1)之前,STM32 从 USART3 发
出的最后一个报文。结果显示,该报文是完整的,如图(一)所示:
3-23-2.png
修改代码,在 while(1)语句之前加一行对 GPIO 翻转的代码,如表(二)所示:
3-23-3.png
重新编译、执行。使用示波器观察,STM32 从 USART3 发出的最后一个报文与 PB7 上的信号的相位关系。结果表明,报文的最后一个字节发出之前,PB7 已翻转,如图(二)所示:
3-23-4.png
由此可以推断:运行原来的程序时,STM32 在未来得及从 USART3 上发出最后一个字节时,已进入了STOP 模式。检查其软件中,从 USART3 发送报文的代码,表(三)所示:
3-23-5.png
对其进行修改,将 USART_FLAG_TXE 替换为 USART_FLAG_TC,如表(四)所示:
3-23-6.png
重新编译、执行。使用示波器观察 STM32 从 USART3 发出的最后一个报文与 PB7 上的信号的相位关系。结果表明,在 PB7 翻转之前,报文的内容已全部发出,见图(三):
3-23-7.png
去掉程序中加入的调试代码,恢复进入 STOP 模式的功能,重新测试。STM32 在进入 STOP 模式之前,发出的最后一个报文是完整的。
结论:
错误使用 USART_FLAG_TXE 作为判断数据在 USART 上发送完成的依据,而导致最后一个字节的数据未及发出即进入了 STOP 模式。
处理:
将 USART_FLAG_TXE 换成 USART_FLAG_TC,作为判定数据在 USART 上发送完的依据。
建议:
在 STM32 状态寄存器 USART_SR 中有两个标志位是和数据发送的完成情况相关的:
3-23-8.png
1. TXE 发送缓冲区空标志
2. TC 发送完成标志
这两个标志的区别在于:它们分别表示数据在发送过程中,在两个不同的阶段中的完成情况。TXE 表示数据被从发送缓冲区中取走,转移到的移位寄存器中,此时发送缓冲是空的,可以向其中补充新的数据了。而 TC 则表示最后放入发送缓冲区的数据已经完成了从移位寄存器向发送信号线 Tx 上的转移。所以,判定数据最终发送完成的标志是 TC,而不是 TXE。

12312
6

本帖被以下淘专辑推荐:

分享淘帖1 显示全部楼层
· 2021-3-23 14:53:27
蔡琰老师这篇分享很干货
· 2021-3-23 19:26:53
好资料感谢分享
· 2021-3-24 22:10:56
蔡琰老师这干货分享的太精彩了   大恩不言谢

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发资料
关闭

站长推荐 上一条 /5 下一条

快速回复 返回顶部 返回列表