UART驱动开发与中断DMA传输调优 - 第1节
1.1 UART 的历史演进
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是串行通信领域历史最悠久的协议之一,其设计思想可追溯至 20 世纪 60 年代的电传打字机(Teletype)接口。随着集成电路技术的发展,1980 年代出现了经典的 8250/16450 UART 芯片,随后被 16550 系列(带 16 字节 FIFO)取代,成为 PC 串口的工业标准。如今,UART 已作为外设 IP 核集成在绝大多数 MCU 和 SoC 中,是嵌入式系统调试、传感器数据采集、GPS/蓝牙模块通信的首选接口。
1.2 全双工异步通信原理
UART 采用 全双工(Full-Duplex) 模式,即发送和接收使用独立的物理线路(TX 与 RX),数据可同时双向传输。其核心特征是 异步(Asynchronous):收发双方不需要共享时钟信号,而是通过预先约定的波特率(Baud Rate)和帧格式来同步数据。
1.2.1 异步通信的同步机制
异步通信的“同步”依赖以下要素:
- 波特率一致: 发送方与接收方必须使用相同的波特率(例如 115200 bps),否则采样位置偏移会导致误码。
- 起始位触发: 总线空闲时为高电平(逻辑 1),发送方拉低电平(逻辑 0)表示帧开始,接收方检测到下降沿后启动采样定时器。
- 过采样技术: 接收方通常以 16 倍或 8 倍波特率时钟对 RX 线采样,在起始位中间位置确认有效电平,提高抗干扰能力。
1.2.2 全双工 vs 半双工对比
| 特性 | 全双工(UART) | 半双工(如 RS-485) |
|---|---|---|
| 数据流向 | TX/RX 独立,同时收发 | 共享总线,分时收发 |
| 硬件连线 | 至少 3 线(TX、RX、GND) | 2 线(A、B)+ 使能控制 |
| 冲突处理 | 无冲突,天然隔离 | 需仲裁或主从调度 |
| 典型场景 | 调试日志、传感器通信 | 工业总线、多节点组网 |
1.3 数据帧格式详解
UART 数据帧是异步通信的最小传输单元,由起始位、数据位、可选的校验位和停止位组成。下图展示了一帧完整的 UART 波形结构:
1.3.1 起始位(Start Bit)
起始位固定为 逻辑 0(低电平),宽度等于 1 个位时间。接收方通过检测总线从高到低的跳变来识别帧起始,并以此对齐后续位的采样点。
1.3.2 数据位(Data Bits)
数据位紧跟在起始位之后,常见配置为 5、6、7、8 位,现代嵌入式系统几乎统一使用 8 位数据位。数据按 LSB first(最低有效位在前) 的顺序逐位发送。
1.3.3 校验位(Parity Bit)
校验位用于简单的错误检测,可选类型如下:
| 校验类型 | 逻辑规则 | 典型应用 |
|---|---|---|
| 无校验(None) | 不发送校验位 | 调试日志、高可靠链路 |
| 奇校验(Odd) | 数据位 + 校验位中 1 的个数为奇数 | Modbus RTU 可选 |
| 偶校验(Even) | 数据位 + 校验位中 1 的个数为偶数 | RS-232 传统设备 |
| 固定 1 / 固定 0 | 校验位恒为 1 或 0(非标准) | 极少使用 |
1.3.4 停止位(Stop Bit)
停止位固定为 逻辑 1(高电平),宽度可配置为 1、1.5 或 2 个位时间。停止位的作用是:
- 保证帧之间有明确的高电平间隔,便于接收方识别下一帧的起始位下降沿。
- 提供接收方处理前一帧数据的时间余量(尤其在低速 MCU 或中断响应较慢时)。
1.4 常见帧格式速查表
| 缩写 | 数据位 | 校验位 | 停止位 | 典型场景 |
|---|---|---|---|---|
| 8N1 | 8 | 无 | 1 | 最常用,调试终端、GPS、蓝牙 |
| 8E1 | 8 | 偶校验 | 1 | 工业仪表、老旧设备 |
| 8O1 | 8 | 奇校验 | 1 | Modbus ASCII 模式 |
| 7E1 | 7 | 偶校验 | 1 | 早期 ASCII 终端(7 位数据) |
| 8N2 | 8 | 无 | 2 | 低速、高噪声环境 |
1.5 波特率与位时间
波特率(Baud Rate)定义每秒传输的符号数。在 UART 中,1 波特 = 1 bit/s(不考虑调制)。位时间(Bit Time) = 1 / 波特率。例如:
- 9600 bps → 位时间 ≈ 104.17 μs
- 115200 bps → 位时间 ≈ 8.68 μs
- 921600 bps → 位时间 ≈ 1.085 μs
一帧完整传输时间 = (1 起始位 + 数据位数 + 校验位数 + 停止位数) × 位时间。以 8N1 为例:1 + 8 + 0 + 1 = 10 位时间。在 115200 bps 下,传输一帧约需 86.8 μs,理论最大吞吐量约为 11520 字节/秒。