3. STM32 串口外设架构:USART 框图、发送器/接收器原理、波特率发生器

通用同步异步收发器(USART)是 STM32 中最灵活的外设之一。理解其内部数据路径、控制逻辑和时钟分频机制,是后续实现空闲中断唤醒与 DMA 协同策略的硬件基础。本节从顶层框图出发,逐步拆解发送器、接收器与波特率发生器三个核心模块。

3.1 USART 内部架构总览

下图展示了 STM32 USART 模块的核心数据流与控制路径。发送器和接收器共享同一个波特率发生器,但拥有独立的移位寄存器、数据寄存器(TDR/RDR)和 FIFO(部分系列支持)。

STM32 USART 内部架构框图 STM32 USART 内部架构框图 波特率发生器 USARTDIV + 小数分频 发送数据寄存器 (TDR) 发送移位寄存器 TX 引脚 接收数据寄存器 (RDR) 接收移位寄存器 RX 引脚 控制寄存器 (CR1/2/3) 状态寄存器 (SR/ISR) 中断 / DMA 请求 关键设计要点: • 发送器与接收器完全独立,可同时工作(全双工)。 • 波特率发生器为发送和接收提供相同的采样时钟,确保双方速率一致。 • 中断/DMA 请求由状态寄存器中的标志位(TXE、RXNE、IDLE 等)触发。
架构要点: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 移位与串行输出

  1. 数据从 TDR 转移到发送移位寄存器(TSR)——该操作在 TXE 置位后的下一个波特率时钟边沿完成。
  2. TSR 按 LSB 优先顺序逐位移出,经过 TX 引脚输出。
  3. 发送完成后,TC 标志(Transmission Complete)置位,表示移位寄存器已空且无后续数据。

3.2.3 发送帧格式

字段长度说明
起始位1 bit低电平,标志帧开始
数据位7/8/9 bitLSB 先发送,可配置
校验位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 数据接收与读取

  1. 移位寄存器逐位接收数据,完成一帧后并行加载到 RDR。
  2. RXNE 标志(SR/ISR):RDR 收到新数据时硬件置位,表示数据可读。读取 RDR 后 RXNE 自动清零。
  3. 如果 RXNE 未被及时清除,后续数据将导致溢出错误(ORE 标志置位)。

3.3.3 空闲帧检测

空闲帧(Idle Frame)是接收器在 RX 引脚上检测到连续 10 个(或 11 个,取决于数据位配置)高电平位后触发的特殊事件。空闲中断(IDLE 中断)是低功耗唤醒的核心机制:

  • 当接收器检测到空闲帧时,IDLE 标志(SR/ISR)置位。
  • 如果 CR1 中的 IDLEIE 位已使能,则产生中断请求。
  • IDLE 标志不会在读取 RDR 时自动清除,需软件先读 SR 再读 RDR 来清零。
空闲帧检测时序图 空闲帧检测时序(8N1 格式) 数据帧 1 数据帧 2 空闲帧(≥10 bit 高电平) t0 t1 t2 t3 RXNE 置位 IDLE 置位 空闲帧检测不依赖数据内容,仅检测 RX 引脚电平持续时间,因此非常适合作为唤醒信号。

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,平衡唤醒延迟与功耗。
波特率发生器分频结构 波特率发生器分频结构 f_PCLK ÷ (16 × USARTDIV) BRR 寄存器 位时钟 发送器 接收器 分频精度影响: • 整数分频:BRR 为整数,适合标准波特率。 • 小数分频:BRR 含小数部分(4 bit),可精确匹配非标准波特率,但需注意 OVER8 位配置。

3.5 关键寄存器速查表

寄存器偏移地址关键位功能描述
CR10x00UE, RE, TE, IDLEIE, RXNEIE, TCIE控制 USART 使能、收发使能、中断使能
CR20x04STOP[1:0], LINEN停止位长度、LIN 模式使能
CR30x08DMAT, DMAR, RTSE, CTSEDMA 使能、硬件流控制
BRR0x0CDIV_Mantissa[11:0], DIV_Fraction[3:0]波特率分频值
SR / ISR0x10 / 0x1CTXE, TC, RXNE, IDLE, ORE, FE状态标志位
DR / RDR / TDR0x14 / 0x24 / 0x28DR[8:0]数据寄存器(读=RDR,写=TDR)
低功耗设计关联:在进入低功耗模式前,应确保 UE=0(关闭 USART 时钟)、RE=0(关闭接收器)、TE=0(关闭发送器)。唤醒时按顺序:使能 USART 时钟 → 置位 UE → 配置波特率 → 置位 RE 并使能 IDLEIE → 等待空闲中断。