2. T113 UART 硬件特性:寄存器映射、FIFO 深度、波特率发生器、中断与 DMA 请求线
全志 T113 芯片内部集成了 8 路独立 UART 控制器(UART0 ~ UART7)。其中 UART0 固定用于调试串口(通常与 SD 卡启动引脚复用),UART1 ~ UART7 可作为通用异步收发接口。本章深入分析 UART 模块的硬件寄存器布局、FIFO 缓冲机制、波特率发生原理以及中断/DMA 请求线的硬件连接,为后续 DMA 模式驱动配置奠定硬件基础。
2.1 UART 模块寄存器映射
每个 UART 控制器占用 4KB 地址空间,基地址由芯片内存映射表定义。UART0 基地址固定为 0x02500000,UART1 ~ UART7 依次偏移 0x10000。寄存器采用 32 位对齐访问,小端字节序。
| 偏移地址 | 寄存器名称 | 宽度 | 复位值 | 功能描述 |
|---|---|---|---|---|
| 0x00 | USR | 32 | 0x00000060 | UART 状态寄存器(含 FIFO 状态位) |
| 0x04 | UCR | 32 | 0x00000000 | UART 控制寄存器(使能、模式、DMA 使能) |
| 0x08 | UIBR | 32 | 0x00000000 | 整数波特率分频寄存器 |
| 0x0C | UFBR | 32 | 0x00000000 | 小数波特率分频寄存器 |
| 0x10 | ULCR | 32 | 0x00000000 | 线路控制寄存器(数据位、停止位、校验) |
| 0x14 | UMCR | 32 | 0x00000000 | 调制解调器控制寄存器 |
| 0x18 | ULSR | 32 | 0x00000060 | 线路状态寄存器(含错误标志) |
| 0x1C | UMSR | 32 | 0x00000000 | 调制解调器状态寄存器 |
| 0x20 | USCR | 32 | 0x00000000 | Scratch 寄存器(软件暂存) |
| 0x24 | UTX | 32 | 0x00000000 | 发送保持寄存器 / 发送 FIFO 写入端口 |
| 0x28 | URX | 32 | 0x00000000 | 接收缓冲寄存器 / 接收 FIFO 读取端口 |
| 0x2C | UIER | 32 | 0x00000000 | 中断使能寄存器 |
| 0x30 | UIIR | 32 | 0x00000001 | 中断标识寄存器(只读,含 FIFO 超时标志) |
| 0x34 | UFCR | 32 | 0x00000000 | FIFO 控制寄存器(触发阈值、复位、DMA 模式) |
| 0x38 | UART_DLCR | 32 | 0x00000000 | DMA 链路控制寄存器(DMA 请求使能) |
关键寄存器提示: 在 DMA 模式下,
UFCR 的 bit[3](DMA 模式使能)和 UART_DLCR 的 bit[0](DMA 请求使能)必须同时置 1,否则 DMA 控制器不会收到请求信号。
2.2 FIFO 深度与触发阈值
T113 UART 的发送和接收各配备 64 字节硬件 FIFO。FIFO 深度直接影响 DMA 传输的效率和中断频率。FIFO 控制寄存器 UFCR 的 bit[5:4] 和 bit[7:6] 分别设置接收和发送 FIFO 的触发阈值。
| UFCR bit 域 | 阈值选择 | 接收 FIFO 触发字节数 | 发送 FIFO 触发字节数 |
|---|---|---|---|
| bit[5:4] (RX Trigger) | 00 | 1 字节 | — |
| 01 | 16 字节 | — | |
| 10 | 32 字节 | — | |
| 11 | 48 字节 | — | |
| bit[7:6] (TX Trigger) | 00 | — | 16 字节空余 |
| 01 | — | 32 字节空余 | |
| 10 | — | 48 字节空余 | |
| 11 | — | 56 字节空余 |
DMA 模式推荐配置: 接收触发阈值设为 32 字节(
UFCR bit[5:4] = 10),发送触发阈值设为 48 字节空余(UFCR bit[7:6] = 10)。这样 DMA 每次搬运 32 字节,既能减少中断次数,又不会因 FIFO 过满导致溢出。
2.3 波特率发生器
T113 UART 的波特率发生器基于一个 16 位整数分频器和一个 4 位小数分频器,配合可选的 8 倍或 16 倍过采样模式。波特率计算公式如下:
// 波特率计算公式
// 过采样率 = 16(标准模式)或 8(高速模式)
// 时钟源 = APB 总线时钟(通常 100 MHz 或 200 MHz)
baud_rate = clock_source / (oversample_rate × (div_int + div_frac / 16))
// 其中:
// div_int = UIBR 寄存器值(0 ~ 65535)
// div_frac = UFBR 寄存器值(0 ~ 15)
// oversample_rate = 16(ULCR bit[7] = 0)或 8(ULCR bit[7] = 1)
| 目标波特率 | 时钟源 (MHz) | 过采样率 | div_int | div_frac | 实际波特率 | 误差 |
|---|---|---|---|---|---|---|
| 115200 | 100 | 16 | 54 | 4 | 115207 | +0.006% |
| 921600 | 100 | 16 | 6 | 12 | 921659 | +0.006% |
| 3000000 | 100 | 8 | 4 | 3 | 299880 | -0.04% |
| 4000000 | 100 | 8 | 3 | 2 | 400000 | 0.00% |
高速模式注意事项: 当使用 8 倍过采样(ULCR bit[7] = 1)时,最大波特率可达 12.5 Mbps(时钟源 100 MHz)。但此时接收器的抗干扰能力下降,建议在短距离、低噪声环境下使用。DMA 模式下推荐使用 16 倍过采样以保证数据可靠性。
2.4 中断与 DMA 请求线
每个 UART 控制器独立产生中断请求和 DMA 请求。中断请求线连接到 GIC(通用中断控制器),DMA 请求线连接到 DMA 控制器。两者在硬件上并行存在,驱动可以选择中断模式、DMA 模式或混合模式。
2.4.1 中断请求线
| UART 实例 | 中断号 (SPI) | 中断类型 | 触发方式 |
|---|---|---|---|
| UART0 | 32 | SPI | 电平触发 |
| UART1 | 33 | SPI | 电平触发 |
| UART2 | 34 | SPI | 电平触发 |
| UART3 | 35 | SPI | 电平触发 |
| UART4 | 36 | SPI | 电平触发 |
| UART5 | 37 | SPI | 电平触发 |
| UART6 | 38 | SPI | 电平触发 |
| UART7 | 39 | SPI | 电平触发 |
中断使能寄存器 UIER 控制以下中断源的使能:
- bit[0]:接收数据可用中断(RX 中断)
- bit[1]:发送保持寄存器空中断(TX 中断)
- bit[2]:接收线路状态中断(错误中断)
- bit[3]:调制解调器状态中断
- bit[4]:FIFO 超时中断(接收 FIFO 非空但未达到阈值时触发)
2.4.2 DMA 请求线
UART 模块为发送和接收分别提供独立的 DMA 请求线。DMA 请求的使能由 UART_DLCR 寄存器控制:
// UART_DLCR 寄存器定义 (偏移 0x38)
// bit[0] : RX_DMA_EN - 接收 DMA 请求使能
// bit[1] : TX_DMA_EN - 发送 DMA 请求使能
// bit[2] : RX_DMA_MODE - 接收 DMA 模式 (0: 单次模式, 1: 突发模式)
// bit[3] : TX_DMA_MODE - 发送 DMA 模式 (0: 单次模式, 1: 突发模式)
// DMA 模式配置示例
#define UART_DLCR_RX_DMA_EN (1 << 0)
#define UART_DLCR_TX_DMA_EN (1 << 1)
#define UART_DLCR_RX_BURST (1 << 2)
#define UART_DLCR_TX_BURST (1 << 3)
// 使能接收和发送 DMA,均使用突发模式
writel(UART_DLCR_RX_DMA_EN | UART_DLCR_TX_DMA_EN |
UART_DLCR_RX_BURST | UART_DLCR_TX_BURST,
base + UART_DLCR);
突发模式 vs 单次模式: 突发模式下,DMA 控制器在获得总线控制权后连续搬运多个数据(通常为 4 或 8 个 32 位字),总线利用率更高。单次模式每次只搬运 1 个数据,适合低延迟场景。DMA 驱动中推荐使用突发模式以获得更高吞吐量。