2. UART硬件原理:帧格式、波特率生成、收发FIFO与流控机制

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是嵌入式系统中最基础、最广泛使用的串行通信接口。理解其硬件原理是驱动开发的前提,尤其是在引入DMA传输与CPU中断协同工作模式时,硬件细节直接决定了软件架构的设计。

2.1 UART帧格式

UART采用异步通信方式,收发双方无需共享时钟信号,而是通过约定的帧格式和波特率进行数据同步。一个完整的UART数据帧由以下部分组成:

字段 位宽 说明
起始位 1 bit 固定为逻辑低电平(0),标志数据帧开始,用于接收端同步时钟。
数据位 5~9 bits 实际传输的数据内容,通常为8 bits(LSB first)。
校验位 0/1 bit 可选奇校验(Odd)或偶校验(Even),用于检错。
停止位 1/1.5/2 bits 固定为逻辑高电平(1),标志数据帧结束,提供帧间间隔。
驱动开发要点:在配置UART控制器时,必须确保收发双方的帧格式完全一致(数据位、校验位、停止位)。驱动初始化阶段通常通过结构体(如 struct uart_port 或硬件寄存器)设置这些参数。
典型配置示例(8N1):8数据位、无校验、1停止位,这是最常用的UART帧格式,占10 bits(1起始 + 8数据 + 1停止)。
UART帧格式结构图 UART帧格式结构图(8N1) 起始位 1 bit (0) 数据位 bit0 (LSB) 数据位 bit1 数据位 bit2~bit6 数据位 bit7 (MSB) 校验位 无 (N) 停止位 1 bit (1) 一帧总长度 = 1起始 + 8数据 + 0校验 + 1停止 = 10 bits

2.2 波特率生成

波特率(Baud Rate)定义了每秒传输的符号数,在UART中等于比特率(bps)。收发双方必须使用相同的波特率才能正确通信。波特率生成通常由UART控制器内部的时钟分频器实现。

波特率计算公式

波特率 = 时钟频率 / (16 × 分频系数)

其中:
- 时钟频率:UART模块的输入时钟(如APB总线时钟)
- 16:过采样率(大多数UART使用16倍过采样)
- 分频系数:可编程的分频寄存器值(通常为16位整数 + 小数分频)
常见波特率与分频系数示例(时钟频率 = 50 MHz):
目标波特率 分频系数(整数部分) 分频系数(小数部分) 实际波特率 误差
115200 27 0.13 115,207 0.006%
921600 3 0.39 921,659 0.006%
9600 325 0.52 9,600 0.000%
驱动开发避坑:波特率误差必须控制在 ±2% 以内,否则接收端采样点偏移会导致帧错误(Framing Error)。在驱动初始化时,应优先选择整数分频系数,或使用支持小数分频(Fractional Baud Rate Generator)的UART控制器。
波特率生成原理图 波特率生成原理图 时钟源 50 MHz 分频器 ÷ (16 × 分频系数) 波特率时钟 115200 Hz 分频系数 = 时钟频率 / (16 × 目标波特率)

2.3 收发FIFO

FIFO(First In First Out,先进先出)是UART控制器内部用于缓冲收发数据的硬件队列。FIFO的存在极大地减少了CPU中断频率,是DMA传输与CPU中断协同工作的硬件基础。

FIFO的关键参数

  • 深度:通常为16字节、32字节或64字节。深度越大,CPU响应时间裕量越大。
  • 触发阈值:可编程的FIFO填充级别,当FIFO中的数据量达到阈值时触发中断。例如:RX FIFO阈值设为8字节,则每收到8字节产生一次接收中断。
  • 超时中断:当RX FIFO非空但未达到阈值时,启动超时定时器,超时后触发中断,防止数据滞留。
FIFO工作模式对比:
模式 中断频率 CPU负载 适用场景
无FIFO(传统模式) 每字节1次中断 极高 低波特率、简单系统
FIFO + 中断 每N字节1次中断 中等 中高波特率、通用驱动
FIFO + DMA 每DMA传输完成1次中断 极低 高波特率、大数据量传输
UART FIFO收发缓冲示意图 UART FIFO收发缓冲示意图 TX FIFO(发送缓冲) 数据字节 3 数据字节 2 数据字节 1 RX FIFO(接收缓冲) 数据字节 A 数据字节 B 数据字节 C CPU/DMA 读写 FIFO深度 = 16字节,触发阈值可编程(如8字节),超时中断防止数据滞留

2.4 流控机制

流控(Flow Control)用于协调收发双方的数据传输速率,防止接收端因处理不及时导致数据丢失。UART支持硬件流控和软件流控两种方式。

硬件流控(RTS/CTS)

  • RTS(Request to Send):输出信号,接收端通过拉低RTS通知发送端“可以发送”;拉高RTS表示“停止发送”。
  • CTS(Clear to Send):输入信号,发送端检测CTS状态,低电平表示允许发送,高电平表示暂停发送。
硬件流控工作流程:
  1. 接收端RX FIFO剩余空间充足时,拉低RTS(允许发送)。
  2. 发送端检测到CTS为低电平,开始发送数据。
  3. 接收端RX FIFO即将满时,拉高RTS(停止发送)。
  4. 发送端检测到CTS为高电平,暂停发送,直到CTS再次变低。

软件流控(XON/XOFF)

  • XOFF(0x13):接收端发送XOFF字符,通知发送端暂停。
  • XON(0x11):接收端发送XON字符,通知发送端恢复。
驱动开发避坑:软件流控依赖数据线传输控制字符,不适用于二进制数据传输(因为0x13/0x11可能出现在数据中)。高可靠系统应优先使用硬件流控,并在驱动中正确配置GPIO复用功能为RTS/CTS。
硬件流控RTS/CTS时序图 硬件流控RTS/CTS时序图 发送端 (TX) 接收端 (RX) 数据线 (TXD/RXD) RTS (接收端→发送端) CTS (发送端→接收端) RTS低电平 = 允许发送;CTS低电平 = 发送端可发送 接收端FIFO满时拉高RTS,发送端检测CTS高电平后暂停发送

2.5 硬件原理对驱动设计的指导

理解上述硬件原理后,驱动开发者在设计UART驱动时需重点关注以下方面:

硬件特性 驱动设计要点
帧格式 初始化时通过 termios 结构体或寄存器设置数据位、校验位、停止位;支持运行时动态切换。
波特率生成 计算分频系数并写入波特率寄存器;支持小数分频时需处理精度误差;提供标准波特率列表。
收发FIFO 配置FIFO触发阈值;在中断服务程序中批量读写FIFO;与DMA引擎协同时配置FIFO为DMA请求源。
硬件流控 配置GPIO复用为RTS/CTS功能;在驱动中实现RTS/CTS状态机;支持自动流控(Auto Flow Control)。