STM32 USART功能详解
文章目录
前言
提示:本文主要用作在学习江科大自化协STM32入门教程后做的归纳总结笔记,旨在学习记录,如有侵权请联系作者
本文主要探讨stm32内部集成的用于串口通信的硬件外设–USART通用同步/异步收发器。
一、USART串口协议
1.1 串口通信
1.2 硬件电路
1.3 电平标准
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
1.4 串口参数及时序
1.5 串口时序
二、USART通用同步/异步收发器
2.1 USART简介
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是一个全双工通用同步/异步收发器,它是STM32内部集成的用于串口通信的硬件外设。它可以根据数据寄存器的一个字节数据自动生成数据帧时序从TX引脚发送出去,也可以自动接收RX引脚的数据帧时序并拼接为一个字节数据存放在数据寄存器里。型号STM32F103C8T6芯片的USART资源分别有USART1、USART2和USART3共3个独立的USART外设,其中USART1是APB2总线上的外设,剩下两个是APB1总线上的外设。
2.2 USART电路结构
我们先来看一下上面的部分。左上角这里有Tx和Rx,这两个就是发送和接收引脚。下面这里的SW_RX、IRDA_OUT以及IRDA_IN是智能卡和IrDA通信的引脚,我们不用这些协议,所以这些引脚可以不用管。右边这个框框,IrDA、SIR这些东西也不用管,
下图所示就是Tx发送端的数据流方向以及Rx接收端数据流的方向,发送端数据是从发送移位寄存器发出,接收端数据是从接收移位寄存器读取。
下图所示红圈部分就是串口的数据寄存器了,发送或接收的字节数据就存在这里了。这里有两个数据寄存器,一个是发送数据寄存器TDR(Transmit DR),一个是接收数据寄存器RDR(Receive DR)。这两个寄存器占用同一个地址,在程序上只表现为一个寄存器,就是数据寄存器DR(Data Register)。但实际硬件中是分成了两个寄存器,一个用于发送一个用于接收。TDR是只写的,RDR是只读的,当你进行写操作时,数据就写到TDR,当你进行读操作时,数据就是从RDR读出来的。
然后再来看一下两个移位寄存器,它们一个用于发送,一个用于接收。
这两个寄存器是怎么工作的呢?举个例子,比如你在某个时刻给TDR写了0x55这个数据,在寄存器里就是以二进制形式存储(0101 0101),那么此时,硬件检测到你写入数据了,它就会检查当前移位寄存器是不是有数据正在移位,如果没有,这个0101 0101就会立刻全部移动到发送移位寄存器,准备发送。当数据从TDR移动到移位寄存器时会置一个标志位叫TXE(TX Empty),发送寄存器空。我们检查这个标志位,如果置1了,我们就可以往TDR写入下一个数据了。(注意:当TXE标志位置1时,数据其实还没有发送出去)
然后发送移位寄存器就会在发送控制器的驱动下向右移位,然后一位一位地把数据输出到Tx引脚。这里是向右移位的,所以正好和串口协议规定的低位先行是一致的。 当数据移位完成后,新的数据就会再次自动地从TDR转移到发送移位寄存器里来。如果当前移位寄存器移位还没有完成,TDR的数据就会进行等待,一旦移位完成就会立刻转移过来。有了TDR和移位寄存器的双重缓存,可以保证连续发送数据的时候数据帧之间不会有空闲,提高了工作效率。
简单来说,就是数据一旦从TDR转移到移位寄存器了,管你有没有移位完成我就立刻把下一个数据放在TDR这里等着,一旦移完了新的数据就会立刻跟上。
再来看一下接收端这里,数据从Rx引脚通向接收移位寄存器,在接收器控制的驱动下一位一位地读取Rx电平,先放在最高位,然后向右移,移位8次之后就能接收一个字节了。同样,因为串口协议规定是低位先行,所以接收移位寄存器是从高位往低位这个方向移动的。之后,当一个字节移位完成之后,这一个字节的数据就会整体地一下子转移到接收数据寄存器RDR里来,在转移的过程中也会置一个标志位叫RXNE(RX Not Empty)接收数据寄存器非空。当我们检测到RXNE置1之后就可以把数据读走了。同样,这里也是两个寄存器进行缓存,当数据从移位寄存器转移到RDR时就可以直接移位接收下一帧数据了。
这就是USART外设的主要工作流程了。
2.3 USART基本结构
上图所示就是USART最主要、最基本的结构了。最左边这里是波特率发生器,用于产生约定的通信速率,时钟来源是PCLK2/1。经过波特率发生器分频后,产生的时钟通向发送控制器和接收控制器,发送控制器和接收控制器用来控制发送移位和接收移位。之后,由发送数据寄存器和发送移位寄存器这两个寄存器的配合将数据一位一位地移出去。通过GPIO口的复用输出,输出到TX引脚,产生串口协议规定的波形。这里画了几个右移的符号,就是代表这个移位寄存器是往右移的,是低位先行。当数据由数据寄存器转到移位寄存器时会置一个TXE的标志位,我们判断这个标志位就可以知道是不是可以写下一个数据了。
接收部分也是类似。RX引脚的波形通过GPIO口输入,在接受控制器的控制下一位一位地移入接收移位寄存器。这里画了右移的符号,也是右移的,因为是低位先行,所以要从左边开始移进来。移完一帧数据后,数据就会统一转运到接收数据寄存器,在转移的同时置一个RXNE的标志位,我们检查这个标志位就可以知道是不是收到了数据了。同时,这个标志位也可以去申请中断,这样就可以在收到数据时直接进入中断函数,然后快速地读取和保存数据。
这里实际上是有4个寄存器,但在软件层面上只有一个DR寄存器可以供我们读写。写入DR时,数据走上面这条路,进行发送。读取DR时,数据走下面这条路,进行接收。
这就是USART进行串口数据收发的过程。
最后,右下角是一个开关控制,就是配置完成之后用Cmd开启一下外设,这个也是常规操作了。
作者:钟剑锋-JeffChong