USART串口通讯
2026/9/12 20:53:14 网站建设 项目流程

首先讲解一下通信基础知识

可以把通信方式拆成三个互相独立的问题来看:

  1. 一次传几位?→ 串行 / 并行

  2. 能不能双向、能不能同时?→ 单工 / 半双工 / 全双工

  3. 接收方怎么知道每一位什么时候采?→ 同步 / 异步

这三者不是互斥的,而是可以组合。比如 UART 就是:串行 + 全双工 + 异步。SPI 是:串行 + 全双工 + 同步。I2C 是:串行 + 半双工 + 同步


一、串行与并行:一次传几位?

1. 串行传输

定义:数据一位一位地,在同一条数据线上按时间顺序发送。

比喻:单车道排队过车,一辆接一辆。

例子:

时间 → 1 0 1 1 0 0 1 0
线 → ──── 一位一位发 ────

优点:

  • 线少,成本低

  • 适合远距离

  • 抗干扰相对容易

  • 高速时更容易做差分、时钟恢复

  • 现代高速接口大多是串行,如 USB、PCIe、SATA、以太网

缺点:

  • 同样时钟频率下,一次只传 1 位,表面速率低

  • 需要并串转换、串并转换

2. 并行传输

定义:多位数据同时通过多条数据线发送。

比喻:多车道并排行驶。

例子:

D0 → 1
D1 → 0
D2 → 1
D3 → 1
... 同时传 8 位

优点:

  • 短距离内,同样时钟频率下吞吐量高

  • 控制简单,早期计算机总线常用

缺点:

  • 线多,引脚多,成本高

  • 线间容易串扰

  • 各条线延迟不同,会产生位偏斜 skew

  • 距离一长,多位很难同时到达

  • 高速时同步困难

所以现代趋势是:短距离、片内、旧总线可能并行;长距离、高速、外部连接大多串行。

一句话:
串行不一定慢,并行不一定快。高速串行现在反而是主流。


二、单工、半双工、全双工:往哪传?

这个维度看的是:通信双方能不能互相发,能不能同时发。

1. 单工

定义:只能一个方向传输。A 只能发给 B,B 不能发给 A。

比喻:单行道。

例子:

  • 广播电台

  • 电视遥控器

  • 某些单向传感器

特点:

  • 最简单

  • 不需要反向信道

  • 但无法确认、无法重传、无法交互

2. 半双工

定义:双方都能发,但不能同时发,同一时刻只能一方发、另一方收。

比喻:对讲机。你说完“Over”,对方才能说。

例子:

  • 对讲机

  • RS-485 两线总线

  • I2C

  • 某些无线模块

特点:

  • 省线

  • 需要切换收发方向

  • 有转向时间,效率低于全双工

  • 容易发生总线冲突,需要仲裁或主从控制

3. 全双工

定义:双方可以同时发送和接收

比喻:打电话。双方可以同时说话,虽然通常会礼貌轮流。

例子:

  • 电话

  • UART:TX 和 RX 独立

  • SPI:MOSI 和 MISO 独立

  • 以太网交换机全双工模式

特点:

  • 效率高

  • 不需要频繁切换方向

  • 通常需要独立的发送和接收通道,或频率/编码上分离

注意:
全双工是逻辑能力,不一定等于“必须两根线”。
比如电话两线也能全双工,因为它通过混合电路和频率分离实现。UART 则通常用 TX、RX 两根数据线加 GND。


三、同步与异步:怎么对齐每一位?

这个维度看的是:接收方怎么知道每一位的边界和采样时刻。

1. 异步通信

定义:没有共享时钟线。发送方和接收方各自用本地时钟,靠起始位、停止位和约定波特率来对齐每一个字符。

典型代表:UART。

一帧常见格式:

空闲高 | 起始位低 | D0 D1 D2 D3 D4 D5 D6 D7 | 校验 | 停止位高 | 空闲高

工作方式:

  • 线路空闲是高电平

  • 发送方拉低一个起始位

  • 接收方检测到下降沿,开始按波特率采样

  • 每个字符重新同步一次

  • 双方波特率必须接近,否则会错位

优点:

  • 线少,简单

  • 不需要时钟线

  • 适合低速、短报文、调试串口

缺点:

  • 每帧有起始位、停止位开销

  • 高速时效率下降

  • 波特率误差不能太大

  • 不适合超高速连续数据流

一句话:
异步不是没有时钟,而是没有共享时钟线,靠起始位和本地时钟重新同步。

2. 同步通信

定义:发送方和接收方使用同一个时钟节拍。通常有一根时钟线,或者接收方从数据中恢复时钟。

典型代表:

  • SPI:SCK 时钟线

  • I2C:SCL 时钟线

  • USART 同步模式:CK 时钟线

  • 以太网、PCIe:从数据流中恢复时钟

优点:

  • 没有起始位、停止位开销

  • 数据可以连续传

  • 速率高

  • 效率高

缺点:

  • 需要时钟线,或者复杂的时钟恢复电路

  • 距离远时时钟和数据可能偏斜

  • 主从、时序要求更严格

一句话:
同步通信靠统一节拍传,异步通信靠起始位重新对齐。


四、三者组合:常见接口长什么样?

接口串行/并行方向同步/异步常见线
UART串行全双工异步TX、RX、GND
USART 异步串行全双工异步TX、RX、GND
USART 同步串行全双工/半双工同步TX、RX、CK
SPI串行通常全双工同步SCK、MOSI、MISO、SS
I2C串行半双工同步SCL、SDA
RS-485串行半双工异步A、B
旧并口并行半双工/全双工通常同步/选通D0~D7 + 控制线

所以,以后看到一个新接口,可以问自己三个问题:

  1. 它是串行还是并行?

  2. 它是单工、半双工还是全双工?

  3. 它是同步还是异步?

比如:

  • UART:串行、全双工、异步。

  • SPI:串行、全双工、同步。

  • I2C:串行、半双工、同步。

  • RS-485:串行、半双工、异步。

  • USB:串行、半双工/全双工按版本和模式,异步/同步混合,内部复杂。


五、一句话总结

  • 串行 vs 并行:一次传 1 位,还是一次传多位。

  • 单工 vs 半双工 vs 全双工:只能单向,还是双向但不能同时,还是可以同时双向。

  • 同步 vs 异步:有没有共享时钟节拍;异步靠起始位和波特率重新对齐,同步靠时钟线或时钟恢复。

最实用的记忆:

UART = 串行 + 异步 + 全双工
SPI = 串行 + 同步 + 全双工
I2C = 串行 + 同步 + 半双工
RS-485 = 串行 + 异步 + 半双工

这是USART框图

我们按照“数据怎么流 → 谁在控制 → 时钟怎么来 → 状态怎么查 → 高级功能怎么用”的顺序,循序渐进地把这张图拆解清楚。


第一步:看全局——数据是怎么收发和缓存的?(图的顶部)

先看最上面的一排,这是数据(CPU/DMA 与 USART 之间的交互)的通道。

1. 发送路径(左侧)

  • PWDATA(Peripheral Write Data):CPU 或 DMA 把要发送的数据写进来。

  • 发送数据寄存器 (TDR):数据先存到这里。注意,它是个缓冲区

  • 发送移位寄存器:TDR 里的数据会自动“倒”进这里,然后一位一位地从TX引脚发出去。

  • 精髓:TDR 和移位寄存器是双缓冲的。这意味着,当移位寄存器正在发第一个字节时,CPU/DMA 已经可以把第二个字节写入 TDR。这样就能实现连续不间断发送,极大提高效率。

2. 接收路径(右侧)

  • RX引脚收到数据,一位一位进入接收移位寄存器

  • 收满一个字节后,整个字节被“倒”进接收数据寄存器 (RDR)

  • CPU 或 DMA 通过PRDATA(Peripheral Read Data)把数据读走。

  • 精髓:同样是双缓冲。当 CPU 还没读走 RDR 里的旧数据时,移位寄存器还能继续接收新数据,给 CPU 留出反应时间(但如果 RDR 没读走,新数据又来了,就会发生溢出错误 ORE)。


第二步:看控制——谁在指挥这些数据?(图中部)

数据不会自己流动,需要“指挥官”。图中间那一大块控制逻辑和寄存器就是指挥官。

1. 控制寄存器(CR1, CR2, CR3)

这三个寄存器决定了 USART 怎么工作:

  • CR1(最核心)

    • UE:USART 总开关。

    • M:字长(8位或9位)。

    • PCE,PS,PEIE:校验位使能、奇偶选择、校验中断使能。

    • TE,RE发送使能 (Transmit Enable)接收使能 (Receive Enable)

    • TXEIE,TCIE,RXNEIE,IDLEIE:各种中断使能(后面讲)。

  • CR2

    • STOP:停止位长度(1位、1.5位、2位)。

    • CLKEN,CPOL,CPHA,LBCL同步模式下的时钟控制(极性、相位)。

    • LINE:LIN 总线模式。

  • CR3

    • DMAT,DMAR:DMA 发送/接收使能。

    • HDSEL半双工模式选择。

    • IREN,IRLP:IrDA 红外通信使能。

    • SCEN,NACK:智能卡模式。

2. 发送器控制 / 接收器控制 / 唤醒单元

这三个模块是直接执行 CR 寄存器命令的“执行器”,它们控制移位寄存器的启停、采样时机,以及多机通信时的唤醒逻辑。


第三步:看心跳——波特率是怎么产生的?(图底部)

这是 USART 极其关键的部分。

  • fPCLK(x1, x2):来自 APB 总线(通常是 PCLK1 或 PCLK2)的时钟源。

  • USART_BRR(波特率寄存器):里面写着DIV_Mantissa(整数部分)和DIV_Fraction(小数部分)。

  • USARTDIV:计算公式在左下角:USARTDIV = DIV_Mantissa + (DIV_Fraction / 16)

  • 波特率发生器:用fPCLK除以USARTDIV,再经过/16的过采样,产生发送器时钟接收器时钟

  • 注意TERE信号不仅控制引脚,还控制着波特率发生器。如果你不使能发送或接收,对应的时钟就不会输出,外设就不工作。


第四步:看神经系统——状态与中断(图左下方)

数据收发过程中,CPU 怎么知道“可以发下一个了”或者“收到新数据了”?靠的是状态寄存器 (SR)中断控制

看左下角的USART 中断控制SR寄存器:

  • TXE (Transmit Data Register Empty):TDR 空了,可以写下一个数据了。如果TXEIE开启,就会触发中断。这是最常用的发送中断。

  • TC (Transmission Complete):整个数据发完了,包括停止位都发完了。用于 RS-485 切换收发方向,或者进入低功耗模式前。

  • RXNE (Read Data Register Not Empty):RDR 里有新数据了,快来读!如果RXNEIE开启,就会触发中断。这是最常用的接收中断。

  • IDLE (Idle Line Detected):总线空闲了。非常经典的应用:接收不定长数据。一帧数据发完,总线空闲,触发 IDLE 中断,CPU 就知道一帧结束了。

  • 错误标志

    • ORE(Overrun Error):数据没来得及读,被覆盖了。

    • NE(Noise Error):噪声检测。

    • FE(Framing Error):帧错误(比如停止位没收到)。

    • PE(Parity Error):校验错误。


第五步:看拓展能力——框图中的“周边模块”

除了最基础的异步串口,这张图还展示了 STM32 赋予 USART 的“超能力”:

  1. 硬件数据流控 (nRTS, nCTS):图左侧。当接收缓冲区快满时,拉高 nRTS 告诉对方别发了;发送前检查 nCTS,对方没准备好就暂停。防止数据丢失。

  2. 同步模式 (SCLK):图右上角。CLKEN使能后,USART 可以输出时钟,变成类似 SPI 的同步通信(支持主从模式)。

  3. IrDA SIR 编码/解码模块:图左上角。用于红外通信,通过IRDA_OUTIRDA_IN收发。

  4. 智能卡 (Smartcard):图左上角。支持 ISO 7816 协议,用于读卡器。

  5. 多机通信 (USART 地址):图中间。支持 LIN 总线或地址位唤醒模式,多个从机挂在一根总线上,通过地址匹配唤醒特定从机。


第六步:融会贯通——发送一个字节的完整流程

假设你要用查询方式(Polling)发送一个字节'A'(0x41),配置为 115200 8N1:

  1. 配置阶段:写CR1UE=1TE=1M=0(8位);写CR2STOP=00(1位停止位);写BRR设置波特率。

  2. 等待:CPU 不断读取SR寄存器,检查TXE位是否为 1。

  3. 写入TXE=1时,CPU 把0x41写入TDR(即 PWDATA)。

  4. 硬件动作:硬件自动把0x41从 TDR 搬到发送移位寄存器,并在 TX 引脚上:拉低起始位 → 发 8 位数据(LSB先发)→ 发停止位(高电平)。

  5. 完成:发送移位寄存器空了,硬件自动把TXE置 1,等待下一个字节;如果所有数据发完,TC位会被置 1。

如果是用中断或 DMA,就把第 2 步的等待换成配置TXEIE=1DMAT=1,硬件会在合适的时候自动通知 CPU 或直接搬运数据,CPU 就可以去干别的事了。


总结这张图的核心思想

这张图展示了一个经典的数字外设设计模式:

“数据通道(TDR/RDR/移位寄存器) + 控制通道(CR1/CR2/CR3) + 时钟通道(BRR/波特率发生器) + 状态反馈(SR/中断) + 扩展功能(流控、同步、IrDA)”

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询