STM32 F429 USART发送部分的寄存器原理及TXE,TC中断使用(知识整理)

先来看USART 字符发送的基本步骤 :

字符发送步骤

1.向USART_CR1的 UE 位写1,enable USART

2.对USART_CR1的 M 位编程定义字长

3.对USART_CR2中停止位stop 数量编程

4.如果要多缓冲区通信,CR3中的DMAR 可以enable

5.波特率寄存器USART_BRR选择使用的波特率

6.将CR1的 TE 位置 1,首次发送前发送一个空闲帧。

7.向DR寄存器写入数据。(会清零TXE位)

8.写入最后数据后,等TC=1.再进行关闭停止传输操作。

我们再来看图
。
发送步骤中的寄存器和位均已在图中标出,按照步骤看,跟着箭头走路线,能很清楚的看到寄存器的运行顺序,和对谁产生了影响。

对步骤再进行些知识补充
首先是第3步,停止位设置,添加中断字符概念。

要注意,中断字符的中断不是串口中断或者定时器中断的意思。通过详细阅读,可以看出他的作用是对一帧,一帧传输的数据,阶段性的分隔。它的出现标志着传输过程中总体中的一帧数据的传送完成,但整个传输过程还没结束。

中断字符 break characters

1.CR1中,设置一个SBK位传输一个中断字符。中断帧的长度却决于M位的设置。

** 2.如果SBK设置为1,在完成当前字符传输后,在TX线路上发送给一个中断字符。**

3.这一位在中断字符完成时(在中断字符的停止位期间),由硬件重置。

4.UASRT在最后的中断帧后加入逻辑电平1,保证识别下一帧的起始位。

注:如果软件在中断传输开始前重置了SBK位,中断字符将不会被传输。

对于两个连续的中断,SBK位应该在前一中断的停止位后置1。

像是一群人过独木桥,一个一个人过。人走到对岸就回头喊一声,让其他人知道你到岸后,再让下一个人上桥。首先是第3步,停止位设置,添加中断字符概念。要注意,中断字符的中断不是串口中断或者定时器中断的意思。通过详细阅读,可以看出他的作用是对一帧,一帧传输的数据,阶段性的分隔。它的出现标志着传输过程中总体中的一帧数据的传送完成,但整个传输过程还没结束。像是一群人过独木桥,一个一个人过。人走到对岸就回头喊一声,让其他人知道你到岸后,再让下一个人上桥。

第6步中的空闲帧概念:

空闲字符 Idle characters

CR1中,TE位置1会驱动USART在第一个数据帧前发送一个空闲帧。

在这里插入图片描述

从图中可以看到 空闲帧被视为完全由“1"组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位。

中断帧被视为完全由“0”组成的一个完整的数据帧,后面跟随了这段数据的停止位。从图中也可以看到字符发送过程第二步的M位的作用。

注:数据发送期间,不可复位TE,会冻结波特率计数器,损坏TX脚数据,丢失传输。




发送中断

了解USART的发送流程后,再来说一下发送数据可以使用的两个中断,TXEIE和TCIE。


TXE=TX EMPTY 发送空中断,实际上是DR寄存器中TDR空产生的中断。TXE是标志位

在使能TXEIE后,就开启了这个中断。只要TXE置1,就会进入这个中断。TXE由硬件置1,软件清零。

TXE置1的含义:

1.数据已从TDR (Transmit Data Register)传输到TSR(Transmit Shift Register),说明传输已经开始。
2.TDR已经空了,可以向DR寄存器写入下一数据,不用担心覆盖了。

大体的流程是下面这样的

通过软件向DR写入要发送的数据,将TXE位清零。(完全硬件控制,TDR有数据0,无数据1)。
在这里插入图片描述

使能TXEIE后。还有数据要发,TDR一为空,就会使TXE=1,触发TXE中断。

在发送完字符串后必须关掉,否则导致重复进入中断。

没有传送任务时,写向DR的数据直接存入TSR中,数据传输开始时,TXE立刻置1.
在这里插入图片描述
用从论坛学到的枪模型来思考会简单很多。

要发送的数据是没进枪的子弹在PWDATA里。装进TDR里暂时储存。等上一发子弹从TSR射出到TX后,再转移到TDR发射。TDR一空,就用TXE提醒可以装弹,不会出现满弹夹塞不进去的情况。

TC=Transmission Complete 发送完成中断。在完全发送完成后产生的中断。TC是标志位

使能TCIE后,即可开启此中断。每当TC置1,都会进入此中断。在发送一个字节后才进入中断。

若在一帧数据发送完成后,TXE照常置1,然后PWDATA中没有要发送的数据了。此时达成了两个条件:1. TXE=1 2. PWDATA,TDR,TSR为空(数据发送完成)

关于第二个条件实际是判断TSR发送移位寄存器中的数据有没有全部发送出去。数据从PWDATA到TDR再到TSR再到TX脚输出的过程。TDR一空就会要求填写,填写后会把数据传入TSR。

我是这样想的如果TSR空了,也就代表TDR没有数据传过来了,TDR空了,也就是没有数据能到TDR了,也就是PWDATA空了。

达成这两个条件,硬件就会自动使TC置1,进入TC中断。

TC位清除有以下程序顺序

1.向USART_SR读取数据 2.向USART_DR写入数据。

(可以手动清除TC标志位,仅在多缓冲区通信建议这么做)

要避免TC=1重复进入中断 。

用那把枪来看,枪膛中的子弹打没了,弹夹也空了,手里也没了,就没有要打的子弹了。

第8步中等待TC=1,目的使确保最后一个帧的传送已完成。禁止 USART 或进入暂停模式时需要此步骤,以避免损坏最后一次发送。

两个中断总结的来说:

有数据要发送(PWDATA有数据),TDR空,则TXE置1,触发TXE中断。让下一帧数据进入DR。
没有数据要发送(PWDATA空),且TDR空,TSR空,TXE置1,则TC置1触发TC中断。完成这一数据发送,提示让下一数据开始写入。

TXE告知程序给予时间填写TDR寄存器,保证数据发送不间断。
TC告知程序发送结束的时间,方便程序控制外部数据的收发。

如果发现理解有误,欢迎指出讨论,进行修改。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值