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)。这种电平约定是异步通信的基础,用于区分数据帧的开始和结束。
实战提示: 在 STM32 开发板上,通常使用 PA9 (TX1) 和 PA10 (RX1) 作为 USART1 的引脚。连接外部模块时,务必遵循“TX 接 RX,RX 接 TX”的交叉连接规则。
2.2 数据帧格式
UART 是异步通信,没有时钟线。接收方必须通过预先约定的帧格式来解析数据。一个标准的 UART 数据帧由以下部分组成:
- 起始位(Start Bit): 始终为逻辑 0(低电平)。当 TX 线从空闲的高电平跳变到低电平时,接收方检测到这一变化,开始准备接收数据。
- 数据位(Data Bits): 通常为 5 到 9 位。最常见的是 8 位数据。数据位在起始位之后发送,低位在前(LSB first)。
- 校验位(Parity Bit): 可选。用于简单的错误检测。可以是奇校验(Odd)或偶校验(Even)。如果不使用校验,则此位被省略。
- 停止位(Stop Bit): 始终为逻辑 1(高电平)。表示一帧数据的结束。停止位的长度可以是 1 位、1.5 位或 2 位。
| 帧字段 | 电平 | 位数 | 说明 |
|---|---|---|---|
| 起始位 | 低 (0) | 1 | 同步接收时钟 |
| 数据位 | 高/低 | 5~9 | 实际传输的数据,LSB 先发 |
| 校验位 | 高/低 | 0 或 1 | 奇偶校验(可选) |
| 停止位 | 高 (1) | 1, 1.5, 2 | 帧结束,准备下一帧 |
常见配置: 最常用的 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 标准外设库或 HAL 库中,通常不需要手动计算 USART_BRR 的值。库函数会根据传入的时钟频率和目标波特率自动计算并配置寄存器。但理解其原理对于调试和解决波特率不匹配问题至关重要。
2.4 本章小结
本章介绍了 UART 通信的三大基础要素:
- 物理层: 三线制(TX、RX、GND)全双工连接,必须共地。
- 数据帧: 由起始位、数据位、可选校验位和停止位组成,最常用的是 8N1 格式。
- 波特率: 决定通信速度,收发双方必须一致。STM32 通过 USART_BRR 寄存器基于外设时钟进行配置。