当前位置:首页 > 单片机 > 单片机
[导读]关于ST MCU的USART传输,经常会有人围绕TXE/TC的使用产生些疑惑,或者因为二者的应用产生些问题。这里抽空稍加整理与大家分享交流下。一、关于TXE、TC标志的基本概念和理解关于USART传输不妨截取一部分框图看看。其发

关于ST MCU的USART传输,经常会有人围绕TXE/TC的使用产生些疑惑,或者因为二者的应用产生些问题。这里抽空稍加整理与大家分享交流下。

一、关于TXE、TC标志的基本概念和理解

关于USART传输不妨截取一部分框图看看。其发送过程如下:

其发送部分由两部分组成,一部分是数据缓存区,即发送数据寄存器【TDR】,另一部分是数据移位寄存器,即下图中下方的红色方框内。首先,待发送的数据放进TDR, 然后适时地把TDR中的数据拷贝进移位寄存器【transimit shift register】。数据从移位寄存器中一位接一位的送到TX线上,直到把移位寄存器里的数据全部送出去。完成整个过程后,那个待发送数据才算发送完毕。

在这个过程中就涉及到2个标志位,一个是TXE位,一个是TC位,在USART_SR寄存器里面。

芯片复位后,寄存器【USART_SR】的默认值为0x00C0,即【TXE、TC】的默认值为均为1。这里先提下,后面还会提到这个默认值。【很多时候关注寄存器的默认值是必要的】

TXE表示发送缓存区【TDR】是否为空的标志。如果TDR里有暂放数据,即其没空,此时TXE=0。当把TDR里的数据COPY到移位寄存器里了且没放新数据进TDR时,TXE=1.

TC 表示从TDR里过来的数据是否全部移到外面的TX线上去了的标志。如果从TDR过来的数据全部被移送到TX线而且此时TDR里也没有新的数据,则TC=1。相反,如果刚才从TDR里过来的数据还没有全部移到外面去,或者说虽然之前TDR里的数据被移走了,但TDR里又来了新的数据,此时TC=0。平常大家把TC称之为传输结束标志,没说错,但有时可能会带来些误解,误解就出在“结束”这个字眼上。

对于上面的描述,若有人觉得不够直观的话,不妨再看看上面的传输数据流程图。关于TXE/TC标志,这里我们可以打个相对生活化的比方,可能不是十分贴切。

假设有一拨人【待发送的全部数据】要去某地去办事,计划用车按每波几个人【每次发送的数据】分批、连续地送过去。每批一同坐车【进TDR]到中途某地,然后下车上一座独木桥【移位寄存器】,再列队从桥上一个个过去后就到目的地【TX脚】了。

TXE=0 对应着车里坐了一车人的时候;【TDR里放有数据】

TXE=1 对应着每波人刚下了车并上了独木桥的时候;【TDR里没有数据】

TC=1 此处,对应着所有要外出的人都过了独木桥的时候;【所有要发送的数据都送出去了】

TC=0 对应着有人还在桥上,或者有部分人虽然过了桥 但还有人在车上。【比方待发送1024个字节数据,还只是发送一部分出去的时候。】

关于TC标志置1。只要满足从TDR过来的数据全部移送到TX脚且此时没有新数据进TDR,TC就置1。

以上面提到的1024个字节的待传数据来说,不考虑DMA方式的话,你可以有三种实现方式:

1、查询1024个TC标志来发送数据;【显然每个字都是发送结束后才发送下一个字。】

2、查询1023个TXE标志和1个TC标志;

3、查询1024个TXE标志。

总之,不能哪种方式,能满足应用要求就行。【上面提到的坐车过桥默认第2种方式】

这里我们不妨看看相同条件下,通过查询TXE和TC标志不停发送数据的情形,有无差别。假设8位字长,1个STOP位,1个start位,波特率一样,数据始终是0x55。

下面是同一UART的TX脚分别查询TXE和TC标志而测得的2路输出波形。

显然两种情形下,输出波形是有差异的。轮询TC标志时,发现字与字之间多了个近似于1个位的间隔;相比之下,而轮询TXE就发现数据非常连贯。因为查询TC的话,每次要等到每个字的数据全部移出移位寄存器后才去补充下一个数据,这样会导致一个小停顿。

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

二、关于使用TXE/TC标志使用不当导致的问题。

2.1 发送数据时使用TC标志不当而丢失第一个字的问题。

出现这钟情况的相关发送代码有个基本特征,先填写数据进TDR,然后查询TC标志决定是否该更新TDR的数据。大致代码如下:

for(i=0; i

{

USART_SendData(USARTx, TxBuffer[i]);

while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);

}

按照上面代码,发送第一个数据就可能出问题。

前面提到过TC标志在芯片复位后的默认值就是1,对于单数据缓冲传输来说,如果要清零TC的话,必须依次遵循下面2个步骤【注意“依次”二字】,即先读SR,再写DR.

这里的第一个数据,是先写DR后读SR,不能实现对TC的清零,自然TC为1的初始值没变。按照代码指令就立即填写第2个数据进TDR,此时第1个数据可能还没来得及发送就被覆盖了。

不过从2次更新数据起,每次都满足先读SR后写DR的次序,这样TC每次都能可靠清零,后面自然不会出现类似第一个字的错了。

如果你把上面代码中轮询TC标志改为TXE标志就没这个问题。因为每次写DR都会清零TXE。或者在开始传送代码前做一次TC清零操作也可以规避那个问题。

2.2 TXE的不当使用导致最后一个字丢失的问题。

这里说TXE使用不当主要是指该用TC的时候用了TXE标志。其实TC标志的主要作用就是确保每次送到数据缓冲器TDR里数据全部移送到TX线上去。当发送一组多数据时,最后一个数据放人TDR后,建议查询等待TC=1。尤其是类似如下场合:

A:UART发送完数据后 需要禁用UART;

B:UART发送完数据后 需要进入休眠状态;

上述情况下,当最后一个数据放人TDR后,若只是等待TXE=1就行动,那最后一个数据可能没来得及从移位寄存器移出去就会因为外设失能指令或休眠指令挂掉了。如果套用上面的比方,常听说“过河拆桥”,这里是人家还没过桥就急于拆桥,悲剧自然就容易发生了。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭