3. DMA 控制器架构:通道、请求与应答、传输粒度

DMA(Direct Memory Access)控制器是嵌入式系统中负责在内存与外设之间、或内存与内存之间直接搬运数据的硬件引擎。理解 DMA 控制器的内部架构——尤其是通道管理、请求/应答握手协议以及传输粒度——是编写高效、无竞争 RAW 数据流驱动的核心前提。

3.1 DMA 通道:独立的数据搬运流水线

DMA 控制器内部包含多个独立通道(Channel),每个通道相当于一条专用的数据搬运流水线。通道之间在硬件层面并行工作,互不阻塞。

通道属性 说明 典型配置值
源地址寄存器 数据读取的起始地址(外设数据寄存器或内存缓冲区) 0x4000_3800(ADC 数据寄存器)
目标地址寄存器 数据写入的起始地址(内存缓冲区或外设输出寄存器) 0x2000_0400(SRAM 缓冲区)
传输计数寄存器 剩余待传输的数据单元数量(按传输粒度计数) 1024(半字)
控制配置寄存器 传输方向、地址增量模式、循环模式、中断使能等 0x0000_0035
状态标志寄存器 传输完成、半传输完成、传输错误等硬件标志 0x0000_0001(完成标志置位)
关键概念:每个通道拥有自己独立的寄存器组,因此可以同时配置为不同的传输方向、不同的外设和不同的优先级。在 RAW 多通道采集场景中,通常一个通道专用于图像传感器数据搬运,另一个通道专用于音频数据搬运。

3.2 请求与应答信号:DMA 与外设的握手协议

DMA 传输的启动并非由 CPU 逐字节触发,而是通过硬件信号线完成请求(Request)与应答(Acknowledge)握手。这套机制保证了数据在“外设准备好”时才被搬运,避免空读或数据覆盖。

DMA 请求与应答握手时序 外设(Peripheral) DMA 控制器 内存(SRAM) DMA 请求(REQ) DMA 应答(ACK) 数据总线 握手流程说明 ① 外设数据就绪 → 拉高 REQ 信号 ② DMA 控制器仲裁后 → 拉高 ACK 信号 + 启动总线传输 ③ 传输完成 → 撤销 REQ/ACK → 等待下一次请求
实战要点:在 RAW 图像传感器驱动中,VSYNC(帧同步)信号通常连接到 DMA 的硬件触发输入,每帧开始后 DMA 自动响应外设的逐行请求,无需 CPU 干预。务必确认外设的 REQ 信号极性(高电平有效/上升沿有效)与 DMA 控制器的触发配置一致。

3.3 DMA 传输粒度:字节、半字与字

传输粒度(Transfer Width)决定了 DMA 每次搬运操作的数据宽度。选择错误的粒度会导致数据错位、总线效率下降甚至外设寄存器访问异常。

粒度 位宽 适用外设 总线访问次数 典型场景
字节(Byte) 8 位 UART、SPI(8 位模式)、I²C 1 次 / 字节 低速串行通信、字符流
半字(Half-word) 16 位 ADC(12/16 位)、音频 I²S、定时器捕获 1 次 / 半字 RAW 图像像素(每像素 10~16 位)
字(Word) 32 位 并行摄像头接口(DVP)、高速 DAC、内存拷贝 1 次 / 字 高带宽数据流、帧缓冲区搬运
粒度对齐规则:源端和目标端的传输粒度可以不同(例如从 8 位外设读取字节,在内存中组合为 32 位字),但必须满足:
• 源地址必须按源粒度对齐(半字访问地址必须为 2 的倍数)
• 目标地址必须按目标粒度对齐(字访问地址必须为 4 的倍数)
• 传输计数 = 总字节数 ÷ 源粒度字节数

3.4 传输粒度与 RAW 数据格式的匹配

在 RAW 格式输出场景中,像素深度通常为 10 位、12 位或 14 位。存储时一般按 16 位半字对齐(高位补零或符号扩展),因此 DMA 传输粒度应配置为半字(16 位)。

RAW 像素数据在内存中的粒度布局 RAW 像素数据流(每像素 12 位,按 16 位半字存储) Byte 0 Byte 1 半字 0(Pixel 0) Byte 2 Byte 3 半字 1(Pixel 1) ... Byte N-1 Byte N 半字 M(Pixel M) DMA 传输计数 = 像素总数(每个半字计为 1 次传输)
常见错误:若将 12 位 RAW 数据按字节粒度传输,则每两个像素会占用 3 个字节,导致内存中像素边界错位,后续软件解析时必须做位操作重组,增加 CPU 负载且容易出错。始终优先使用半字粒度传输 RAW 像素数据。

3.5 多通道优先级与仲裁

当多个 DMA 通道同时发出请求时,DMA 控制器内部的仲裁器(Arbiter)根据优先级策略决定哪个通道获得总线控制权。

  • 固定优先级:通道编号越小优先级越高(如通道 0 > 通道 1 > ...)。适用于明确知道哪个外设最紧急的场景。
  • 循环优先级(Round-Robin):所有通道轮流获得总线访问权,防止低优先级通道被饿死。适用于多个外设带宽需求相近的场景。
  • 混合模式:部分通道配置为高优先级(如实时视频流),其余通道使用循环模式。
配置建议:在 RAW 图像采集系统中,将图像传感器对应的 DMA 通道设置为最高固定优先级,音频或调试串口通道设置为循环优先级。这样可以保证图像帧数据不因总线竞争而丢失像素。

3.6 本章小结

知识点 核心要点
DMA 通道 每个通道独立配置源/目标地址、传输计数和控制选项,支持并行传输
请求与应答 外设通过 REQ 信号触发 DMA 传输,DMA 通过 ACK 信号确认并接管总线
传输粒度 字节(8 位)、半字(16 位)、字(32 位),必须与外设数据宽度和地址对齐
RAW 数据匹配 10~14 位 RAW 像素推荐使用半字粒度,避免位操作和像素错位
优先级仲裁 固定优先级保证实时性,循环优先级防止饿死,混合模式兼顾两者