3. DMA重映射寄存器详解:重映射使能位、通道选择寄存器、外设请求路由表

DMA重映射(DMA Remapping)是驱动IO隔离调试中的核心机制,它允许系统软件将外设的DMA请求重新路由到指定的DMA通道或硬件加速器。理解重映射寄存器的布局与功能,是排查设备移植过程中DMA冲突、地址错误和中断丢失问题的关键。本节将深入解析三个核心寄存器组:重映射使能位、通道选择寄存器以及外设请求路由表。

3.1 重映射使能位(Remap Enable Bit)

重映射使能位通常位于全局控制寄存器(如 DMA_REMAP_CR)的最低有效位。该位控制整个DMA重映射功能的开启与关闭。在系统复位后,该位默认为0,所有DMA请求按照直通(Pass-Through)模式路由。

关键寄存器字段:
  • 位[0]:REMAP_EN — 全局重映射使能。写1启用,写0禁用。
  • 位[1]:LOCK — 锁定位。一旦置1,REMAP_EN位将无法修改,直到下次硬件复位。
  • 位[31:2]:保留 — 必须写0,否则可能导致未定义行为。
调试提示:在设备移植初期,建议先保持REMAP_EN=0,验证直通模式下DMA基本功能正常后,再使能重映射并逐步验证路由表配置。
重映射使能位控制流程 外设DMA请求 REMAP_EN? 直通模式 查路由表 映射通道

3.2 通道选择寄存器(Channel Select Register)

每个DMA控制器通常包含多个通道(如8/16/32通道)。通道选择寄存器(DMA_CSR)用于将外设请求映射到特定的DMA通道。该寄存器通常为每个通道提供一个独立的配置字段。

位域 名称 描述
[3:0] CH_SEL 通道编号选择(0~15)。选择该外设请求将路由到的DMA通道。
[4] CH_EN 通道使能。1:使能该通道的重映射;0:禁用。
[6:5] PRIORITY 通道优先级(00=低,01=中,10=高,11=最高)。
[7] LOCK_CH 通道锁定。置1后,该通道配置不可更改。
[31:8] RESERVED 保留位,必须写0。
常见故障:在设备移植时,如果外设请求被映射到已被其他外设占用的DMA通道,会导致DMA传输冲突。务必在系统初始化阶段检查所有通道的占用状态,避免重复分配。
DMA_CSR 通道选择寄存器位域布局 CH_SEL[3:0] CH_EN PRIORITY LOCK_CH RESERVED[31:8] 位0~3 位4 位5~6 位7 位8~31 每个外设请求对应一个独立的DMA_CSR寄存器实例 系统软件通过基地址+外设ID偏移访问

3.3 外设请求路由表(Peripheral Request Routing Table)

外设请求路由表是DMA重映射的核心数据结构,通常以查找表(LUT)的形式存在于系统内存或DMA控制器内部的SRAM中。路由表将外设的硬件请求线(Request Line)映射到DMA通道和传输控制参数。

3.3.1 路由表项结构

每个路由表项通常包含以下字段:

字段 位宽 描述
PERIPH_ID 8位 外设标识符,用于匹配硬件请求线。
CHANNEL_ID 5位 目标DMA通道编号(0~31)。
TRIGGER_TYPE 2位 触发类型:00=电平触发,01=边沿触发,10=脉冲触发,11=保留。
FLOW_CTRL 2位 流控模式:00=外设流控,01=内存流控,10=DMA流控,11=保留。
VALID 1位 表项有效标志。1表示该映射生效。

3.3.2 路由表查找流程

  1. 请求到达:外设通过硬件请求线向DMA控制器发送DMA请求。
  2. ID匹配:DMA控制器读取请求线对应的外设ID,在路由表中查找匹配的PERIPH_ID。
  3. 有效性检查:检查匹配表项的VALID位。若为0,则忽略该请求并记录错误。
  4. 通道分配:根据CHANNEL_ID字段,将请求路由到对应的DMA通道。
  5. 参数加载:将TRIGGER_TYPE和FLOW_CTRL等参数加载到通道控制寄存器。
  6. 传输启动:DMA通道开始执行数据传输。
路由表配置示例(伪代码):
// 假设外设UART2的PERIPH_ID为0x12
// 将其映射到DMA通道5,边沿触发,外设流控

uint32_t route_entry = 0;
route_entry |= (0x12 << 0);      // PERIPH_ID = 0x12
route_entry |= (5 << 8);         // CHANNEL_ID = 5
route_entry |= (0x1 << 13);      // TRIGGER_TYPE = 边沿触发
route_entry |= (0x0 << 15);      // FLOW_CTRL = 外设流控
route_entry |= (1 << 17);        // VALID = 1

// 写入路由表基地址 + 外设索引偏移
*(volatile uint32_t*)(ROUTE_TABLE_BASE + 0x12 * 4) = route_entry;
外设请求路由表查找流程 外设DMA请求 ID匹配 VALID? 记录错误 通道分配

3.4 寄存器配置注意事项

设备移植关键检查点:
  • 地址对齐:路由表基地址必须按照DMA控制器要求对齐(通常为256字节或4KB对齐)。
  • 表项顺序:路由表项通常按外设ID顺序排列,不要随意调整顺序,否则会导致ID匹配失败。
  • 缓存一致性:如果路由表位于系统内存中,在更新表项后必须执行缓存刷新操作(如DCache Clean),确保DMA控制器读取到最新数据。
  • 锁定位操作:LOCK和LOCK_CH位一旦置位,将无法通过软件清除。在调试阶段,建议最后再锁定配置。

3.5 故障排查速查表

现象 可能原因 排查步骤
DMA请求无响应 REMAP_EN未使能或路由表项VALID=0 检查全局使能位;遍历路由表确认VALID位状态
数据传输到错误地址 通道选择寄存器CH_SEL配置错误 核对外设ID与CH_SEL的对应关系
DMA传输超时 流控模式不匹配或触发类型错误 检查TRIGGER_TYPE和FLOW_CTRL配置
系统死锁 多个外设映射到同一通道且优先级冲突 检查PRIORITY字段,确保无循环依赖