3. DMA控制器原理:DMA传输模式、通道、请求与响应流程
DMA(Direct Memory Access,直接存储器访问)控制器是嵌入式系统中负责在内存与外设之间、或内存与内存之间高速搬运数据的硬件引擎。在UART多串口并发传输场景下,DMA控制器能够在不占用CPU的情况下,自动完成串口数据的收发,是提升系统吞吐量的核心部件。本节将深入剖析DMA控制器的传输模式、通道管理、请求与响应流程,为后续描述符配置与多串口并发传输打下坚实的理论基础。
3.1 DMA传输模式
DMA控制器支持多种传输模式,以适应不同的应用场景。在UART驱动开发中,最常用的模式包括单次传输模式、循环传输模式和链表传输模式(也称为描述符链模式)。下表对比了这三种模式的核心差异:
| 传输模式 | 传输方向 | 传输结束后行为 | 适用场景 | 描述符数量 |
|---|---|---|---|---|
| 单次传输模式 | 内存→外设 / 外设→内存 | 停止传输,产生中断 | 固定长度数据包收发 | 1个 |
| 循环传输模式 | 内存→外设 / 外设→内存 | 自动重载,循环传输 | 音频流、连续数据采集 | 1个(自动重载) |
| 链表传输模式 | 内存→外设 / 外设→内存 | 自动跳转至下一个描述符 | 多缓冲区、多串口并发传输 | 多个(描述符链) |
开发提示:在UART多串口并发传输场景中,链表传输模式是最佳选择。它允许为每个串口配置独立的描述符链,实现多个UART同时进行DMA传输而互不干扰,且CPU只需在描述符链完成时处理中断,极大降低了中断频率。
下图展示了三种传输模式的数据流与状态机差异:
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通道与外设之间的映射关系:
3.3 DMA请求与响应流程
DMA传输的发起依赖于外设的请求信号。以UART接收为例,当UART接收FIFO达到预设阈值(如1/4满)时,UART外设会向DMA控制器发送DMA请求。DMA控制器收到请求后,根据通道配置执行一次数据传输,并在传输完成后发送响应信号给外设。完整的请求与响应流程包含以下步骤:
- 外设请求触发:UART接收FIFO达到阈值,硬件自动拉高DMA请求信号(DMA_REQ)。
- DMA仲裁:DMA控制器仲裁器根据通道优先级,选择当前最高优先级的待处理请求。
- 通道配置加载:DMA控制器从选中通道的寄存器中加载源地址、目的地址、传输计数等参数。
- 总线仲裁:DMA控制器向系统总线(如AHB/AXI)发起总线访问请求,等待总线授权。
- 数据传输:DMA控制器执行一次突发传输(Burst Transfer),从源地址读取数据并写入目的地址。
- 传输计数更新:DMA控制器递减传输计数寄存器,并更新源/目的地址(增量模式)。
- 响应信号:DMA控制器向UART外设发送响应信号(DMA_ACK),表示本次传输完成。
- 循环判断:若传输计数未归零,则继续等待下一次外设请求;若归零,则触发DMA完成中断。
关键时序约束:在高速UART传输(如4Mbps以上)场景下,DMA请求与响应之间的延迟必须严格控制。若DMA响应延迟超过UART接收FIFO的溢出时间,将导致数据丢失。建议将DMA通道优先级设置为高,并确保DMA控制器时钟频率不低于UART波特率的4倍。
下图以UART接收为例,展示了DMA请求与响应的完整时序流程:
3.4 多串口并发传输的DMA调度
当多个UART串口同时请求DMA传输时,DMA控制器的仲裁器负责决定哪个通道获得总线访问权。常见的仲裁策略包括:
- 固定优先级:通道编号越小,优先级越高。适用于对延迟敏感的串口(如控制台串口)。
- 轮询优先级:所有通道轮流获得总线访问权,保证公平性。适用于多个串口吞吐量均衡的场景。
- 混合优先级:高优先级通道采用固定优先级,低优先级通道采用轮询。兼顾实时性与公平性。
工程实践建议:在4个UART串口并发传输的场景下,推荐将UART0(通常作为调试串口)配置为最高固定优先级,其余3个串口配置为轮询优先级。这样可以确保调试信息不会因DMA延迟而丢失,同时保证其他串口的传输公平性。
下表总结了不同仲裁策略的优缺点:
| 仲裁策略 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 固定优先级 | 实现简单,低延迟可预测 | 低优先级通道可能被饿死 | 关键控制通道 + 非关键数据通道 |
| 轮询优先级 | 所有通道公平访问 | 高优先级通道延迟增加 | 多通道吞吐量均衡 |
| 混合优先级 | 兼顾实时性与公平性 | 配置复杂,需仔细调优 | 多串口并发传输(推荐) |