2. 波特率概念与计算
波特率(Baud Rate)是 UART 通信中最核心的时序参数,它决定了数据在串行线路上传输的速率。本章从定义出发,逐步推导常用波特率的计算方法,并分析时钟源误差对通信稳定性的影响。
2.1 波特率定义
波特率表示每秒传输的符号(Symbol)数量,单位为 baud(Bd)。在 UART 中,一个符号通常对应一个二进制位(bit),因此波特率与比特率(bit/s)数值相等。例如 115200 baud 即每秒传输 115200 个二进制位。
关键公式: 波特率 = 1 / 位时间(Bit Time)
位时间 = 波特率的倒数,例如 9600 baud 的位时间 ≈ 104.17 μs。
位时间 = 波特率的倒数,例如 9600 baud 的位时间 ≈ 104.17 μs。
UART 帧结构包含起始位、数据位、校验位和停止位,实际有效数据传输速率需扣除协议开销:
| 波特率 (baud) | 位时间 (μs) | 8N1 帧有效字节率 (B/s) | 典型应用场景 |
|---|---|---|---|
| 9600 | 104.17 | 960 | 调试终端、低速传感器 |
| 19200 | 52.08 | 1920 | 工业 Modbus、GPS 模块 |
| 115200 | 8.68 | 11520 | Wi-Fi/蓝牙模块、串口屏 |
| 921600 | 1.09 | 92160 | 高速数据采集、固件下载 |
经验法则: 115200 baud 是嵌入式开发中最通用的折中选择——速率足够快,且大多数 MCU 在常用时钟下能产生整数分频,误差极小。
2.2 常用波特率与时钟源关系
UART 波特率由系统时钟(或外设专用时钟)经过分频器产生。典型 MCU 的波特率发生器结构如下:
2.3 波特率误差分析
当系统时钟无法被目标波特率整除时,会产生分频误差。误差超过一定阈值会导致采样点偏移,引发帧错误或数据错位。
容差边界: UART 异步通信要求波特率误差通常 ≤ ±2%(理想 ≤ ±1.5%)。超过此范围,接收端在帧中间采样时可能误判位电平。
以下表格展示不同时钟频率下 115200 baud 的误差情况:
| 系统时钟 (MHz) | 目标波特率 | USARTDIV 计算值 | 实际波特率 | 误差 (%) | 可用性 |
|---|---|---|---|---|---|
| 16.000 | 115200 | 8.6806 → 8.5 | 117647 | +2.12 | ❌ 超差 |
| 14.7456 | 115200 | 8.0000 → 8.0 | 115200 | 0.00 | ✅ 完美 |
| 72.000 | 115200 | 39.0625 → 39.0 | 115385 | +0.16 | ✅ 可用 |
| 80.000 | 115200 | 43.4028 → 43.5 | 114943 | -0.22 | ✅ 可用 |
工程建议: 优先选择 14.7456 MHz、18.432 MHz、22.1184 MHz 等“串口友好”晶振频率,这些频率能被常用波特率整除,实现零误差分频。
2.4 波特率配置代码示例
以下为 STM32 HAL 库中波特率配置的核心代码,展示 USARTDIV 的计算与寄存器写入过程:
/* 假设系统时钟 72 MHz,目标波特率 115200 */
uint32_t pclk = 72000000; /* 外设时钟频率 */
uint32_t baud = 115200; /* 目标波特率 */
uint16_t usartdiv;
/* 计算分频系数:USARTDIV = pclk / (16 × baud) */
float div = (float)pclk / (16.0f * baud); /* 72e6 / (16*115200) = 39.0625 */
/* 取整数部分 */
uint16_t mantissa = (uint16_t)div; /* 39 */
/* 取小数部分,乘以 16 后取整(支持 1/16 步进) */
uint16_t fraction = (uint16_t)((div - mantissa) * 16.0f + 0.5f); /* 1 */
/* 组合 BRR 寄存器值 */
usartdiv = (mantissa << 4) | (fraction & 0x0F); /* 0x0271 */
/* 写入波特率寄存器 */
USART1->BRR = usartdiv;
避坑提示: 小数部分四舍五入时,务必加 0.5 后再取整,避免截断误差。若 fraction 计算值为 16,应进位到 mantissa 并将 fraction 置 0。
2.5 误差影响可视化
下图展示不同误差下接收端采样点的偏移情况:
2.6 波特率选择策略
- 低速场景(≤ 19200): 抗干扰能力强,适合长距离传输(RS-485 总线可达 1200m),但吞吐量低。
- 中速场景(115200): 嵌入式开发最常用,兼顾速率与稳定性,多数 MCU 在 8~72 MHz 时钟下误差可控。
- 高速场景(≥ 921600): 需配合 DMA 使用,对 PCB 走线、电平转换器响应速度要求高,建议使用 8 倍过采样模式降低分频误差。
波特率配置检查清单:
✅ 确认系统时钟频率(HSE/HSI/PLL 输出)
✅ 计算 USARTDIV 并验证误差 < 1.5%
✅ 检查过采样率设置(16× 或 8×)
✅ 双工通信双方波特率必须一致
✅ 长线传输时适当降低波特率以抑制信号反射
✅ 确认系统时钟频率(HSE/HSI/PLL 输出)
✅ 计算 USARTDIV 并验证误差 < 1.5%
✅ 检查过采样率设置(16× 或 8×)
✅ 双工通信双方波特率必须一致
✅ 长线传输时适当降低波特率以抑制信号反射