【自学嵌入式:stm32】USART串口外设

USART串口外设

USART简介

  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器

  • USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里

  • 自带波特率发生器,最高达4.5Mbits/s

  • 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)

  • 可选校验位(无校验/奇校验/偶校验)

  • 支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN

  • STM32F103C8T6 USART资源: USART1、 USART2、 USART3

【注】

  • 硬件流控制:比如A设备有个TX向B设备的RX发送数据,A设备一直在发,发得太快了。B设备处理不过来,如果没有硬件流控制,那B就只能抛弃新数据或者覆盖原数据了,如果有硬件流控制,在硬件电路上,会多出一根线,如果B没准备好接收,就置高电平,如果准备好了,就置低电平,A接收到了B反馈的准备信号,就只会在B准备好的时候,才发数据,如果B没准备好,那数据就不会发送出去,这就是硬件流控制,可以防止因为B处理慢而导致数据丢失的问题。
  • 智能卡、IrDA、LIN:这是其他的协议,因为和USART非常像,所以STM32对USART加了一些小改动,就能兼容这么多协议了,智能卡就是常用的饭卡、交通卡等;IrDA是红外通信,就是用一个红外发光管,另一边是红外接收管,靠闪烁红外光通信,它并不是遥控器的红外通信,所以并不能模拟遥控器;LIN是局域网的通信协议

USART框图

image

引脚

先看左上角的引脚部分:
image

如上图,这里有TX和RX,这两个就是发送和接收引脚,下面这里的SW_RX、IrDA_OUT/IN这些是智能卡和IrDA通信的引脚。
image
如上图,引脚这块,TX发送脚,就是从这里接出去的。
image
如上图,RX接收脚,就是通向这里

发送/接收数据寄存器

image
如上图,这部分是串口的数据寄存器,发送和接收字节的数据在这里,上面有两个寄存器,一个是发送数据寄存器TDR(Transmit DR),另一个是接收数据寄存器RDR(Receive DR),这两个寄存器占用同一个地址,和51单片机串口的SBUF寄存器一样,在程序上,只表现为一个寄存器,就是数据寄存器DR(Data Register),但实际硬件中是分成了两个寄存器,TDR用于发送,RDR用于接收,TDR是只写的,RDR是只读的,当你进行写操作时,数据就写入到了TDR,当你进行读操作时,数据就是从RDR读出来的。
下面是两个移位寄存器,一个用于发送,一个用于接收,发送移位寄存器的作用就是,把个字节的数据一位一位地移出去,正好对应串口协议的波形的数据位,比如你在某时刻给TDR写入了0X55这个数据,在寄存器里就是二进制存储,0101 0101,那么此时,硬件检测到你写入数据了,它就会检查,当前移位寄存器是不是有数据正在移位,如果没有,这个0101 0101就会立刻,全部移动到发送移位寄存器,准备发送。
image

如上图,当数据从TDR移动到移位寄存器时,会置一个标志位,叫TXE(TXEmpty),发送寄存器空,我们检查这个标志位,如果置1了,我们就可以在TDR写入下一个数据了,注意一下,当TXE标志位置1时,数据其实还没有发送出去,只要数据从TDR转移大发送移位寄存器,TXE就会置1,此时可以写入新的数据。
image

如上图,然后发送移位寄存器就会在下面这里的发生器控制的驱动下,向右移位,然后一位一位地,把数据输出到TX引脚,这里是向右移位的,所以正好和串口协议规定的低位先行,是一致的,当数据移位完成后,新的数据就会再次自动地从TDR转移到发送移位寄存器里来,如果当前移位寄存器移位还没有完成,TDR的数据就会进行等待,一但移位完成,就会立刻转移过来,有了TDR和移位寄存器的双重缓存,可以保证连续发送数据的时候,数据帧之间不会有空闲,提高了工作效率,简单来说,就是你数据一但从TDR转移到移位寄存器了,管你有没有移位完成,我就立刻把下一个数据放在TDR等着,一但移完了,新的数据就会立刻跟上,这样做,效率就会比较高。
image

如上图,接收端这里也是类似的,数据从RX引脚通向接收移位寄存器,在接收器控制的驱动下,一位一位地读取RX电平,“先放在最高位,然后向右移,移位8次之后,就能接收一个字节了,同样,因为串口协议规定是低位先行,所以接收移位寄存器是从高位往低位这个方向移动的,当一个字节移位完成之后,这一个字节的数据就会整体地一下子转移到接收数据寄存器RDR里来。
image

如上图,在转移的过程中,也会置一个标志位,叫RXNE(RX Not Empty),接收数据寄存器非空,当我们检测到RXNE置1之后,就可以把数据读走了,同样,这里也是两个寄存器进行缓存,当数据从移位寄存器转移到RDR时,就可以直接移位接收下一帧数据了,这就是USART外设整个的工作流程,发送加帧头帧尾,接收去除帧头帧尾都是有硬件自动执行这个操作。

硬件数据流控

image

如上图,看控制部分和增强功能,发送器控制用来控制发送移位寄存器的工作,接收器控制,用来控制接收移位寄存器的工作,然后左侧的硬件数据流控,简称流控,用于避免发送数据太快导致接收端收不过来的问题,这里流控有两个引脚,一个是nRTS,一个是nCTS,nRTS(RequestToSend)是请求发送,是输出脚,也就是告诉别人,我当前能不能接收,nCTS(ClearToSend)是清除发送,是输入脚,也就是用于接收别人nRTS的信号的,这里前面加个n意思是低电平有效,这个引脚需要有支持流控的串口,它的TX接到主机的RX,然后主机的RTS要输出一个能不能接受的反馈信号,接到对方的CTS,当我能接收的时候,RTS就置低电平,广请求对方发送,对方的CTS接收到之后,就可以一直发,当我处理不过来时,比如接收数据寄存器我一直没有读,又有新的数据过来了,现在就代表我没有及时处理,那RTS就会置高电平,对方CTS接收到之后,就会暂停发送,直到这里接收数据寄存器被读走,RTS置低电平,新的数据才会继续发送
image

如上图,那反过来,当我的TX给对方发送数据时,我们CTS就要接到对方的RTS,用于判断对方,能不能接收,TX和CTS是一对的,RX和RTS是对的,CTS和RTS也要交又连接,这就是流控的工作模式

时钟输出

image
如上图,这个模块用于产生同步的时钟信号,它是配合发送移位寄存器输出的,发送寄存器每移位一次,同步时钟电平就跳变一个周期,时钟告诉对方,我移出去一位数据了,你看要不要让我这个时钟信号来指导你接收一下?当然这个时钟只支持输出;不支持输入,所以两个USART之间,不能实现同步的串回通信,这个时钟信号有如下用途:

  1. 兼容别的协议,比如串口加上时钟之后,就跟SPI协议特别像,所以有了时钟输出的串口,就可以兼容SPI,另外这个时钟也可以做自适应波特率,比如接收设备不确定发送设备给的什么波特率,那就可以测量一下这个时钟的周期,然后再计算得到波特率,不过这就需要另外写程序来时序这个功能。

唤醒单元(多设备串口通信)

image

唤醒单元的作用是实现串口挂载多设备,我们之前说,串口一般是点对点的通信,点对点,只支持两个设备互相通信,想发数据直接发就行,而多设备,在一条总线上,可以接多个从设备,每个设备分配一个地址,我想跟某个设备通信,就先进行寻址,确定通信对象,再进行数据的收发,这个唤醒单元就可以用来实现多设备的功能。
image

如上图,在这里可以给串口分配一个地址,当你发送指定地址时,此设备唤醒开始工作,当你发送别的设备地址时,别的设备就唤醒工作,这个设备没收到地址,就会保持沉默,这样就可以实现多设备的串口通信

中断控制

image
如上图,这部分是中断输出控制
image
如上图,中断申请位,就是状态寄存器这里的各种标志位,状态寄存器这里,有两个标志位比较重要,一个是TXE发送寄存器空,另一个是RXNE接收寄存器非空,这两个是判断发送状态和接收状态的必要标志位,中断输出控制就是配置中断是否能通向NVIC。

波特率发生器

image
如上图,是波特率发生器部分,波特率发生器其实就是分频器,APB时钟进行分频,得到发送和接收移位的时钟,这里时钟输入是fPCLKx(x=1或2),USART1挂载在APB2,所以就是PCLK2的时钟,一般是72M,其他的USART都挂载在APB1,所以是PCLK1的时钟,一般是36M,之后这个时钟进行一个分频,除一个USARTDIV的分频系数,
image

如上图,USARTDV是一个数值,并且分为了整数部分和小数部分,因为有些波特率,用72M除一个整数的话,可能除不尽,会有误差,所以这里分频系数是支持小数点后4位的,分频就更加精准。
image

如上图,之后分频完之后,还要再除个16,得到发送器时钟和接收器时钟,通向控制部分
image

然后右边这里,如果TE(TX Enable)为1,就是发送器使能了,发送部分的波特率就有效,如果RE(RXEnable)为1,就是接收器使能了。

USART引脚复用

image
image

USART基本结构

image
这个图是对刚才框图的总结,只补充一点,开关控制就是Cmd开启外设用

数据帧

字长设置

image

【注】这里的字长是指数据位长度

这里在每个数据位的中间都有一个时钟上升沿,时钟的频率和数据速率是一样的,接收端可以在时钟上升沿进行采样,后门的空闲帧和断开帧是局域网协议用的,8位字长最好选择无校验,要不然校验位占1位,有效载荷就只剩7位了,一个字节都发不了

配置停止位

image

起始侦测位

image
当输入电路侦测到一个数据帧的起始位后,就会以波特率的频率,连续采样一帧数据,同时,从起始位开始,采样位置就要对齐到位的正中间,只要第一位对齐了,后门就肯定都是对齐的,那为了实现这些功能,首先输入的这部分电路对采样时钟进行了细分
image

如上图,它会以波特率的16倍频率进行采样,也就是在一位的时间里,可以进行16次采样
image
image

如上两个图,然后它的策略是,最开始,空闲状态高电平,那采样就一直是1,在某个位置,突然采到一个0,那么就说明,在这两次采样之间,出现了下降沿,如果没有任何噪声,那之后就应该是起始位了,在起始位,会进行连续16次采样,没有噪声的话,这16次采样,肯定就都是0,这没问题,但是,实际电路还是会存在一些噪声的
image
image

如上两个图,所以这里即使出现下降沿了,后续也要再采样几次以防万一,那根据手册描述,这个接收电路,还会在下降沿之后的第3次、5次、7次,进行一批采样,在第8次、9次、10次,再进行一批采样,且这两批采样,都要要求每3位里面至少应有2个0,没有噪声,那肯定全是0,满足情况。
image

如上图,如果有一些轻微的噪声,导致这里3位里面,只有两个0,另一个是1,那也算是检测到了起始位,但是在状态寄存器里会置一个NE(Noise Error),噪声标志位,就是提醒你一下,数据我是收到了,但是有噪声,你悠着点用

image

如上图,如果这里3位里面,只有1个0,那就不算检测到了起始位,可能前面那个下降沿是噪声导致的,这时电路就忽略前面的数据,重新开始捕提下降沿,这就是STM32的串口,在接收过程中,对噪声的处理,如果通过了这个起始位侦测,那接收状态就由空闲,变为接收起始位,同时,第8、9、10次采样的位置,就正好是起始位的正中间,之后,接收数据位时,就都在第8、9、10次,进行采样,这样就能保证采样位置在位的正中间了,这就是起始位侦测和采样位置对齐的策略

数据采样

image
在一个数据位,有16个采样时钟,由于起始位侦测已经对齐了采样时钟,所以,这里就直接在第8、9、10次采样数据位,为了保证数据的可靠性,这里是连续采样3次,没有噪声的理想情况下,这3次肯定全为1或者全为0,全为1,就认为收到了1,全为0,就认为收到了0,如果有噪声,导致3次采样不是全为1或者全为0,那它就按照2:1的规则来,2次为1,就认为收到了1,2次为0,就认为收到了0,在这种情况下,噪声标志位NE也会置1,告诉你,我收到数据了,但是有噪声,你悠着点用,这就是检测噪声的数据采样

波特率发生器

  • 发送器和接收器的波特率由波特率寄存器BRR里的DIV确定
  • 计算公式:\(\text{波特率}= f_{\text{PCLK2/1}} / (16 * \text{DIV})\) (除16是因为内部还有一个16倍波特率的采样时钟)

image

比如配置波特率9600,则\(9600 = \frac{72\text{M}}{16\cdot \text{DIV}}\)
解得\(\text{DIV}=\frac{72\text{M}}{\frac{9600}{16}}=468.75\)
最终得到二进制数111010100.11

USB转串口模块

image
最左侧是USB端口
image

如上图,USB有4根线,GND,D+,D-,VCC,USB标准供电是5V,然后中间D+和D-是通信线,走的也是USB协议,所以这里需要一个CH340芯片转换一下,转换之后输出的就是TXD和RXD,是串口协议
image

如上图,最后,通过这里的排针引出来。
image

如上图,那需要注意的就是这边的供电策略,首先,所有的电都是从这个VCC+5V来的,然后VCC+5V,通过这个稳压管电路进行降压,得到VCC+3.3V。
image
如上图,之后,VCC+5V和VCC+3.3V,都通过排针引I出来了,所以这个第6脚和第4脚,是分别有5V和3.3V输出的,第5脚,板子上标的是VCC,它是通向了CH340芯片的VCC上,所以这个第5脚,实际上是CH340的电源输入脚,一般我们这个模块的排针会有一个跳线帽,这个跳线帽需要插在4、5脚,或者5、6脚上。
image

如上图,右边这里也有文字说明,短路5V到JVCC,CH340供电为5V,TTL电平为5V,短路3V3到VCC,CH340供电为3.3V,TTL电平为3.3V,所以这个跳线帽,是用来选择通信电平的,也是给CH340芯片供电的,所以最好不要拿掉,
如果你拿掉了,就相当于这整个芯片,没有供电,STM32通信需要3.3V,所以把跳线帽插在这里的4、5脚上就行了
image
如上图,右下角是指示灯和电源滤波,这里有PWR电源指示灯和TXD、RXD的指示灯如果引脚上有数据传输,这两个指示灯会对应闪烁。

posted @ 2025-08-19 12:06  秦瑞迁  阅读(124)  评论(0)    收藏  举报