2. UART 协议基础

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种广泛使用的串行通信协议。在嵌入式系统中,UART 常用于设备间的短距离数据交换、调试信息输出以及与 PC 或模块(如蓝牙、GPS)的通信。理解其物理层、数据帧格式和波特率是进行 STM32 UART 开发的前提。

2.1 物理层:三线制连接

UART 通信在物理上至少需要三根线:TX、RX 和 GND。这是一种全双工通信方式,允许数据同时发送和接收。

关键连接规则: 设备 A 的 TX 必须连接设备 B 的 RX,设备 A 的 RX 必须连接设备 B 的 TX。GND 必须共地,以提供统一的参考电平。
信号线 全称 方向 功能描述
TX Transmit Data 输出 发送串行数据
RX Receive Data 输入 接收串行数据
GND Ground 公共 信号地参考

在空闲状态下,TX 和 RX 线通常保持在高电平(逻辑 1)。这种电平约定是异步通信的基础,用于区分数据帧的开始和结束。

UART 物理层三线制连接 设备 A (STM32) TX RX GND 设备 B (外设/PC) TX RX GND TX → RX RX ← TX GND (共地)
实战提示: 在 STM32 开发板上,通常使用 PA9 (TX1) 和 PA10 (RX1) 作为 USART1 的引脚。连接外部模块时,务必遵循“TX 接 RX,RX 接 TX”的交叉连接规则。

2.2 数据帧格式

UART 是异步通信,没有时钟线。接收方必须通过预先约定的帧格式来解析数据。一个标准的 UART 数据帧由以下部分组成:

  1. 起始位(Start Bit): 始终为逻辑 0(低电平)。当 TX 线从空闲的高电平跳变到低电平时,接收方检测到这一变化,开始准备接收数据。
  2. 数据位(Data Bits): 通常为 5 到 9 位。最常见的是 8 位数据。数据位在起始位之后发送,低位在前(LSB first)。
  3. 校验位(Parity Bit): 可选。用于简单的错误检测。可以是奇校验(Odd)或偶校验(Even)。如果不使用校验,则此位被省略。
  4. 停止位(Stop Bit): 始终为逻辑 1(高电平)。表示一帧数据的结束。停止位的长度可以是 1 位、1.5 位或 2 位。
帧字段 电平 位数 说明
起始位 低 (0) 1 同步接收时钟
数据位 高/低 5~9 实际传输的数据,LSB 先发
校验位 高/低 0 或 1 奇偶校验(可选)
停止位 高 (1) 1, 1.5, 2 帧结束,准备下一帧
UART 数据帧格式(8N1 示例) 空闲 高电平 起始 0 D0 LSB D1 D2 D3 D4 D5 D6 D7 MSB 停止 1 帧格式:1 起始位 + 8 数据位 + 无校验 + 1 停止位(8N1)
常见配置: 最常用的 UART 配置是 8N1,即 8 位数据位、无校验位、1 位停止位。在 STM32 的 USART 初始化中,这是默认设置之一。

2.3 波特率的概念与计算

波特率(Baud Rate)定义了每秒传输的符号数。在 UART 中,一个符号通常代表一个比特(bit),因此波特率也等于比特率。它决定了数据传输的速度。

  • 单位: bps(bits per second,位/秒)。
  • 常见值: 9600、19200、38400、115200、921600 等。
  • 要求: 通信双方的波特率必须一致,否则会导致数据错乱。

STM32 波特率计算

在 STM32 中,USART 的波特率由外设时钟(PCLK)和波特率寄存器(USART_BRR)共同决定。计算公式如下:

// 对于 USART 过采样模式(Over8 = 0,即 16 倍过采样)
Tx/Rx 波特率 = f_CK / (16 * USARTDIV)

// 其中:
// f_CK 是 USART 的外设时钟频率(如 72 MHz)
// USARTDIV 是一个无符号定点数,存储在 USART_BRR 寄存器中
// USARTDIV = f_CK / (16 * 目标波特率)

例如,若 f_CK = 72 MHz,目标波特率 = 115200 bps,则:

USARTDIV = 72000000 / (16 * 115200) = 39.0625

// 将 USARTDIV 拆分为整数部分和小数部分写入 USART_BRR:
// DIV_Mantissa = 39 (0x27)
// DIV_Fraction = 0.0625 * 16 = 1 (0x1)
// USART_BRR = (39 << 4) | 1 = 0x271
STM32 波特率计算流程 f_CK = 72 MHz 目标波特率 = 115200 USARTDIV = 72M / (16 * 115200) USARTDIV = 39.0625 USART_BRR = (39 << 4) | 1 = 0x271
开发技巧: 在 STM32 标准外设库或 HAL 库中,通常不需要手动计算 USART_BRR 的值。库函数会根据传入的时钟频率和目标波特率自动计算并配置寄存器。但理解其原理对于调试和解决波特率不匹配问题至关重要。

2.4 本章小结

本章介绍了 UART 通信的三大基础要素:

  • 物理层: 三线制(TX、RX、GND)全双工连接,必须共地。
  • 数据帧: 由起始位、数据位、可选校验位和停止位组成,最常用的是 8N1 格式。
  • 波特率: 决定通信速度,收发双方必须一致。STM32 通过 USART_BRR 寄存器基于外设时钟进行配置。