12 UART
Universal Synchronous/Asynchronous Receiver/Transmitter 通用同步/异步收发器
up的视频讲解: https://space.bilibili.com/1455872040
1 ✨UART简介

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器
-
UART可以是
USART外设的一种模式 -
也可以是直接将
USART从硬件上进行裁剪而得到的的外设 -
这个前面带A的就是异步的意思

接下来我们来把STM32里面 这些与外部设备通信的外设都来分类一下
-
串行和并行
-
一类是串行发送数据的 也叫串口通信 UART IIC 以及SPI USB CAN这些都属于串口通信的外设
-
另一类是并行发送数据的有 FSMC
-
-
在串口通信里面又可以分为 同步 和 异步 这两种模式
-
其中UART USB CAN这些都是串行异步通信
-
而SPI IIC以及USART的同步模式就属于串行同步通信
-
- 其中在异步通信里面又可以通过电平标准简单分一分
- UART采用的是TTL电平标准
- 而USB和CAN则采用的是差分电平标准
2 🎞️ UART通信协议
2.1 物理连接

UART在同一时刻 通信双方都可以收发的叫做全双工通信的工作方式
- 半双工通信往往收发都在一条线上 所以同一时刻只能由其中一个发
- 而单工通信则只能由发送方发给接收方

UART属于串行异步通信的一种方式
-
同步就是双方通过一条专属的时钟线进行 时钟的同步 -
而
异步通信则采用的是双方各自的时钟 通过提前约定波特率也就是通信的速率 来进行时钟的同步
约定波特率本质 是约定UART外设的时钟频率 因为UART的收发都是以时钟为工作基准的
2.2 波特率

-
在UART通信中 我们所使用的码元就是低电平0和高电平1
-
所以对二进制码元取log2就是1bit 那么这个时候波特率也就等于比特率
-
所以说我们通常用的波特率
115200bit/s9600bit/s它们的单位直接就用bit每秒来表示了
2.3 电平标准

- TTL电平规定
- 当电压大于等于2.4伏的时候就判定为1
- 小于等于0.4伏的时候就判定为0
- 而USB差分电平标准是
- 当D正大于等于2.8伏且D负小于等于0.3伏的时候 判定为1
- 当D负小于等于0.3伏且D正大于2.8伏的时候判定为0
-
3.3V TTL(STM32 等主流)
逻辑 1:≈3.3V逻辑 0:≈0V -
5V TTL(51等)
逻辑 1:+2.4V ~ +5V逻辑 0:0V ~ +0.8V
2.4 数据帧

串口一个数据帧 = 1 起始位 + 8 数据位 + + (1 奇偶校验位) + 1 停止位
-
起始位:标志一个数据帧的开始,固定为低电平。(空闲状态为高电平)
-
数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行(数据从低位到高位发送)
-
(校验位):用于数据验证,根据数据位计算得来,串口用的是奇偶校验法(无校验,奇校验,偶校验)
- 奇校验:如果传输的数据是0000 1111 共4个1,是偶数个,那么校验位就需要在补一个1,变成
0000 11111保证1的个数为奇数 - 偶校验:如果传输的数据是0000 1111 共4个1,是奇数个,那么校验位就需要在补一个0,变成
0000 11110保证1的个数为偶数
- 奇校验:如果传输的数据是0000 1111 共4个1,是偶数个,那么校验位就需要在补一个1,变成
-
停止位:用于数据帧间隔,固定为高电平,时长可以配置为1bit时间或者1.5以及2bit时间
对于发送而言每来
- 一个时钟时钟脉冲 就UART外设就对应发送1bit的数据
而对于接收而言
- 它会将这个频率 提高到16倍 也就是说每一个bit时间里会进行 16次采样 而只取 中间三次的值作为判定
3 🌐USART外设结构

3.1 收发通路

-
RSRReceive Shift register(接收移位寄存器): 把串行比特流数据,按波特率采样,拼成完整的字节,再送到RDR -
RDRReceive Data Register(接收数据寄存器):接收移位寄存器拼好的字节,先存在这里,再由CPU/DMA读取
先看到 接收通路
-
由RX引脚输入进来的比特流 会经过16倍的过采样 然后到这个
接收移位寄存器 -
这个移位寄存器具体由下方的
接收控制器控制 接收控制器会根据配置的参数 将数据帧中的数据位 拿出来 -
然后并行拷贝到
RDR寄存器 拷贝完成之后会将对应标志位RXNE置为1 此时 CPU就可以读取RDR中的数据 并重新将RXNE置为0

-
TDRTransmit Data Register(发送数据寄存器):CPU/DMA 将要发送的数据并行写入这里。 -
TSRTransmit Shift register(发送移位寄存器): 把并行数据转成串行比特流,然后一位一位按波特率从 TX 引脚发出去
对于 发送通路
-
CPU会将发送的数据写到
TDR -
然后
TDR就会将数据并行拷贝到发送移位寄存器 -
拷贝完成之后 会将对应的标志位
TXE置为1 -
最后就会按下方配置的起始位 停止位 校验位进行拼接 每来一个时钟脉冲就向TX引脚发送一位
3.2 参数配置

-
CR1Control Register 1 (控制寄存器1): USART 模块使能, 发送 / 接收使能, 数据位宽(8/9 位),奇偶校验使能, 中断使能 -
CR2Control Register 2 (控制寄存器2): 帧格式与同步模式控制, STOP:停止位配置(1/2 位) -
CR3Control Register 3 (控制寄存器3): 发送 / 接收 DMA 使能, RTS/CTS 硬件流控使能, 红外模式配置, 半双工模式使能 -
SRStatus Register(状态寄存器):- 数据写入 TDR →
TXE标志置 1 → 数据自动进入发送移位寄存器 → 按波特率从 TX 引脚发出 - 数据写入 RDR →
RXNE标志置 1 → CPU 读取数据
- 数据写入 TDR →
这里的参数配置寄存器
-
CR1中的这几位就是配置数据位的位数以及校验位
-
CR2中的STOP就是配置停止位的长度
-
左下角的 RXNE和TXE 掌管的就是对应的标志位
3.3 波特率生成

BRRBaud Rate Register(波特率配置寄存器):用来配置波特率的分频系数, 最终生成发送和接收的采样时钟
波特率生成时钟
-
由RCC输入 进来的
PCLK时钟 会通过这个可编程数字分频器 -
生成 16倍波特率的时钟给到接收部分 再通过 16分频后给到发送部分
-
这个可编程数字分频器具体怎么分频 就由右边的
波特率生成器去控制
✅一帧数据需要多长时间
115200、8N1表示每个字节有1起始位、8数据位和1停止位,共10位,所以理想有效速率是11520 byte/s。100个字节至少约8.68 ms,不含软件等待和上位机调度。
UART只发送位流,不会自动知道数据是温度、字符串还是数组。ASCII中A是0x41(二进制01000001),字符6是0x36(二进制00110110),整数6直接发一个字节则是0x06。
自定义协议需要约定长度、字节序、帧头与校验。接收到一次回调不代表收到一条完整业务消息;长消息可分多次到达,多条消息也可连续到达。