STM32 的USART解析

总线与通信基础知识

在介绍USART之前,我们需要先了解一些信息传输的基本知识,而微控制器的信息传递大多都是由总线来进行的。

总线定义

总线是指微机系统、智能仪器内部已经相互之间传递信息的公共通路,是芯片内部模块之间、器件之间、系统之间的实际互联线。 为例使总线能够有效、可靠地进行信息交换,必须对总线信号、传送规则以及传输的物理介质等做出一系列规定,这些规定被称为总线协议或总线规则。
总线按其使用范围或连接对象来分可以分为以下3类:

芯片总线连接片内各模块的通道,用于模块之间的信息传输。 微控制器的片内总线大都采用并行的单总线结构(分时复用)
系统总线(也称为内总线)微控制器系统或智能仪器内部各模块、各器件之间传送信息的通道。 系统总线分为并行系统总线(如PCI总线、VXI总线)和串行系统总线(如I2C、SPI、1-wire)。
通信总线(也称为外总线)两个或多个系统之间传送信息的通道。 通信总线分为并行通信总线(如IEEE488总线)和串行通信总线(如RS232、RS485总线)。

外总线又可细分为两种通信总线:

并行通信:数据字节的各位同时被传送或接收
特点:传输速度快,当传输距离远、位数多时,会提高成本、降低通信成功率。
并行通信时数据的各个位同时进行传输,这就表示有多少位的数据就需要多少根的传输线,但多个位可以同时传输可以实现数据的快速传输。

串行通信:数据字节的各位按顺序逐位传送或接收
特点:只需2-3根传输线,线路简单、成本低,特别适合远距离通信,但传输速度相对并行通信要慢。
串行通信就是将数据按字节顺序一位一位的将数据发送出去,相比并行通信串行通信所需要的传输线就要少的多,但传输速度因此也会变慢。由于并行通信在使用时成本较高且长距离传输时通信成功率不高,所以在实际应用中只有少部分通信使用的方式为并行通信,大多数使用的是串行通信方式

异步通信与同步通信

串行通信类型按数据的传递方式不同,可分为异步通信与同步通信。

异步通信

在异步通信中,数据或字符是逐帧发送的。数据帧定义为一个字符完整的通信格式,也称为“格式帧”,通常用二进制表示。

数据格式

一个字符完整的通信格式为一个数据帧,由起始位、数据位、奇偶校验位和停止位组成。
在这里插入图片描述
数据帧中各部分:
起始位:为逻辑“0”信号,占用一位,用来通知接收设备,一个新的字符开始了。
数据位:紧跟着起始位的是 5~8位数据的最低位(LSB),异步传送规定低位在前,高位在后。
奇偶位:紧跟在数据最高位(MSB)之后,占用一位,奇偶校验时,根据协议置“1”或“0”(根据需要设置)。
停止位:为逻辑“1”信号,可占用1-2位。接收端收到停止位时,表示一帧数据结束。同时为接收下一帧数据作好准备,只要再收到一个逻辑“0”就是一个新字符的开始。

异步通信特点:
1.以字符(数据帧)为单位进行传输的,帧与帧之间的时间间隔是任意的,即帧与帧之间是异步的,通过起始位控制通信双方正确收发。
2.每个数据帧中的各位以固定的时间传送,因此通信双方必须采用相同的波特率,以实现数据帧收发的同步。
3.由于异步通信的数据帧有固定格式,通信双方只需按约定的帧格式收发数据,因此其硬件结构比同步通信方式简单。
4.由于在数据帧中插入了为实现同步收发的起始位、停止位,因此其通信效率比同步通信方式要低。
5.异步通信的数据帧中可以加入校验位进行数据传送的错误检测,应用广泛。

波特率

异步通信之所以被称为异步通信,关键原因在于通信双方没有共用一个相同的时钟信号,当通信A方要传输一个数据给通信B方时,如果A方和B方的时钟频率不相同,那么A按照数据帧格式在A的时钟频率下将数据传输出去,接收方B按照自己的时钟频率接收这个数据的话,可能会出现数据错位或者漏位的情况。这是就需要A、B双方约定一个相同的频率发送和接收数据,这就是波特率。
波特率是异步通信的一个重要指标,反映了数据传送的速率。
波特率定义:单位时间内传输的二进制数据的位数。通常用每秒传输的bit数表示,为b/ps或bps(bit per second)。波特率越高,传送速度越快。
常用的波特率为:1200、1800、2400、4800、9600、115200

同步通信

同步通信是一种连续串行传送数据的通信方式,发送端和接收端需要一个同步时钟信号,用于控制通信双方收发的同步,同步信号由发起通信的主机发生。
所谓同步就是要通信双方在同一个时钟信号频率下进行信息的传输,同步通信至少需要3条线:数据线SDA,同步时钟SCL,公共地。 同步通信的数据格式如图所示,其特征是以“数据系列”为单位进行通信,一个数据系列包含以下3个部分:

1.同步字符:表示数据传送开始,以实现发送端和接收端的同步。
2.数据块:要通信的数据内容。同步字符结束后,连续、顺序地发送和接收。
3.校验字符:为检测通信数据的正确性,提高数据传送的可靠性,在数据块发送完毕后,通常要按约定发送数据块的校验码。校验方式和校验码长度,按约定的通信协议进行。
在这里插入图片描述
串行系统总线(内总线)通常采用同步通信方式,如IIC、SPI、USB。

串行通信的数据传送方式

串行通信是常用的通信方式,按照数据的传送方向,串行通信可分为单工、半双工和全双工三种传送方式
1.单工传输方式
是一种数据只沿一个方向传送的通讯方式,甲机只能作发送器,乙机只能作为接收器,数据由甲机传送给乙机。通讯时只需用一根传输线即可实现数据传送。
在这里插入图片描述
2.半双工传输方式
数据能够在两个方向上传送,但在同一时刻只能由一台发送、另一台接收。仅用一根传输线,交替进行双向传送数据。数据能够在两个方向上传送,但不能同时进行。
在这里插入图片描述
3.全双工传输方式
甲机和乙机之间有2条数据线,甲机和乙机都有独立的接收器和发生器硬件模块,因此双方在任何时刻都可以同时进行发送和接收。
在这里插入图片描述
这3种传输方式中,可以将单工传输理解为听广播,只能从广播中收听到信息,而不能将信息传输到广播中;半双工传输可以理解为对讲机通话,当有一方正在说话时,说话一方就处于占线状态,此时另一方只能收听不能说话,说话方也只能说话不能收听,只有当说话的一方停止后,占线状态被解除后才可以说话;全双工传输可以理解为打电话,通话的双方在任何时候都可以说话或者收听信息,不受对方的限制。

USART

USART是全双工的通信方式,STM32有5个串行通信接口:3个通用同步/异步收发器(USART1、USART2、USART3)和两个通用异步收发器(UART4、UART5)。不同型号的芯片数量有所区别。USART1连接高速APB2总线,运行频率是72MHz(支持高达4.5Mbps的传输频率);其他位于APB1总线,运行频率是36MHz(2.25Mbps传输频率)。

USART接口引脚

USART的双向通信需要最少两个引脚:RX(Recerive Data,接收数据)输入引脚和TX(Transmit Data)输出引脚。两个设备在进行通讯时,需要将设备1的TX与设备2的RX连接,将TX与设备2的RX连接。在这里插入图片描述
在同步通信模式,需要通过时钟SCLK输出引脚发出数据同步时钟,为了支持硬件流控制,还需要请求发送RST和清除CTS引脚。
然而,UASRT接口的引脚在STM32微控制器上是与GPIO共用。也就是说,USART引脚使用了AFIO功能的引脚。如果GPIO仍要使用这个I/O引脚,可以使用重映射功能的引脚。

串行异步通信字符格式

在串行通信时,数据、控制和状态信息都使用同一根信号线传输,所以收发双方必修遵守共同的通信协议,才能解决传输速率、信息格式、位同步、字符格式、数据校验等问题。串行异步通信以字符为单位传输,其通信协议是起止式异步通信协议。
在这里插入图片描述
一个字符传输结束,可以接着传输下一个字符,也可以空闲一段时间再传输下一个字符。空闲位为逻辑1电平。字符格式中的“位”表示二进制,每位持续的时间长度都是一样的,为数据传输速率的倒数。数据传输速率也称为比特率,即每秒传输的二进制位数。**当进行二进制数码传输且每位时间长度相等时,比特率等于波特率。**波特率表示数据调制速率,其单位为波特。

USART结构

下图为STM32微控制器USART结构框图:
在这里插入图片描述
其中最重要的部分为图中阴影部分,其他部分为接口和控制部分。

发送数据时,数据总线将要发送的数据传输到发送数据寄存器(TDR),发送数据寄存器(TDR)再将一个字节的数据传输到发送移位寄存器,发送移位寄存器将这一个字节的数据按二进制位一位一位的传输到TX引脚上。前一个字节的数据通过数据移位寄存器发送完成后,发送数据寄存器中的内容才又会被送到发送移位寄存器,由上图可看出,发送移位寄存器将数据送出时是先将右端的位送出,这也说明串口通信是低位先行。
接收数据时,数据以数据帧的形式由RX引脚接收,接收到的数据送入到接收移位寄存器,当接收移位寄存器接收到一个完整的字节数据后才会将整个字节数据传输到接收数据寄存器。接收移位寄存器在接收数据时,数据以二进制的形式从左端输入,每接收一位,数据就向右移动一位,到最后就会恢复原来的二进制位顺序,这就是为什么串口通信是低位先行但接收时数据不会改变的原因。

USART基本函数

STM32固件库提供的USART等外设函数很多,可以简单分类,一遍理解。USART常用的有关函数如下:

void USART_DeInit(USART_TypeDef* USARTx);//USART初始化:根据USART初始化结构参数USART外设
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);//USART解除初始化//
void USART_StructInit(USART_InitTypeDef* USART_InitStruct);//使用默认值填充USART初始化结构体成员
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);//允许或禁止USART外设
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);//返回USART外设最新接收的数据
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);//通过USART外设发送当个数据
void USART_SendBreak(USART_TypeDef* USARTx);//发送终止字符
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);//设置USART的某个中断请求是允许或禁止
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);//获取USART中断状态
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);//清除USART某个挂起中断标志
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);//获取标志状态:检测某个USART事件是否置位
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);//挂起标志清除:清除某个USART事件挂起标志

猜你喜欢

转载自blog.csdn.net/Tao_9/article/details/130546602