3. STM32 串口外设架构:USART 框图、发送器/接收器原理、波特率发生器
通用同步异步收发器(USART)是 STM32 中最灵活的外设之一。理解其内部数据路径、控制逻辑和时钟分频机制,是后续实现空闲中断唤醒与 DMA 协同策略的硬件基础。本节从顶层框图出发,逐步拆解发送器、接收器与波特率发生器三个核心模块。
3.1 USART 内部架构总览
下图展示了 STM32 USART 模块的核心数据流与控制路径。发送器和接收器共享同一个波特率发生器,但拥有独立的移位寄存器、数据寄存器(TDR/RDR)和 FIFO(部分系列支持)。
架构要点:USART 内部包含两条独立的数据路径——发送路径(CPU/DMA → TDR → 移位寄存器 → TX)和接收路径(RX → 移位寄存器 → RDR → CPU/DMA)。两条路径共享波特率时钟,但数据流互不干扰。
3.2 发送器原理与数据流
发送器负责将并行数据转换为串行位流,并按约定的帧格式(起始位、数据位、校验位、停止位)从 TX 引脚输出。
3.2.1 发送使能与数据写入
- TE 位(CR1 寄存器 bit 3):置 1 使能发送器。TE 置位后,TX 引脚被 USART 控制,并自动发送一个空闲帧(高电平)。
- 数据写入 TDR:CPU 或 DMA 将待发送数据写入发送数据寄存器(TDR)。
- TXE 标志(SR/ISR):TDR 为空时硬件置位,表示可以写入下一个数据。写入 TDR 后 TXE 自动清零。
3.2.2 移位与串行输出
- 数据从 TDR 转移到发送移位寄存器(TSR)——该操作在 TXE 置位后的下一个波特率时钟边沿完成。
- TSR 按 LSB 优先顺序逐位移出,经过 TX 引脚输出。
- 发送完成后,TC 标志(Transmission Complete)置位,表示移位寄存器已空且无后续数据。
3.2.3 发送帧格式
| 字段 | 长度 | 说明 |
|---|---|---|
| 起始位 | 1 bit | 低电平,标志帧开始 |
| 数据位 | 7/8/9 bit | LSB 先发送,可配置 |
| 校验位 | 0/1 bit | 偶校验/奇校验/无校验 |
| 停止位 | 0.5/1/1.5/2 bit | 高电平,标志帧结束 |
低功耗提示:在空闲中断唤醒场景中,发送器通常处于关闭状态(TE=0),以降低静态功耗。仅在需要发送响应数据时才临时使能 TE 位。
3.3 接收器原理与数据流
接收器从 RX 引脚采样串行位流,重建并行数据并存入 RDR,同时产生状态标志供 CPU 或 DMA 读取。
3.3.1 接收使能与采样
- RE 位(CR1 寄存器 bit 2):置 1 使能接收器。RE 使能后,接收器开始检测 RX 引脚上的起始位。
- 起始位检测:接收器以 16 倍波特率采样 RX 引脚。连续采样到 3 个低电平样本(对应起始位中点)后确认帧开始。
- 数据采样:每个数据位在理论中点(第 8、9、10 个采样点)进行 3 次采样,采用多数表决逻辑决定位值。
3.3.2 数据接收与读取
- 移位寄存器逐位接收数据,完成一帧后并行加载到 RDR。
- RXNE 标志(SR/ISR):RDR 收到新数据时硬件置位,表示数据可读。读取 RDR 后 RXNE 自动清零。
- 如果 RXNE 未被及时清除,后续数据将导致溢出错误(ORE 标志置位)。
3.3.3 空闲帧检测
空闲帧(Idle Frame)是接收器在 RX 引脚上检测到连续 10 个(或 11 个,取决于数据位配置)高电平位后触发的特殊事件。空闲中断(IDLE 中断)是低功耗唤醒的核心机制:
- 当接收器检测到空闲帧时,IDLE 标志(SR/ISR)置位。
- 如果 CR1 中的 IDLEIE 位已使能,则产生中断请求。
- IDLE 标志不会在读取 RDR 时自动清除,需软件先读 SR 再读 RDR 来清零。
3.4 波特率发生器原理
波特率发生器从外设时钟(PCLK,通常为 APB 时钟)分频产生发送器和接收器所需的位时钟。STM32 USART 支持整数分频和小数分频两种模式,以实现高精度波特率。
3.4.1 分频公式
波特率 = f_PCLK / (16 × USARTDIV)
其中:
f_PCLK = USART 外设时钟频率(Hz)
USARTDIV = 无符号定点数,整数部分 12 bit,小数部分 4 bit
写入 BRR 寄存器:BRR = USARTDIV × 16
3.4.2 分频器结构
| 分频模式 | 精度 | 适用场景 |
|---|---|---|
| 整数分频(OVER8=0) | 16 倍过采样,精度 ±0.5% | 标准波特率(9600/115200/921600) |
| 小数分频(OVER8=1) | 8 倍过采样,精度 ±1.0% | 高波特率(≥2 Mbps)或非标准波特率 |
3.4.3 BRR 寄存器配置示例
假设 f_PCLK = 80 MHz,目标波特率 = 115200 bps,使用整数分频:
USARTDIV = 80,000,000 / (16 × 115200) = 43.4027...
BRR = round(43.4027 × 16) = 694
实际波特率 = 80,000,000 / (16 × (694/16)) = 115,273 bps
误差 = (115273 - 115200) / 115200 ≈ 0.063% ✅ 在允许范围内
常见错误:配置波特率时忽略小数分频的舍入误差。当误差超过 ±2% 时,接收器可能无法正确采样数据位中点,导致通信丢帧。建议使用 STM32CubeMX 的波特率计算工具验证。
3.4.4 波特率与低功耗的关系
- 低波特率(≤9600):分频系数大,时钟门控时间长,但位周期长,唤醒后需更长时间完成帧接收。
- 高波特率(≥115200):分频系数小,时钟门控时间短,但位周期短,对时钟精度要求高。
- 低功耗设计建议:在唤醒场景中,优先使用 9600 或 19200 bps,平衡唤醒延迟与功耗。
3.5 关键寄存器速查表
| 寄存器 | 偏移地址 | 关键位 | 功能描述 |
|---|---|---|---|
| CR1 | 0x00 | UE, RE, TE, IDLEIE, RXNEIE, TCIE | 控制 USART 使能、收发使能、中断使能 |
| CR2 | 0x04 | STOP[1:0], LINEN | 停止位长度、LIN 模式使能 |
| CR3 | 0x08 | DMAT, DMAR, RTSE, CTSE | DMA 使能、硬件流控制 |
| BRR | 0x0C | DIV_Mantissa[11:0], DIV_Fraction[3:0] | 波特率分频值 |
| SR / ISR | 0x10 / 0x1C | TXE, TC, RXNE, IDLE, ORE, FE | 状态标志位 |
| DR / RDR / TDR | 0x14 / 0x24 / 0x28 | DR[8:0] | 数据寄存器(读=RDR,写=TDR) |
低功耗设计关联:在进入低功耗模式前,应确保 UE=0(关闭 USART 时钟)、RE=0(关闭接收器)、TE=0(关闭发送器)。唤醒时按顺序:使能 USART 时钟 → 置位 UE → 配置波特率 → 置位 RE 并使能 IDLEIE → 等待空闲中断。