2. MCU串口硬件结构
在编写高效、可靠的 UART 中断服务函数之前,必须深入理解 MCU 内部 USART 模块的硬件构成。本章将拆解 USART 的四大核心单元:模块框图、发送器、接收器以及波特率发生器,并解析硬件流控制(RTS/CTS)的工作原理。
2.1 USART 模块整体框图
下图展示了典型 MCU 中 USART 模块的内部架构。数据流从 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 工作流程:
- 接收方准备就绪:设备 B 的接收缓冲区有空闲空间时,其 RTS 引脚输出有效电平(低电平),通知设备 A 可以发送数据。
- 发送方检测 CTS:设备 A 在发送数据前,检查其 CTS 引脚电平。若 CTS 为有效电平,则允许发送;否则暂停发送。
- 接收方缓冲区满:当设备 B 的接收缓冲区接近满时,其 RTS 引脚输出无效电平(高电平),设备 A 检测到 CTS 无效后立即停止发送。
- 恢复发送:设备 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,中断中只需处理数据 |