3、DMA传输类型详解:内存到内存、内存到外设、外设到内存、外设到外设的传输模式与适用场景

在车载MCU系统中,DMA控制器支持四种基本传输类型。理解每种类型的硬件通路、触发机制和适用场景,是进行多通道配置与性能优化的前提。错误的传输类型选择可能导致总线冲突、数据错位甚至系统死锁。

3.1 四种传输模式的核心差异

下表从数据流向、触发源、地址增量和典型应用四个维度对比四种模式:

传输模式 数据流向 触发源 源地址增量 目的地址增量 典型车载场景
内存→内存 SRAM → SRAM 软件请求 递增 递增 数据搬移、协议栈缓冲区拷贝
内存→外设 SRAM → 外设数据寄存器 外设发送请求 递增 固定 SPI发送、CAN报文发送、DAC波形输出
外设→内存 外设数据寄存器 → SRAM 外设接收请求 固定 递增 ADC采样结果读取、UART接收、CAN接收
外设→外设 外设寄存器 → 外设寄存器 源外设事件 固定 固定 定时器触发ADC、数字信号重映射
关键约束: 内存到内存模式通常不支持硬件握手信号,必须由CPU启动传输;外设到外设模式要求两个外设共享同一时钟域或通过桥接逻辑同步,否则可能产生亚稳态。

3.2 内存到内存(Memory-to-Memory)

这是最简单的DMA传输模式,无需外设参与。DMA控制器直接读取源内存地址的数据,写入目的内存地址。在车载MCU中,常用于:

  • 协议栈缓冲区拷贝: 将CAN或以太网接收帧从DMA缓冲区搬移到应用层缓冲区。
  • 图像/传感器数据预处理: 将原始像素数据从采集缓冲区搬移到算法处理区。
  • Bootloader固件搬移: 将Flash中的程序镜像拷贝到RAM中执行。

配置要点:

  • 源地址和目的地址必须按传输宽度对齐(如32位传输时地址4字节对齐)。
  • 传输计数(NDTR)必须精确匹配数据块大小,溢出会导致总线错误。
  • 优先级不宜设置过高,避免长时间阻塞CPU对外设的响应。

3.3 内存到外设(Memory-to-Peripheral)

DMA从内存读取数据,写入外设的数据输出寄存器。外设通过硬件请求信号(如SPI的TXE、CAN的TXRQ)触发DMA传输。典型应用:

  • SPI发送: 将待发送的报文数组逐字节/半字/字写入SPI_DR寄存器。
  • CAN报文发送: 将CAN帧数据从内存搬移到CAN_TX mailbox寄存器。
  • DAC波形输出: 从波形表连续读取采样点写入DAC数据寄存器。

配置要点:

  • 目的地址必须设置为外设数据寄存器的固定地址,禁止地址增量。
  • 传输宽度必须与外设寄存器物理宽度一致(如SPI_DR为16位,则传输宽度设为半字)。
  • 使能循环模式(Circular Mode)可实现连续波形输出或周期性报文发送。

3.4 外设到内存(Peripheral-to-Memory)

这是车载MCU中最常用的DMA模式。外设接收到数据后,通过硬件请求通知DMA将数据从外设数据寄存器搬移到内存缓冲区。典型应用:

  • ADC多通道采样: 每次转换完成后,DMA将结果搬移到数组,无需CPU干预。
  • UART接收: 接收到的每个字节自动存入环形缓冲区,避免丢失。
  • CAN接收: 将接收到的CAN帧从RX FIFO搬移到接收队列。

配置要点:

  • 源地址固定为外设数据寄存器地址,目的地址递增。
  • 传输计数应等于缓冲区大小,并在半传输和完成传输时触发中断。
  • 对于高速外设(如CAN FD),建议使用双缓冲区(Double Buffer)模式防止数据覆盖。
性能优化技巧: 在外设到内存模式下,将DMA通道优先级设置为中等或高,并启用FIFO(如果MCU支持),可以吸收外设请求的突发性,减少总线占用。

3.5 外设到外设(Peripheral-to-Peripheral)

此模式将数据从一个外设的数据寄存器直接传输到另一个外设的数据寄存器,CPU和内存均不参与。在车载MCU中应用较少,但在特定场景下极具价值:

  • 定时器触发ADC: 定时器更新事件作为DMA请求,将定时器计数值直接写入ADC触发寄存器,实现精确采样时序。
  • 数字信号重映射: 将GPIO输入状态通过DMA直接写入另一个GPIO的输出寄存器,实现低延迟信号转发。
  • CRC计算加速: 将数据从外设FIFO直接送入CRC计算单元,绕过内存。

配置要点:

  • 源和目的外设必须支持DMA请求信号,且请求极性匹配。
  • 两个外设的时钟必须同步,或通过硬件握手信号保证数据稳定。
  • 传输宽度必须一致,否则数据会截断或填充错误。
常见陷阱: 外设到外设模式在部分MCU中不支持地址增量,且传输完成后不会自动产生中断。务必查阅参考手册确认硬件支持能力,避免在量产项目中引入不可预测行为。

3.6 四种模式的传输路径对比

下图展示了四种DMA传输模式在车载MCU系统中的数据通路和总线占用情况:

DMA四种传输模式数据通路对比 DMA四种传输模式数据通路对比 DMA 控制器 系统总线(AHB/APB) SRAM / Flash 内存 SPI / UART / CAN 外设 定时器 / GPIO 外设2 ① 内存→内存 ② 内存→外设 ③ 外设→内存 ④ 外设→外设 图例说明: ① 绿色箭头:内存→内存,数据不经过外设,完全由DMA控制总线。 ② 蓝色箭头:内存→外设,DMA从内存读取数据写入外设发送寄存器。 ③ 红色箭头:外设→内存,外设接收数据后DMA搬移到内存缓冲区。 ④ 紫色箭头:外设→外设,数据在两个外设寄存器间直接传输,内存不参与。 虚线表示DMA控制器通过系统总线访问目标模块的控制通路。

3.7 模式选择决策流程

在实际车载项目开发中,可按照以下步骤快速确定DMA传输模式:

  1. 判断数据源和目标: 源和目标是否都是内存地址?是则选内存→内存。
  2. 判断是否涉及外设: 如果源是外设寄存器,目标是内存,选外设→内存;反之选内存→外设。
  3. 判断是否两个外设: 如果源和目标都是外设寄存器,且需要实时数据流,选外设→外设。
  4. 检查硬件支持: 查阅MCU参考手册,确认所选通道是否支持目标模式,以及是否需要配置额外的请求映射。
  5. 验证地址对齐: 确保源地址、目的地址和传输宽度满足硬件对齐要求。
车载经验总结: 在AUTOSAR MCAL驱动开发中,超过80%的DMA通道配置为外设到内存模式(ADC、CAN、SPI接收),约15%为内存到外设模式(SPI发送、DAC),内存到内存和外设到外设模式合计占比不足5%。优先掌握前两种模式即可覆盖绝大多数车载应用场景。