在嵌入式系统开发中,通信是至关重要的一部分。在电赛中,我们往往会用到STM32开发板、CanMV开发板、树莓派等板载计算机,他们之间要进行数据的交换就必须进行通信。而USART(通用同步 / 异步收发传输器)作为一种常见的串行通信接口,广泛应用于各种设备之间的数据传输。本文将详细介绍USART的工作原理、特点,并给出基于STM32单片机的代码实现示例。

简单介绍一下USART:

USARTUniversal Synchronous Asynchronous Receiver Transmitter,即通用同步异步收发器。其核心功能是实现串行通信,它支持同步通信(需要时钟信号同步)和异步通信(无需时钟信号,依赖波特率同步)。

与UART的区别:

UARTUniversal Asynchronous Receiver Transmitter,即通用异步收发器,仅支持异步通信。

USART 比 UART 多一个 同步时钟输出功能(对应引脚 CLK),可在通信中提供时钟信号。实际应用中,由于串口通信极少使用同步模式,USART与UART在异步模式下可视为等价的,硬件驱动和配置流程基本一致。

USART的特性:

可以灵活切换通信模式:

  • 异步模式:
    • 无需时钟信号,双方通过波特率约定数据传输的速率。
    • 数据帧包含起始位、数据位、校验位(可选)、停止位,通过 TX/RX 引脚完成收发。
  • 同步模式:
    • 通过CLK引脚输出时钟信号,用于同步发送方和接收方的时序。
    • 时钟频率与波特率一致,可兼容SPI等需要时钟的协议,但仅支持时钟输出,不支持输入,因此无法实现两个USART设备间的同步通信

硬件可自动处理

  • 数据帧的生成与解析
    • 发送时,自动将数据寄存器(TDR)中的字节转换为符合协议的波形(如添加起始位、停止位),通过TX引脚输出。
    • 接收时,自动从RX引脚读取波形,按协议解析为字节数据存入接收寄存器(RDR)。
  • 双缓存机制
    • 发送端:TDR(写缓冲)与发送移位寄存器配合,允许连续写入数据,提升传输效率。
    • 接收端:RDR(读缓冲)与接收移位寄存器配合,避免数据丢失。

可配置参数

  • 波特率:最高支持 4.5 Mbps,通过内部波特率发生器(分频器)配置。
    • 数据位长度:8 位(无校验)或 9 位(含 1 位奇偶校验位)。
    • 停止位长度:0.5/1/1.5/2 位,常用 1 位。
    • 校验方式:无校验、奇校验、偶校验。

USART工作原理:

数据传输路径:

发送路径:

流程:CPU(并行数据) -> 移位寄存器 -> GPIO引脚(串行位流)

  1. 写入数据寄存器 (TDR)
    • CPU 或 DMA 控制器通过内部数据总线,将 8 位或 9 位的并行数据写入 发送数据寄存器 (TDR)
    • 注意:此时数据暂存在 TDR 中。
  2. 传输至移位寄存器
    • 发送移位寄存器为空(上一个数据发送完毕)时,TDR 中的数据会自动被硬件转移到发送移位寄存器中。
    • 一旦数据转移完成,状态寄存器中的 TXE (发送数据寄存器空) 标志置 1,提示 CPU 可以写入下一个数据了(实现了双缓冲,提高了效率)。
  3. 串行移位输出
    • 发送控制器根据配置的波特率产生时钟。
    • 在时钟驱动下,发送移位寄存器将数据逐位向右(或向左)移动。
    • 协议处理:硬件会自动在数据位前面插入起始位,在后面插入校验位(如果启用)和停止位
  4. 输出引脚 (TX)
    • 最终,处理好的完整帧(起始位+数据+校验+停止位)以串行位流的形式,通过 TX 引脚 输出到外部设备。

接收路径:

流程:GPIO引脚(串行位流) -> 移位寄存器 -> 数据寄存器 (RDR) -> CPU

  1. 输入引脚 (RX) 采样
    • 外部设备将串行数据发送到 RX 引脚
    • USART 的接收控制器根据波特率(通常是波特率的 16 倍或 8 倍频率)对 RX 引脚进行采样,以检测起始位的到来并同步时序。
  2. 移位寄存器组装
    • 检测到起始位后,接收移位寄存器开始在时钟控制下,逐位采集 RX 引脚上的电平(0 或 1)。
    • 协议处理:硬件会自动剥离起始位停止位,并进行校验位检查(如果启用)。
  3. 传输至数据寄存器 (RDR)
    • 当一个完整的数据帧(8 或 9 位数据)全部移入接收移位寄存器后,该数据会被并行转移到 接收数据寄存器 (RDR) 中。
    • 此时,状态寄存器中的 RXNE (接收数据寄存器非空) 标志置 1,同时可能会触发中断通知 CPU 读取数据。
  4. CPU 读取
    • CPU 或 DMA 控制器通过内部总线读取 RDR 中的数据。
    • 读取完成后,RXNE 标志自动清零,等待下一次接收。

双缓冲机制:

  • 发送时:CPU 只要往 TDR 塞数据就可以走了,移位寄存器会在后台慢慢把数据一位一位发出去。
  • 接收时:移位寄存器在后台一位一位收数据,收满了一整字节就扔到 RDR 里,CPU 随时可以去 RDR 拿走现成的字节。