STM32——USART原理及应用

时间:2024-10-17 18:02:57

1.什么是USART?

1.1 基本概念

USART英文全称:universal asynchronous receiver and transmitter ,翻译过来就是:通用同步异步收/发器USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX(Transmit Exchange)引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。简单来说USART就是一个STM32的外设,用于设备之间传输数据,常见的通信外设还有IIC、SPI等。

1.2 USART实物图

1.3USART简约框图

  1. TX(Transmit)传输线路,负责发送数据。连接到其他设备的接收端

  2. RX(Receive)接收线路,负责接收数据。连接到其他设备的发送端

  3. GND(Ground):地线,电路的公共参考点,确保信号的正常传输和电路的正常工作

  4. VCC:电源输入,提供电源给USART模块或相关的电路设备,通常是正电压(如5V或3.3V)

1.5USART发送接收方式

可以通过触发中断发送接收

可以利用DMA搬运发送接收

2.USART硬件部分

2.1USART外设

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

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

3.可选校验位(无校验/奇校验/偶校验)

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

5.支持DMA

6.数据传输是低位先行

7.USART通信:异步、全双工通信

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

        什么是硬件流控制?-- 硬件流控制:比如A设备有个TX向B设备的RX发送数据,A设备发送的快,B设备处理不过来,如果没有硬件流控制,那么B设备只能抛弃新数据或者覆盖原来的数据,如果有硬件流控制,在硬件电路上,会多出一根线,如果B设备没准备好接收,就置高电平,如果准备好了,就置低电平。A接受了B反馈的信号,就只会在B准备好的时候,才发送数据;如果B没准备好,数据就不会发送出去。这就是硬件流控制,可以防止因为B处理慢而导致数据丢失问题。

注:UART只有异步传输功能,所以没有SCLK、nCTS、nRTS功能引脚(这是UART与USART的区别

2.USART框图

USART框图非常重要,掌握USART框图,就能比较深入的理解USART的工作原理

1线路是USART接收数据的流程:数据从RX接收数据引脚进入→接收移位寄存器(该寄存器的作用是将数据一位一位的移到接收数据寄存器RDR中),利用USART_ReceiveData()函数可以直接读取出接收数据寄存器RDR的数据。

2线路是驱动接收移位寄存器工作:RE→接收控制器→接收移位寄存器

3线路是USART发送数据的流程:数据从发送数据寄存器TDR→发送移位寄存器→TX发送引脚

利用USART_SendData()函数可以将要发送的数据放在TDR发送寄存器中

4线路是驱动发送移位寄存器工作:TE→发送控制器→发送移位寄存器

5与6(TXEIE、RXNEIE)分别是使能发送中断使能、接收中断使能

7(TE、RE)分别是发送使能、接收使能

8与9(TXE、RXNE)分别是发送寄存器空、接收寄存器非空,这两个事件均可申请进入USART中断

发送寄存器空:表明发送寄存器空闲,可通知MCU向TDR写入数据

接收寄存器非空:表明已经接收到了数据,进入中断后可通知MCU读取RDR里的数据

注:发送数据寄存器TDR,接收数据寄存器RDR,这两个寄存器占用同一个地址,在程序上只表现为一个寄存器,就是数据寄存器DR。但实际硬件中是分成了两个寄存器

SW_RX  IRDA_OUT IRDA_IN是只能卡与lrDA通信的引脚。 

3.USART软件部分

3.1USART基本参数

波特率:串口通信的速率(如:规定每隔1ms发送1位等)每秒传送码元的个数。

决定了每隔多久发送一位。

起始位:标志一个数据帧的开始,固定为低电平(空闲时为高电平)

•数据位:数据帧的有效载荷,1电平,0电平,低位先行

•校验位:用于数据验证,根据数据位计算得来

停止位:用于数据帧间隔,固定为高电平

3.2USART串口时序图

3.3USART结构体详解

USART初始化的结构体一般用来配置:USART传输的速率、一帧的长度、是否带校验位、USART模式等等

typedef struct {
    uint32_t USART_BaudRate;            // 波特率
    uint16_t USART_WordLength;          // 字长
    uint16_t USART_StopBits;            // 停止位
    uint16_t USART_Parity;              // 校验位
    uint16_t USART_Mode;                // USART模式
    uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;

1) USART_BaudRate: 波特率设置。一般设置为2400、9600、19200、115200。标准库函数会根据设定值计算得到USARTDIV值,从而设置USARTBRR寄存器值。

2) USART_WordLength: 数据帧字长,可选8位或9位。它设定USARTCR1寄存器的M位的值。如果没有使能奇偶校验控制,一般使用8数据位;如果使能了奇偶校验则一般设置为9数据位

3) USART_StopBits: 停止位设置,可选0.5个、1个、1.5个和2个停止位,它设定USARTCR2寄存器的STOP[1:0]位的值,一般我们选择1个停止位。

4) USART_Parity: 奇偶校验控制选择,可选USARTParityNo(无校验)、USARTParityEven(偶校验)以及USARTParityOdd(奇校验),它设定USARTCR1寄存器的PCE位和PS位的值。

5) USART_Mode: USART模式选择,有USARTModeRx和USARTModeTx,允许使用逻辑或运算选择两个,它设定USARTCR1寄存器的RE位和TE位。就是发送模式或接受模式。

6) USART_HardwareFlowControl: 硬件流控制选择,只有在硬件流控制模式才有效,可选有使能RTS、使能CTS、同时使能RTS和CTS、不使能硬件流。

当使用同步模式时需要配置SCLK引脚输出脉冲的属性,标准库使用一个时钟初始化结构体USART_ClockInitTypeDef来设置,该结构体内容也只有在同步模式才需要设置。