STM32的USART发送数据时如何使用TXE和TC标志

文章详细解释了STM32的USART在发送数据时如何使用TXE和TC标志。TXE表示发送数据寄存器(TDR)是否为空,而TC表示数据是否已完全发送到TX引脚。程序可以利用这两个标志来优化数据发送,避免中断和确保数据流的连续性。文章通过示例和波形分析,说明了查询TXE和TC标志的不同效果,指出它们通常配合使用以平衡传输效率和精确的时序控制。
摘要由CSDN通过智能技术生成
8人从A出发去D旅游的故事

在这里插入图片描述

STM32的USART发送数据时如何使用TXE和TC标志

在这里插入图片描述

TXE为1:
TDR里的数据全部移到了移位寄存器,且没有新的数据TDR。
TXE为0:
TDR里有数据,未空,则TXE=0。
TC为1:
从TDR过来的数据全部被移送到TX引脚,且TDR里也没有新的数据
TC为0:
从TDR里过来的数据还没有全部移过来,或者之前TDR里的数据被移走了,但TDR里又来了新的数据

在这里插入图片描述
(这粗箭头和这细箭头,简直不要太形象哦,粗箭头是八位八位的传,细箭头是一位一位的传)

当USART_DR中的数据传送到移位寄存器后,TXE被设置,此时移位寄存器开始向TX信号线按位传输数据,但因为TDR已经变空,所以程序可以把下一个要发送的字节(操作USART_DR)写入TDR中,而不必等到移位寄存器中所有位发送结束,所有位发送结束时(送出停止位后)硬件会设置TC标志。

另一方面,在刚刚初始化好USART还没有发送任何数据时,也会有TXE标志,因为这时发送数据寄存器是空的。TXEIE和TCIE的意义很简单,TXEIE允许在TXE标志为’1’时产生中断,而TCIE允许在TC标志为’1’时产生中断。

至于什么时候使用哪个标志,需要根据你的需要自己决定。但我认为TXE允许程序有更充裕的时间填写TDR寄存器,保证发送的数据流不间断。TC可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序。

程序实例

只收到K
在这里插入图片描述
分析原因

在这里插入图片描述
上边程序,先发送H在发送K,中间没有时间间隔,当H在TDR寄存器时,又发送K就把H覆盖了, 最终只有K发送到了移位寄存器,发送到了TX引脚

解决办法

一、可以在两者之间加延时函数
二、FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
用TXE标志位
在这里插入图片描述在这里插入图片描述
用TC标志位

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

分析覆盖第一个字符原因

在这里插入图片描述

程序想要做的是先把第一个字符写到DR寄存器,然后用TC标志位来判断为0就循环,先把第一个字符发出去再发第二个,但是,TXE标志位的作用才是这样,TC可不是这样的,看寄存器手册,上电后TC的复位值为1,此时,程序先把第一个字符写入DR,但是还没来得及发送出去,接着调用TC标志位的函数,TC标志位的函数是先读SR,再写第二个字符,第一个字符能被覆盖了

在这里插入图片描述在这里插入图片描述
解决办法
在这里插入图片描述

补充

通过查询TXE和TC标志不停发送数据的情形,有无差别。假设8位字长,1个STOP位,1个start位,波特率一样,数据始终是0x55。在这里插入图片描述在这里插入图片描述
下面是同一UART的TX脚分别查询TXE和TC标志而测得的2路输出波形。
在这里插入图片描述在这里插入图片描述
然两种情形下,输出波形是有差异的。轮询TC标志时,发现字与字之间多了个近似于1个位的间隔(1位空闲帧);相比之下,而轮询TXE就发现数据非常连贯。因为查询TC的话,每次要等到每个字的数据全部移出移位寄存器后才去补充下一个数据,这样会导致一个小停顿。

查询TXE可以及时的补充数据,保证传输效率;查询TC可以确切知道数据发送出去的时间点。常常二者配合使用,这样既保证传输的效率又及时确切掌握数据传输结束的时间点。

补充部分原文链接:https://blog.csdn.net/u011511101/article/details/89816148

https://blog.51cto.com/u_15350455/5452621

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不熬夜,早点睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值