3. DMA控制器原理:DMA传输模式、通道、请求与响应流程

DMA(Direct Memory Access,直接存储器访问)控制器是嵌入式系统中负责在内存与外设之间、或内存与内存之间高速搬运数据的硬件引擎。在UART多串口并发传输场景下,DMA控制器能够在不占用CPU的情况下,自动完成串口数据的收发,是提升系统吞吐量的核心部件。本节将深入剖析DMA控制器的传输模式、通道管理、请求与响应流程,为后续描述符配置与多串口并发传输打下坚实的理论基础。

3.1 DMA传输模式

DMA控制器支持多种传输模式,以适应不同的应用场景。在UART驱动开发中,最常用的模式包括单次传输模式、循环传输模式和链表传输模式(也称为描述符链模式)。下表对比了这三种模式的核心差异:

传输模式 传输方向 传输结束后行为 适用场景 描述符数量
单次传输模式 内存→外设 / 外设→内存 停止传输,产生中断 固定长度数据包收发 1个
循环传输模式 内存→外设 / 外设→内存 自动重载,循环传输 音频流、连续数据采集 1个(自动重载)
链表传输模式 内存→外设 / 外设→内存 自动跳转至下一个描述符 多缓冲区、多串口并发传输 多个(描述符链)
开发提示:在UART多串口并发传输场景中,链表传输模式是最佳选择。它允许为每个串口配置独立的描述符链,实现多个UART同时进行DMA传输而互不干扰,且CPU只需在描述符链完成时处理中断,极大降低了中断频率。

下图展示了三种传输模式的数据流与状态机差异:

DMA传输模式对比 单次传输模式 1个描述符 启动传输 传输中 传输完成 → 停止 循环传输模式 1个描述符(自动重载) 启动传输 传输中 传输完成 → 自动重载 链表传输模式 多个描述符(描述符链) 描述符1 → 传输 描述符2 → 传输 描述符3 → 传输 链尾 → 中断

3.2 DMA通道

DMA通道是DMA控制器内部独立的硬件数据通路,每个通道都包含一组寄存器(源地址、目的地址、传输计数、控制配置等),用于管理一次独立的DMA传输。在支持多串口并发传输的SoC中,DMA控制器通常提供多个通道,每个通道可以独立配置并服务于一个外设请求。

以下是DMA通道的核心组成要素:

  • 通道控制寄存器(CH_CTRL):配置传输方向、数据宽度、突发传输大小、优先级等。
  • 源地址寄存器(CH_SAR):存储数据源地址(内存地址或外设地址)。
  • 目的地址寄存器(CH_DAR):存储数据目的地址(外设地址或内存地址)。
  • 传输计数寄存器(CH_CNT):记录待传输的数据量(字节/半字/字)。
  • 描述符指针寄存器(CH_LLP):指向链表中的下一个描述符(链表模式专用)。
多串口通道分配策略:在典型的嵌入式系统中,DMA控制器通常有8~16个通道。对于4个UART串口(每个串口需要RX和TX两个通道),共需8个通道。建议采用固定映射方式:UART0_RX→通道0,UART0_TX→通道1,UART1_RX→通道2,以此类推。这种映射方式便于驱动代码管理和中断处理。

下图展示了DMA通道与外设之间的映射关系:

DMA通道与外设映射关系 DMA控制器 通道0 (UART0_RX) 通道1 (UART0_TX) 通道2 (UART1_RX) 通道3 (UART1_TX) 外设 UART0 (RX/TX) UART1 (RX/TX) UART2 (RX/TX) UART3 (RX/TX) 每个通道独立配置,互不干扰

3.3 DMA请求与响应流程

DMA传输的发起依赖于外设的请求信号。以UART接收为例,当UART接收FIFO达到预设阈值(如1/4满)时,UART外设会向DMA控制器发送DMA请求。DMA控制器收到请求后,根据通道配置执行一次数据传输,并在传输完成后发送响应信号给外设。完整的请求与响应流程包含以下步骤:

  1. 外设请求触发:UART接收FIFO达到阈值,硬件自动拉高DMA请求信号(DMA_REQ)。
  2. DMA仲裁:DMA控制器仲裁器根据通道优先级,选择当前最高优先级的待处理请求。
  3. 通道配置加载:DMA控制器从选中通道的寄存器中加载源地址、目的地址、传输计数等参数。
  4. 总线仲裁:DMA控制器向系统总线(如AHB/AXI)发起总线访问请求,等待总线授权。
  5. 数据传输:DMA控制器执行一次突发传输(Burst Transfer),从源地址读取数据并写入目的地址。
  6. 传输计数更新:DMA控制器递减传输计数寄存器,并更新源/目的地址(增量模式)。
  7. 响应信号:DMA控制器向UART外设发送响应信号(DMA_ACK),表示本次传输完成。
  8. 循环判断:若传输计数未归零,则继续等待下一次外设请求;若归零,则触发DMA完成中断。
关键时序约束:在高速UART传输(如4Mbps以上)场景下,DMA请求与响应之间的延迟必须严格控制。若DMA响应延迟超过UART接收FIFO的溢出时间,将导致数据丢失。建议将DMA通道优先级设置为高,并确保DMA控制器时钟频率不低于UART波特率的4倍。

下图以UART接收为例,展示了DMA请求与响应的完整时序流程:

UART DMA请求与响应流程(接收方向) t0 t1 t2 t3 t4 t5 UART外设状态 接收数据 FIFO达到阈值 等待DMA响应 DMA读取数据 继续接收 DMA控制器状态 空闲 收到请求 总线仲裁 数据传输 发送响应 DMA_REQ DMA_ACK DMA_REQ高电平有效 DMA_ACK确认传输完成

3.4 多串口并发传输的DMA调度

当多个UART串口同时请求DMA传输时,DMA控制器的仲裁器负责决定哪个通道获得总线访问权。常见的仲裁策略包括:

  • 固定优先级:通道编号越小,优先级越高。适用于对延迟敏感的串口(如控制台串口)。
  • 轮询优先级:所有通道轮流获得总线访问权,保证公平性。适用于多个串口吞吐量均衡的场景。
  • 混合优先级:高优先级通道采用固定优先级,低优先级通道采用轮询。兼顾实时性与公平性。
工程实践建议:在4个UART串口并发传输的场景下,推荐将UART0(通常作为调试串口)配置为最高固定优先级,其余3个串口配置为轮询优先级。这样可以确保调试信息不会因DMA延迟而丢失,同时保证其他串口的传输公平性。

下表总结了不同仲裁策略的优缺点:

仲裁策略 优点 缺点 适用场景
固定优先级 实现简单,低延迟可预测 低优先级通道可能被饿死 关键控制通道 + 非关键数据通道
轮询优先级 所有通道公平访问 高优先级通道延迟增加 多通道吞吐量均衡
混合优先级 兼顾实时性与公平性 配置复杂,需仔细调优 多串口并发传输(推荐)