1. UART协议基础:通信原理、帧格式与异步特点
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是嵌入式系统中最基础、最广泛使用的串行通信协议之一。它仅需两根数据线(TX 发送、RX 接收)即可实现全双工通信,硬件开销极低,几乎被所有 MCU 和 SoC 原生支持。理解 UART 的底层原理是驱动开发的第一步,也是后续配置波特率、设计 DMA 环形缓冲区的理论基础。
1.1 UART 通信原理
UART 采用异步串行方式传输数据:数据以比特(bit)为单位,在一条数据线上逐位发送,且收发双方不共享时钟信号。为了正确采样,双方必须约定完全相同的波特率(Baud Rate),即每秒传输的符号数。在 UART 中,一个符号通常对应一个比特,因此波特率等于比特率(bps)。
关键概念:UART 的“异步”指没有独立的时钟线,收发器各自使用本地时钟(通常由晶振分频得到)在约定的波特率下采样数据线电平。双方时钟的微小偏差必须控制在可容忍范围内(通常为 ±2% ~ ±3%),否则会导致采样错位、帧错误。
下图展示了 UART 通信的基本连接方式与数据流向:
1.2 UART 帧格式
UART 将数据封装为帧(Frame)进行传输。一个标准 UART 帧由以下字段按固定顺序组成:
| 字段 | 位宽 | 电平逻辑 | 作用 |
|---|---|---|---|
| 起始位 | 1 bit | 高 → 低(下降沿) | 标志帧开始,同步接收器采样时钟 |
| 数据位 | 5 ~ 9 bit(常用 8 bit) | LSB 优先发送 | 承载有效载荷数据 |
| 校验位 | 0 / 1 bit | 奇校验 / 偶校验 / 无 | 检错(可选) |
| 停止位 | 1 / 1.5 / 2 bit | 高电平 | 帧结束,给接收器处理时间 |
常见配置:嵌入式开发中最常用的 UART 帧格式为 8N1(8 数据位、无校验、1 停止位)。该配置在效率与兼容性之间取得平衡,也是本课程后续 DMA 驱动示例的默认帧格式。
下图以 8N1 格式为例,展示一帧数据(0x55 = 二进制 01010101)在数据线上的电平变化:
1.3 异步通信特点
UART 的异步特性决定了其优缺点,驱动开发中必须充分理解这些特点才能设计出健壮的传输方案:
- 无需时钟线:节省引脚,适合远距离或引脚受限场景。
- 波特率必须精确匹配:收发双方的波特率误差需在容限内(通常 < ±2%),否则会出现采样偏移导致帧错误。
- 帧开销固定:每传输 8 位有效数据至少需要 2 位额外开销(起始 + 停止),有效数据率约为标称波特率的 80%。
- 无硬件流控时可能丢帧:接收端处理不及时会导致数据覆盖(Overrun),驱动中常通过 DMA + 环形缓冲区解决。
- 电平标准多样:MCU 内部为 TTL 电平(0V / 3.3V 或 5V),远距离通信需转换为 RS-232、RS-485 等标准。
驱动开发注意:UART 的异步特性意味着接收端无法预知下一帧何时到来。如果使用 CPU 轮询(Polling)方式接收,会严重浪费处理器资源;如果使用中断(Interrupt)方式,高频数据流会导致频繁上下文切换。因此,DMA + 环形缓冲区成为高性能 UART 驱动的标准方案,这也是本课程的核心内容。
1.4 常见波特率与误差分析
波特率由系统时钟分频得到,不同时钟频率下可实现的波特率精度不同。下表列出常用波特率及其典型应用场景:
| 波特率 (bps) | 位时间 (μs) | 典型应用 | 备注 |
|---|---|---|---|
| 9600 | 104.17 | 调试串口、低速传感器 | 兼容性最广,长距离稳定 |
| 115200 | 8.68 | 标准控制台、日志输出 | 嵌入式开发最常用 |
| 921600 | 1.09 | 高速数据采集、固件升级 | 需短距离、低噪声环境 |
| 3000000 | 0.33 | 片内 UART 高速通信 | 通常需 DMA 支持 |
误差计算示例:某 MCU 系统时钟为 16 MHz,欲产生 115200 bps 波特率。常用分频公式为:
取整为 9,实际波特率 = 16,000,000 / (16 × 9) ≈ 111,111 bps,误差 = (111,111 - 115,200) / 115,200 ≈ -3.55%,超出容限。此时需改用 8 倍过采样 模式或调整系统时钟频率。
BRR = 系统时钟 / (16 × 目标波特率) = 16,000,000 / (16 × 115200) ≈ 8.68取整为 9,实际波特率 = 16,000,000 / (16 × 9) ≈ 111,111 bps,误差 = (111,111 - 115,200) / 115,200 ≈ -3.55%,超出容限。此时需改用 8 倍过采样 模式或调整系统时钟频率。
下图展示了 UART 驱动中波特率生成与帧采样的内部结构:
1.5 本章小结
- UART 是异步串行协议,收发双方通过约定波特率实现同步,无需额外时钟线。
- 标准 UART 帧包含起始位、数据位(LSB 优先)、可选校验位、停止位,常用配置为 8N1。
- 异步通信的帧开销和波特率误差容限是驱动设计中必须考虑的关键约束。
- 理解波特率分频原理和采样过程,是后续配置 UART 外设寄存器的基础。