2. MCU 串口硬件结构:USART 模块深度解析

在编写高效、可靠的 UART 中断服务函数之前,必须深入理解 MCU 内部 USART 模块的硬件构成。本章将拆解 USART 的四大核心单元:模块框图、发送器、接收器以及波特率发生器,并解析硬件流控制(RTS/CTS)的工作原理。

2.1 USART 模块整体框图

下图展示了典型 MCU 中 USART 模块的内部架构。数据流从 CPU/总线接口进入,经过发送器或接收器路径,最终通过外部引脚与外界通信。波特率发生器为收发双方提供精确的移位时钟。

USART 模块内部架构框图 USART 模块内部架构框图 CPU / 总线接口 控制寄存器组 发送器 (TDR + 移位寄存器) 接收器 (RDR + 移位寄存器) 波特率发生器 硬件流控 TX / RX RTS / CTS 说明: • 数据经总线写入 TDR,由发送移位寄存器逐位输出 • 接收数据由移位寄存器逐位采集,存入 RDR 供 CPU 读取 • 波特率发生器为收发移位寄存器提供时钟基准
关键理解:USART 模块内部包含两条独立的数据路径——发送路径和接收路径。它们共享波特率发生器,但拥有各自的移位寄存器和数据寄存器。这种双缓冲结构允许 CPU 在后台处理数据时,硬件仍在进行串行移位操作。

2.2 发送器结构详解

发送器负责将并行数据转换为串行位流,并通过 TX 引脚输出。其核心组件包括:

组件 功能描述 中断触发条件
发送数据寄存器 (TDR) CPU 写入待发送数据的缓冲寄存器,深度通常为 1 字节 —
发送移位寄存器 (TSR) 从 TDR 加载数据,按波特率时钟逐位移出到 TX 引脚 —
发送数据寄存器空标志 (TXE) 指示 TDR 已空,CPU 可以写入下一个字节 TXE 置位时触发发送中断
发送完成标志 (TC) 指示 TSR 移位完成且 TX 引脚已输出停止位 TC 置位时触发发送完成中断
驱动开发提示:在中断服务函数中,通常检查 TXE 标志来发送下一个字节。如果使用 DMA 发送,则关注 TC 标志以确保最后一帧完全发送完毕后再关闭外设。

2.3 接收器结构详解

接收器从 RX 引脚采集串行位流,将其转换为并行数据。其核心组件包括:

组件 功能描述 中断触发条件
接收数据寄存器 (RDR) 存储已接收完成的字节,供 CPU 读取 —
接收移位寄存器 (RSR) 按波特率时钟从 RX 引脚逐位采集数据 —
接收数据寄存器非空标志 (RXNE) 指示 RDR 中有新数据等待读取 RXNE 置位时触发接收中断
溢出错误标志 (ORE) RDR 中数据未被读取前,新数据覆盖导致溢出 ORE 置位时触发错误中断
常见陷阱:接收中断服务函数中,必须先读取 RDR 数据,再清除 RXNE 标志。如果先清标志再读数据,可能导致数据丢失或触发 ORE 错误。标准流程为:读取 RDR → 处理数据 → 硬件自动清除 RXNE。

2.4 波特率发生器

波特率发生器为 USART 提供精确的移位时钟。其计算公式如下:

// 标准 USART 波特率计算公式
// 过采样模式:oversampling = 16 (常用) 或 8
// USARTDIV = 外设时钟频率 / (oversampling * 目标波特率)

// 示例:系统时钟 72 MHz,目标波特率 115200,过采样 16
// USARTDIV = 72000000 / (16 * 115200) = 39.0625

// 整数部分:DIV_Mantissa = 39
// 小数部分:DIV_Fraction = 0.0625 * 16 = 1

// 写入波特率寄存器:
// BRR = (DIV_Mantissa << 4) | DIV_Fraction
// BRR = (39 << 4) | 1 = 625
参数 说明 典型值
外设时钟频率 USART 模块挂载的时钟源(APB1/APB2) 36 MHz / 72 MHz
过采样率 每个数据位采样的时钟周期数 16(标准)或 8(高速)
USARTDIV 分频系数,包含整数和小数部分 取决于目标波特率
实际波特率误差 应控制在 ±2% 以内,否则通信可能失败 < 2%

2.5 硬件流控制(RTS/CTS)

硬件流控制通过 RTS(请求发送)和 CTS(清除发送)信号线,实现收发双方的数据流同步,防止接收缓冲区溢出。

RTS/CTS 硬件流控制连接图 RTS / CTS 硬件流控制连接图 设备 A TX → 连接至 B 的 RX RX ← 连接至 B 的 TX RTS (输出) → B 的 CTS CTS (输入) ← B 的 RTS 设备 B TX → 连接至 A 的 RX RX ← 连接至 A 的 TX RTS (输出) → A 的 CTS CTS (输入) ← A 的 RTS 实线:数据线 (TX/RX) | 虚线:流控线 (RTS/CTS) | RTS 为输出,CTS 为输入

RTS/CTS 工作流程:

  1. 接收方准备就绪:设备 B 的接收缓冲区有空闲空间时,其 RTS 引脚输出有效电平(低电平),通知设备 A 可以发送数据。
  2. 发送方检测 CTS:设备 A 在发送数据前,检查其 CTS 引脚电平。若 CTS 为有效电平,则允许发送;否则暂停发送。
  3. 接收方缓冲区满:当设备 B 的接收缓冲区接近满时,其 RTS 引脚输出无效电平(高电平),设备 A 检测到 CTS 无效后立即停止发送。
  4. 恢复发送:设备 B 处理完数据后,重新拉低 RTS,设备 A 检测到 CTS 有效后继续发送。
驱动开发要点:启用硬件流控制时,需要在 USART 初始化时配置 RTS/CTS 引脚为复用功能,并设置 CR3 寄存器中的 RTSE 和 CTSE 位。中断服务函数中无需手动控制 RTS 引脚——硬件自动根据 RDR 状态驱动 RTS 电平变化。

2.6 本章小结

硬件单元 核心寄存器/标志 中断服务函数关注点
发送器 TDR、TXE、TC TXE 中断发送下一字节;TC 中断确认发送完成
接收器 RDR、RXNE、ORE RXNE 中断读取数据;ORE 中断处理溢出错误
波特率发生器 BRR (Mantissa + Fraction) 初始化时计算并写入,中断中无需干预
硬件流控制 CR3 (RTSE/CTSE) 硬件自动管理 RTS/CTS,中断中只需处理数据