USART
USART (Universal Synchronous/Asynchronous Receiver/Transmitter),中文叫通用同步/异步收发器。
如果说 I2C 是“老师点名”,那 USART/UART 就是**“打电话”**。
它是最古老、最通用、也是你学习 STM32 接触的第一个通信协议(比如打印 Serial_Printf 就要用它)。
我们主要关注它最常用的模式:UART(异步模式)。以下是它的核心特质:
1. 核心硬件架构:交叉连接 (The Cross)
USART 不需要时钟线(在异步模式下),它主要依靠两根数据线:
- TX (Transmit):发送端。嘴巴,用来说话。
- RX (Receive):接收端。耳朵,用来听话。
- GND (Ground):共地。这是新手最容易忽略的!两边的地线必须连在一起,才有统一的参考电压。
接线口诀:TX 接 RX,RX 接 TX。
- STM32 的嘴巴 (TX) $\rightarrow$ 电脑的耳朵 (RX)
- STM32 的耳朵 (RX) $\leftarrow$ 电脑的嘴巴 (TX)
2. 通信特点:全双工 & 异步
- 全双工 (Full Duplex):
- 因为 TX 和 RX 是分开的两根线,所以你可以 一边说话,一边听别人说话,互不干扰。(I2C 是半双工,同一时间只能一人说)。
- 点对点 (Point-to-Point):
- 通常是一对一通信。不像 I2C 那样可以挂一串设备(虽然 RS485 可以挂多个,但那是电平转换后的事了)。
- 异步 (Asynchronous):
- 没有时钟线!
- 由于没有时钟线喊口号,通信双方必须 事先约定好语速。这个语速就是 波特率 (Baud Rate)。
3. 数据协议:封装成“帧” (Frame)
既然没有时钟线,接收方怎么知道数据什么时候开始、什么时候结束?
USART 把数据切成一段一段的,每一段叫一个数据帧。
标准格式(8N1)如下:
- 空闲状态 (Idle):
- 总线上没数据时,保持 高电平 (1)。
- 起始位 (Start Bit) —— “喂!”
- 发送方把电平 拉低 (0) 保持 1 位的时间。
- 接收方一旦检测到下降沿,立马打起精神:“有数据来了,准备计时!”
- 数据位 (Data Bits) —— “正文”
- 通常是 8位 (1 Byte)。
- 关键规则:低位先行 (LSB First)。 比如发数字 1 (二进制
0000 0001),是先发那个1,最后发0。
- 校验位 (Parity Bit) —— “验货” (可选)
- 用来检查数据有没有传错。
- 奇校验 (Odd) / 偶校验 (Even) / 无校验 (None)。
- 注:大部分场合为了效率,我们都选 None(无校验)。
- 停止位 (Stop Bit) —— “挂电话”
- 发送方把电平 拉高 (1) 保持 0.5/1/1.5/2 位的时间。
- 告诉接收方:“这一个字节发完了,你可以休息一下了。”
4. 核心命门:波特率 (Baud Rate)
这是 USART 最最重要参数。
常见的有 9600, 115200。
- 115200 意味着:每秒钟传输 115200 个二进制位(bit)。
- 换算一下,发送 1 个 bit 需要的时间是 $\frac{1}{115200} \approx 8.68$ 微秒。
灾难现场:
- 如果你设置 STM32 发送波特率是 9600。
- 但是串口助手设置接收波特率是 115200。
- 结果: 电脑会按照 115200 的速度去采样,结果读回来的全是乱码。
比喻:
两个人发摩斯密码。
一个人按照“每秒敲一下”的速度敲。
另一个人按照“每秒记十下”的速度记。
记下来的肯定是一堆错误的点。
5. USART vs UART:有什么区别?
在 STM32 手册里,你会看到有的外设叫 USART,有的叫 UART。
- UART (Universal Asynchronous ...):
- 只能做异步通信(没有时钟线)。
- 这就是我们平时用的串口。
- USART (Universal Synchronous/Asynchronous ...):
- 多了个 S (Synchronous)。它可以配置出一根 CK (Clock) 时钟线。
- 作用: 它可以像 SPI 一样同步通信。
- 现状: 99% 的情况下,我们只用 USART 的异步功能(也就是把它当 UART 用)。
总结:STM32 串口配置“三板斧”
当你要写代码配置串口时,其实就是在配置这个结构体:
C
USART_InitTypeDef USART_InitStructure;
// 1. 约定语速
USART_InitStructure.USART_BaudRate = 9600;
// 2. 约定数据长度 (8位)
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
// 3. 约定停止位 (1位)
USART_InitStructure.USART_StopBits = USART_StopBits_1;
// 4. 约定校验位 (无)
USART_InitStructure.USART_Parity = USART_Parity_No;
// 5. 约定硬件流控制 (不流控,不需要 RTS/CTS)
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
// 6. 开启模式 (既能发,也能收)
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;一句话总结:
USART 是两根线(TX/RX)的全双工通话,没有时钟线,所以双方必须严格约定波特率才能听懂对方在说什么。
拓展 UART and USART
| 对比维度 | UART(异步) | USART(同步 + 异步) |
|---|---|---|
| 通信模式 | 仅支持异步 | 支持异步 + 支持同步 |
| 时钟线 | 无,靠波特率同步 | 异步模式:无;同步模式:有 SCLK 时钟线 |
| 硬件引脚 | 最少 2 根:TX(发)、RX(收) | 异步模式:2 根;同步模式:至少 3 根(TX/RX/SCLK) |
| 数据准确性 | 依赖波特率匹配(有误差容限) | 同步模式:靠时钟线同步,准确性更高;异步模式:和 UART 一致 |
| 应用场景 | 绝大多数串口通信(如 USB 转 TTL、单片机间通信、传感器串口) | 异步模式:同 UART;同步模式:高速、高精度通信(如 SPI 兼容、工业级设备) |
| 硬件实例 | 部分 51 单片机的 UART 外设、简单的串口转换器(如 CH340) | STM32 的 USART 外设(如 USART1~USART6)、ESP32 的 UART 外设(实际是 USART,支持同步) |
- 从属关系:USART 是 UART 的超集,USART 包含 UART。
- 日常使用:99% 的嵌入式串口通信场景,都是 UART 模式,哪怕硬件是 USART 外设。
- 实操重点:你不需要纠结于术语,只需要掌握 异步串口的配置参数(波特率、数据位、校验位、停止位)和 电平匹配(3.3V/5V),这才是串口通信的核心。
- 对你的转型意义:理解这两个概念,能帮助你更好地阅读单片机的数据手册(如 STM32 的参考手册中,USART 外设的章节),以及在代码中配置串口时,明白每一个参数的意义。