1. UART 通信基础
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是 MCU 开发中最基础、使用最广泛的串行通信协议之一。它只需要两根信号线(TX 发送、RX 接收)即可实现全双工通信,硬件开销极低,几乎每款 MCU 都内置了至少一个 UART 外设模块。
理解 UART 协议帧格式、各数据位的含义以及波特率的概念,是后续配置中断模式、调优通信参数的前提。本节将从物理层到数据链路层,逐层拆解 UART 通信的核心要素。
1.1 UART 协议帧格式
UART 是异步通信协议,收发双方没有独立的时钟线,而是通过约定的波特率(位传输速率)和帧格式来同步数据。一个完整的 UART 数据帧由以下四个部分组成:
| 帧字段 | 位宽 | 电平状态 | 功能说明 |
|---|---|---|---|
| 起始位 | 1 位 | 逻辑 0(低电平) | 标志数据帧开始,同步接收器时钟 |
| 数据位 | 5~9 位(常用 8 位) | LSB 先发送 | 承载实际传输的有效数据 |
| 校验位 | 0 或 1 位 | 奇/偶/固定电平 | 可选,用于检错 |
| 停止位 | 1、1.5 或 2 位 | 逻辑 1(高电平) | 标志帧结束,提供帧间隔 |
关键理解:UART 帧的起始位和停止位是异步通信的“握手信号”。起始位的下降沿(从高电平跳变到低电平)是接收器检测数据帧开始的唯一同步事件,停止位的高电平则保证总线在空闲时处于确定状态。
1.2 起始位 / 数据位 / 校验位 / 停止位详解
1.2.1 起始位(Start Bit)
- 电平特征:从空闲的高电平(逻辑 1)跳变为低电平(逻辑 0),持续一个位时间。
- 作用:提供帧同步信号。接收器检测到下降沿后,启动内部波特率采样时钟,开始接收后续数据位。
- 注意事项:起始位的下降沿必须干净、无抖动,否则会导致接收器采样偏移,产生帧错误。
1.2.2 数据位(Data Bits)
- 位宽配置:通常为 5、6、7、8 或 9 位。MCU 应用中最常用的是 8 位数据位(对应一个字节)。
- 发送顺序:LSB(最低有效位)先发送,MSB(最高有效位)最后发送。这是 UART 协议的标准约定,与 I²C 或 SPI 的 MSB-first 不同。
- 典型配置:8 位数据位 + 无校验(8N1)是最常见的组合,兼容 ASCII 码和二进制数据。
1.2.3 校验位(Parity Bit)
校验位是可选的检错机制,用于检测数据位在传输过程中是否发生单比特翻转。校验方式分为三种:
| 校验模式 | 校验位电平 | 检错能力 | 适用场景 |
|---|---|---|---|
| 无校验(None) | 无校验位 | 无 | 短距离、低噪声环境,追求吞吐量 |
| 奇校验(Odd) | 使数据位 + 校验位中 1 的个数为奇数 | 检测单比特错误 | 工业现场、对可靠性有基本要求的场景 |
| 偶校验(Even) | 使数据位 + 校验位中 1 的个数为偶数 | 检测单比特错误 | 与奇校验对称,常用于 Modbus 等协议 |
实战建议:在中断模式 UART 驱动中,如果使能了校验位,接收中断服务函数(ISR)中必须检查校验错误标志位(如 USART_SR 中的 PE 位)。一旦发现校验错误,应丢弃当前数据帧并重新同步,避免错误数据进入应用层。
1.2.4 停止位(Stop Bit)
- 电平特征:高电平(逻辑 1),持续 1、1.5 或 2 个位时间。
- 作用:标志一帧数据结束,并为下一帧的起始位下降沿提供准备时间。
- 位宽选择:
- 1 位停止位:最常用,帧开销最小,适用于大多数场景。
- 1.5 位停止位:仅用于某些老式 UART 或特殊协议。
- 2 位停止位:增加帧间隔,适用于高噪声环境或低速通信,给接收器更多处理时间。
1.3 波特率概念
波特率(Baud Rate) 定义为单位时间内传输的符号(码元)数量,单位是 baud(波特)。在 UART 通信中,一个符号对应一个比特位,因此波特率等于比特率(bit/s)。
波特率决定了每一位的持续时间:
位时间 (T_bit) = 1 / 波特率
示例:
波特率 = 115200 baud
位时间 = 1 / 115200 ≈ 8.68 μs
收发双方必须使用相同的波特率,且波特率误差必须控制在允许范围内(通常要求 < 2%),否则会导致采样错位,产生帧错误或数据乱码。
| 波特率(baud) | 位时间 | 传输 1 字节耗时(8N1) | 典型应用 |
|---|---|---|---|
| 9600 | 104.17 μs | ≈ 1.04 ms | 调试串口、GPS 模块、低速传感器 |
| 38400 | 26.04 μs | ≈ 260 μs | 工业控制、Modbus RTU |
| 115200 | 8.68 μs | ≈ 86.8 μs | MCU 调试日志、蓝牙模块、Wi-Fi 模块 |
| 921600 | 1.09 μs | ≈ 10.9 μs | 高速数据采集、固件升级 |
波特率误差陷阱:MCU 的 UART 波特率由系统时钟分频产生。如果系统时钟频率不是波特率的整数倍,会产生分频误差。例如,使用 16 MHz 系统时钟产生 115200 波特率时,分频系数 = 16 MHz / (16 × 115200) ≈ 8.68,取整后实际波特率 = 16 MHz / (16 × 8) = 125000,误差高达 8.5%,会导致通信失败。必须使用支持小数分频的 UART 或调整系统时钟频率。
1.4 常见 UART 配置组合速查表
| 配置名称 | 数据位 | 校验位 | 停止位 | 帧总位数 | 典型波特率 |
|---|---|---|---|---|---|
| 8N1 | 8 | 无 | 1 | 10 | 115200 |
| 8E1 | 8 | 偶校验 | 1 | 11 | 9600 / 19200 |
| 8O1 | 8 | 奇校验 | 1 | 11 | 38400 |
| 7E1 | 7 | 偶校验 | 1 | 10 | 9600(ASCII 协议) |
| 8N2 | 8 | 无 | 2 | 11 | 4800 / 9600(高噪声环境) |
课程要点回顾:
- UART 帧 = 起始位(1 位低电平)+ 数据位(5~9 位,LSB 先发)+ 可选校验位 + 停止位(1/1.5/2 位高电平)。
- 起始位的下降沿是接收器的同步触发信号,停止位的高电平保证总线空闲状态。
- 波特率决定位时间,收发双方波特率误差必须 < 2%,否则会产生采样偏移导致通信失败。
- 8N1(8 数据位、无校验、1 停止位)是最通用、兼容性最好的配置,也是本课程后续中断模式驱动开发的基础配置。