UART
UART 介绍
UART,全称为通用异步收发传输器(Universal Asynchronous Receiver and Transmitter),是一种常见的串行通信接口。在嵌入式系统中,UART 的应用非常广泛,主要用于以下几个方面:输出调试信息以便于开发和故障排查;连接外部设备模块,如 GPS 定位模块和蓝牙通信模块等。
在 UART 通信中,首先需要确定传输速率,即波特率,它表示每秒传输的数据位数。常见的波特率包括 9600、19200 和 115200 等。确定波特率后,还需设定数据传输的格式。UART 通信以帧为单位传输数据,典型的帧结构包括:1 位起始位、8 位数据位、可选的 1 位奇偶校验位以及 1 位停止位。
以下是一个示例说明:

在 UART 通信中,数据帧的波形通常由 1 位起始位、8 位数据位、1 位偶校验位和 1 位停止位组成。以字符 'A' 为例,其 ASCII 值为 41(十进制),对应的二进制为 0100 0001。在传输时,采用小端模式,即低位(LSB)在前,高位(MSB)在后,这与波形图所示一致。以下是各部分的详细说明:
- 空闲位:在没有数据传输时,数据线保持高电平(逻辑 1)。
- 起始位:当开始发送数据时,UART 会将数据线从高电平变为低电平,表示起始位(逻辑 0)。
- 数据位:数据位可以是 5、6、7 或 8 位,通常按字节(8 位)传输。发送方逐位改变数据线的状态(高电平或低电平),先传输最低位,最后传输最高位。例如,字符 'A' 的二进制表示为 01000001,首先发送最低位 bit 0(值为 1),接着发送 bit 1(值为 0),依此类推,最后发送最高位 bit 7(值为 0)。
- 奇偶校验位:如果启用了奇偶校验功能,在数据位发送完毕后,会发送 1 位校验位。奇偶校验分为奇校验和偶校验,确保数据位和校验位中”1”的数量为奇数或偶数。奇偶校验仅用于检错,无法纠错,且只能检测单比特错误,发现错误后需重新发送数据。图中使用的是偶校验,数据位和校验位中”1”的总数为偶数(2 个)。
- 停止位:停止位(逻辑 1)表示当前数据传输结束。停止位的长度可以是 1 位、1.5 位或 2 位,通常选择 1 位即可。
功能描述
MTT E300 中有 8 组 UART,其中 UART0-6 和 UART7 的硬件实现、功能以及驱动代码都不同。
UART0-6 功能特性
- 功能兼容 16550A。
- 全双工操作。
- 具有噪声滤波的稳健接收数据采样。
- 64 字节的接收 FIFO 和 64 字节的发送 FIFO。
- 可编程的 FIFO 中断触发级别。
- 接收 FIFO 上的”旧数据”定时器。
- 完全可编程的串行接口。
- 数据位:7 位或 8 位。
- 校验位:无、偶校验、奇校验或固定校验。
- 停止位:1 位或 2 位。
- 中断条件检测和生成。
- 内置波特率发生器。
- 可编程的整数和小数分频器用于波特率生成。
- 可编程的波特率计算方法,支持高达 12 Mbps 的波特率。
- 低速模式:波特率 = (功能时钟 / 16) / 分频器。
- 中速模式:波特率 = (功能时钟 / 8) / 分频器。
- 高速模式:波特率 = (功能时钟 / 4) / 分频器。
- 完整的状态报告能力。
- 内部诊断能力。
- 回环模式用于自测试。
- 中断条件、奇偶校验错误和帧错误模拟。
- 独立的 APB 读写操作,用于发送和接收数据。
- 独立的 DMA 操作,用于发送和接收数据服务。
- 自动流控制能力。
- RTS 由 UART 接收 FIFO 控制。
- 来自外部的 CTS 控制 UART 发送器。
- 软件流控制能力。
- 可编程的 XOFF 字符用于停止 UART 发送器 。
- 可编程的 XON 字符用于启动 UART 发送器。
UART7 功能特性
-
AMBA APB 接口:便于集成到 AMBA SoC 实现中。
-
APB 数据总线宽度:8、16 和 32 位。
-
发送保持寄存器空(THRE)中断模式。
-
busy 功能。
-
能够在实例化时设置某些配置参数。
-
功能基于 16550 行业标准,具体如下:
- 可编程字符属性,如每个字符的数据位数(5-8)、可选的奇偶校验位(奇校验或偶校验)以及停止位数(1 或 2)。
- 线路中断生成和检测。
- 优先级中断识别。
-
可编程串行数据波特率,计算公式如下:
波特率 = (串行时钟频率) / (16 × 分频系数)。
-
调制解调器和状态线独立控制。
-
每个时钟域独立的系统复位,以防止亚稳态。
运行原理
Linux UART 驱动介绍
Linux 中 UART 驱动的层次结构如图:

-
用户层:应用程序与 UART 设备交互的接口
- 通过设备文件(如
/dev/ttyS0、/dev/ttyUSB0)读写数据。 - 使用系统调用(如
open()、read()、write()、ioctl())控制设备。 - 配置串口参数(波特率、数据位、停止位等)通过 termios 库。
- 直接发送原始数据或接收硬件反馈。
- 通过设备文件(如
-
TTY core:内核中管理终端设备的通用框架
- 提供统一的设备抽象,支持多种终端类型(如 UART、虚拟终端、伪终端)。
- 管理用户层与底层驱动的数据流(缓冲区、流量控制)。
- 处理会话管理(如进程组、信号传递)。
- 通过
tty_driver和tty_operations接口与底层驱动交互。
-
Line Discipline:行规程是数据格式和协议转换的中间层
- 数据预处理:将原始数据转换为特定协议格式(如 PPP、SLIP)。
- 输入/输出控制:实现特殊字符处理(如 Ctrl+C 终止信号)。
- 协议封装:支持网络协议栈与串口通信的适配。
- 默认线路规程(N_TTY)提供标准终端行为(行缓冲、回显)。
-
UART driver:直接操作硬件 UART 控制器的底层驱动
- 初始化 UART 硬件(寄存器配置、中断设置)。
- 实现数据传输(发送/接收字节)。
- 处理硬件中断(如数据到达、发送完成)。
- 支持波特率生成、奇偶校验、流量控制(RTS/CTS)等配置。