1. UART DMA 基础概念

在全志 T113 平台的嵌入式开发中,UART 驱动采用 DMA 模式是提升数据吞吐量、降低 CPU 负载的关键技术。本节将系统讲解 DMA 的工作原理、UART 与 DMA 的协同机制,以及全志 T113 DMA 控制器的核心架构,为后续参数配置与性能调试奠定理论基础。

1.1 DMA 工作原理

DMA(Direct Memory Access,直接存储器访问)是一种允许外设与存储器之间直接传输数据而无需 CPU 干预的硬件机制。在传统的 PIO(Programmed I/O)模式下,CPU 需要逐字节搬运数据,导致 CPU 被大量占用;而 DMA 控制器接管了数据搬运任务,CPU 仅在传输开始和结束时参与。

核心优势: DMA 模式可将 UART 数据传输的 CPU 占用率从 80% 以上降低至 5% 以下,同时将有效数据吞吐量提升 3-5 倍。
DMA 数据传输工作原理 CPU DMA 控制器 存储器(DDR) UART 外设 ① 配置传输参数 ② 读取/写入数据 ③ 传输请求/完成中断 ④ 数据流(无需 CPU) 关键流程:CPU 初始化 DMA 描述符 → DMA 自动搬运数据 → 传输完成触发中断 → CPU 处理数据

DMA 传输的基本流程包含以下步骤:

  1. 初始化阶段: CPU 配置 DMA 控制器的源地址、目的地址、传输长度、传输宽度等参数,并启动 DMA 通道。
  2. 传输阶段: DMA 控制器独立于 CPU,通过系统总线直接读取源数据并写入目的地址,每次传输后自动更新地址和计数。
  3. 完成阶段: 当传输计数归零时,DMA 控制器向 CPU 发送中断信号,通知传输完成。
技术要点: DMA 传输模式分为单次传输(Single Transfer)和突发传输(Burst Transfer)。突发传输可一次搬运多个数据单元,总线利用率更高,但需要外设支持突发能力。全志 T113 的 DMA 控制器支持 1/4/8/16 字节的突发长度配置。

1.2 UART 与 DMA 协同机制

UART 与 DMA 的协同工作,本质上是将 UART 的接收/发送 FIFO 与系统内存之间的数据搬运任务交给 DMA 控制器。当 UART 的 FIFO 达到预设阈值或接收超时时,DMA 自动启动传输,将数据搬入内存缓冲区;发送时,DMA 从内存缓冲区取出数据写入 UART 发送 FIFO。

UART 与 DMA 协同工作流程 内存缓冲区 RX Buffer TX Buffer DMA 控制器 通道 0(RX) 通道 1(TX) UART 外设 RX FIFO TX FIFO TX 数据流 RX 数据流 TX 数据流 RX 数据流 中断信号(传输完成/错误) CPU 配置总线(描述符、控制寄存器) UART DMA 协同关键机制 1. 接收(RX):UART RX FIFO 达到阈值 → 触发 DMA 请求 → DMA 将数据搬入内存 RX Buffer 2. 发送(TX):CPU 将数据写入内存 TX Buffer → 触发 DMA 请求 → DMA 将数据搬入 UART TX FIFO 3. 中断处理:DMA 传输完成或发生错误时,通过中断通知 CPU 进行后续处理 4. 流控配合:硬件流控(RTS/CTS)与 DMA 协同,防止 FIFO 溢出或数据丢失

UART 与 DMA 协同工作时,需要关注以下关键参数:

参数名称 作用描述 典型配置值
FIFO 阈值 触发 DMA 传输的 FIFO 数据量 RX: 8 字节 / TX: 4 字节
突发长度 单次 DMA 传输的数据单元数 4 / 8 / 16 字节
传输宽度 每次传输的数据位宽 8 位(与 UART 数据位一致)
描述符链 支持连续多段传输的描述符链表 2-8 个描述符
超时时间 接收超时触发 DMA 传输的时间 3-5 字符时间
常见陷阱: UART 的 FIFO 深度与 DMA 突发长度不匹配会导致数据丢失或传输效率低下。例如,T113 UART FIFO 深度为 64 字节,若 DMA 突发长度设置为 32 字节,而 FIFO 阈值设置为 1 字节,则可能频繁触发小数据量传输,降低 DMA 效率。建议 FIFO 阈值 ≥ 突发长度。

1.3 全志 T113 DMA 控制器概述

全志 T113 芯片内部集成了一个高性能 DMA 控制器,支持 8 个独立通道,可同时处理多个外设的 DMA 请求。该 DMA 控制器采用描述符链(Descriptor Chain)架构,支持内存到内存、内存到外设、外设到内存三种传输模式。

全志 T113 DMA 控制器架构 DMA 控制器(DMAC) 8 通道独立 DMA 引擎 CH0 CH1 CH2 CH3 CH4 CH5 CH6 CH7 描述符存储器(SRAM) 每个通道独立描述符链 支持链表结构,连续传输 通道仲裁器 固定优先级 / 轮询调度 支持中断聚合 AHB / AXI 总线接口(64 位数据总线)

全志 T113 DMA 控制器的关键特性如下:

特性 规格 说明
通道数量 8 个独立通道 每个通道可独立配置源/目的地址、传输长度、传输模式
传输模式 3 种 内存到内存、内存到外设、外设到内存
数据宽度 8 / 16 / 32 / 64 位 支持字节、半字、字、双字传输
突发长度 1 / 4 / 8 / 16 单次突发传输的数据单元数
描述符链 支持 链表结构,支持连续多段传输,无需 CPU 反复配置
中断支持 每个通道独立中断 支持传输完成、传输错误、半传输中断
总线接口 AHB / AXI 64 位 高带宽总线接口,支持高速数据传输
优先级 可配置 固定优先级或轮询调度算法
UART DMA 通道分配建议: 在全志 T113 平台上,通常为每个 UART 实例分配两个 DMA 通道:一个用于接收(RX),一个用于发送(TX)。例如,UART0 使用 CH0(RX)和 CH1(TX),UART1 使用 CH2(RX)和 CH3(TX),以此类推。这种分配方式可以避免通道冲突,并充分利用 DMA 控制器的并行处理能力。

DMA 描述符是 DMA 传输的核心数据结构,每个描述符定义了单次传输的所有参数:

// 全志 T113 DMA 描述符结构(简化版)
struct dma_descriptor {
    uint32_t src_addr;      // 源地址(物理地址)
    uint32_t dst_addr;      // 目的地址(物理地址)
    uint32_t byte_count;    // 传输字节数
    uint32_t config;        // 配置信息(突发长度、数据宽度、传输类型等)
    uint32_t next_desc;     // 下一个描述符地址(链表指针)
    uint32_t status;        // 传输状态(由硬件更新)
    uint32_t reserved[2];   // 保留字段
};
描述符链优势: 使用描述符链可以实现“乒乓缓冲”(Ping-Pong Buffer)机制。例如,配置两个描述符分别指向两个不同的内存缓冲区,当第一个缓冲区填满后,DMA 自动切换到第二个缓冲区,同时 CPU 处理第一个缓冲区的数据,从而实现数据采集与处理的全流水线操作,极大提升系统吞吐量。