打印
[其他ST产品]

在STM32F1上用UART发送数据丢失最后一个字节,你知道怎么回...

[复制链接]
384|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2021-11-2 11:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
问题:
该问题由某客户提出,发生在 6 STM32F103VCT6 器件上。据其工程师讲述:在其产品的设计中要使用STM32 的 STOP 低功耗模式。而在使 STM32 进入 STOP 模式之前,需要对整个系统做一些设置工作,其中一项工作是通过 USART3 向某个功能模组发送一个命令报文。在实测中发现,该报文没有发全,总是缺少最后一个字节。
调研:
使用示波器观察 STM32 在进入 STOP 模式前从 USART3 发出的最后一个报文,确认的确缺少正常报文的最后一个字节。编写测试程序,每一秒钟从 USART3 发送一次该报文。借助 windows 的超级终端接收,经长时间观察,未见异常。修改其软件,将进入 STOP 模式的代码用 while(1)替代,如表(一)所示:
重新编译、执行。使用示波器观察,程序在执行到 while(1)之前,STM32 从 USART3 发
出的最后一个报文。结果显示,该报文是完整的,如图(一)所示:

修改代码,在 while(1)语句之前加一行对 GPIO 翻转的代码,如表(二)所示:

重新编译、执行。使用示波器观察,STM32 从 USART3 发出的最后一个报文与 PB7 上的信号的相位关系。结果表明,报文的最后一个字节发出之前,PB7 已翻转,如图(二)所示:

由此可以推断:运行原来的程序时,STM32 在未来得及从 USART3 上发出最后一个字节时,已进入了STOP 模式。检查其软件中,从 USART3 发送报文的代码,表(三)所示:

对其进行修改,将 USART_FLAG_TXE 替换为 USART_FLAG_TC,如表(四)所示:

重新编译、执行。使用示波器观察 STM32 从 USART3 发出的最后一个报文与 PB7 上的信号的相位关系。结果表明,在 PB7 翻转之前,报文的内容已全部发出,见图(三):

去掉程序中加入的调试代码,恢复进入 STOP 模式的功能,重新测试。STM32 在进入 STOP 模式之前,发出的最后一个报文是完整的。
结论:
错误使用 USART_FLAG_TXE 作为判断数据在 USART 上发送完成的依据,而导致最后一个字节的数据未及发出即进入了 STOP 模式。
处理:
将 USART_FLAG_TXE 换成 USART_FLAG_TC,作为判定数据在 USART 上发送完的依据。
建议:
在 STM32 状态寄存器 USART_SR 中有两个标志位是和数据发送的完成情况相关的:

1. TXE 发送缓冲区空标志
2. TC 发送完成标志
这两个标志的区别在于:它们分别表示数据在发送过程中,在两个不同的阶段中的完成情况。TXE 表示数据被从发送缓冲区中取走,转移到的移位寄存器中,此时发送缓冲是空的,可以向其中补充新的数据了。而 TC 则表示最后放入发送缓冲区的数据已经完成了从移位寄存器向发送信号线 Tx 上的转移。所以,判定数据最终发送完成的标志是 TC,而不是 TXE。

`














使用特权

评论回复
沙发
晓伍| | 2021-12-1 09:38 | 只看该作者
也就是时序的问题了是吗

使用特权

评论回复
板凳
tpgf| | 2021-12-1 09:40 | 只看该作者
讲解的非常的详细啊

使用特权

评论回复
地板
八层楼| | 2021-12-1 09:41 | 只看该作者
以后一定要注意着点

使用特权

评论回复
5
磨砂| | 2021-12-1 09:56 | 只看该作者
感觉这种问题不容易找到原因

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

395

主题

1520

帖子

1

粉丝