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基本功能正常后,再使能重映射并逐步验证路由表配置。
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传输冲突。务必在系统初始化阶段检查所有通道的占用状态,避免重复分配。
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 路由表查找流程
- 请求到达:外设通过硬件请求线向DMA控制器发送DMA请求。
- ID匹配:DMA控制器读取请求线对应的外设ID,在路由表中查找匹配的PERIPH_ID。
- 有效性检查:检查匹配表项的VALID位。若为0,则忽略该请求并记录错误。
- 通道分配:根据CHANNEL_ID字段,将请求路由到对应的DMA通道。
- 参数加载:将TRIGGER_TYPE和FLOW_CTRL等参数加载到通道控制寄存器。
- 传输启动: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;
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字段,确保无循环依赖 |