UART 知识

← UART 模块总览 | ← 主页

UART(串口)学习笔记:协议、波特率、电平、收发写法。

收发写法

笔记内容
UART发送程序阻塞 / 发送完成中断 / DMA 三种发送写法
UART接收程序中断 / DMA + 空闲中断 两种接收写法
printf配置printf 重定向到串口

协议要点

UART 是异步⭐的,就是没有时钟线,一个 TX、一个 RX、一个 GND(除非已经共地)。

硬件流控(RTS/CTS):接收缓冲区快满时通过 CTS 让对方暂停发送,防止数据丢失,这两个算可选。

UART 接收时,硬件依靠波特率时钟将引脚上的跳变一位一位送到移位寄存器中,满 8 位后再放到接收数据寄存器中,此时 RXNE(接收寄存器非空)标志位置 1,触发接收中断。

波特率

波特率自适应

  • 发送方先发特定字符(如 0x7F),接收方测量脉冲宽度自动计算波特率;
  • STM32 支持硬件自动波特率检测:利用起始位下降沿到特定边沿的时间推算。

波特率计算

波特率 = 时钟频率 / (分频系数 × 过采样倍数)

以 STM32 为例(APB 时钟 84MHz、过采样 16 倍):

BRR = 84000000 / (16 × 115200) = 45.57

取整为 45,实际波特率 = 84000000 / (16×45) = 116667,误差 = (116667-115200)/115200 ≈ 1.27%(±3% 以内可用)。

关键:误差不超过 ±3%,否则乱码;高波特率时误差更容易超标。

电平

三种电平的区别:RS485, RS232, TTL

USART

这里的 s 是 synchronous,增加了同步功能。