DMA-350是Arm CoreLink系列中的高性能DMA控制器IP核,采用多通道并行架构设计。其核心功能是通过硬件加速实现内存与内存、内存与外设之间的高效数据传输,完全独立于CPU运作。在典型应用场景中,数据传输速率可达理论总线带宽的95%以上。
控制器采用分层安全设计,物理上划分为三个主要功能模块:
关键设计要点:安全域与非安全域采用硬件隔离机制,非安全代码尝试访问安全寄存器会触发RAZ/WI(Read-As-Zero/Write-Ignored)响应。这种设计符合Arm TrustZone安全架构要求。
每个DMA通道拥有独立的寄存器组,基地址按通道号偏移。以通道0为例:
控制通道运行状态的核心寄存器,关键位域包括:
典型配置流程:
c复制// 启动DMA传输
REG_WRITE(CH_CMD, 0x1); // 仅设置ENABLECMD
// 暂停传输(需在ENABLECMD已置位时有效)
REG_WRITE(CH_CMD, 0x10); // 仅设置PAUSECMD
// 组合命令:启动+设置触发类型
REG_WRITE(CH_CMD, 0x10001); // ENABLECMD + SRCSWTRIGINREQ
决定传输行为的关键寄存器,包含三个重要配置段:
传输类型控制(bits 20:18, 11:9):
传输单元大小(bits 2:0):
高级功能使能(bits 29:25):
寄存器锁定机制:ENABLECMD置位后变为只读,防止运行时配置冲突。
地址对齐要求:
math复制effective_addr = (addr >> TRANSIZE) << TRANSIZE
2D传输计算示例:
c复制// 传输1280x720 RGB图像(32bpp)
REG_WRITE(CH_XSIZE, (1280<<16) | 1280); // DESXSIZE | SRCXSIZE
REG_WRITE(CH_YSIZE, (720<<16) | 720); // DESYSIZE | SRCYSIZE
DMA-350通过三个层级实现安全隔离:
c复制// 步骤1:在安全世界配置通道安全属性
REG_WRITE(SCFG_CHSEC0, 0x1); // 通道0设为安全通道
// 步骤2:设置安全触发策略
REG_WRITE(SCFG_TRIGINSEC0, 0x1); // 触发输入0仅安全访问
// 步骤3:启用安全监控
REG_WRITE(SEC_CTRL, 0x1); // 开启安全域全局控制
安全警示:修改安全配置后必须重新初始化DMA控制器,否则可能引发不可预测行为。
通过CH_CTRL.REGRELOADTYPE实现自动任务切换:
c复制// 配置自动重载源地址和尺寸
REG_WRITE(CH_CTRL, (0x7<<18)); // REGRELOADTYPE=0x7
事件驱动传输配置示例:
c复制// 1. 启用硬件触发
REG_WRITE(CH_CTRL, (1<<25) | (1<<26)); // USESRCTRIGIN | USEDESTRIGIN
// 2. 配置触发类型
REG_WRITE(CH_CMD, (0x2<<21) | (0x1<<17)); // DESSWTRIGINTYPE=块请求
// 3. 等待触发事件
while(!(REG_READ(CH_STATUS) & (1<<24))); // 等待STAT_SRCTRIGINWAIT
TRANSIZE选择:
优先级设置:
c复制// 设置通道优先级(0-15)
REG_WRITE(CH_CTRL, (0xF<<4)); // CHPRIO=最高优先级
流控制优化:
c复制if(REG_READ(CH_STATUS) & (1<<17)) {
uint32_t err = REG_READ(ERRINFO); // 读取错误信息
REG_WRITE(CH_CMD, 0x2); // 发送CLEARCMD
while(REG_READ(CH_STATUS) & 0x3); // 等待清除完成
// 重新初始化通道...
}
建议为关键传输添加超时检测:
c复制#define DMA_TIMEOUT 1000000
uint32_t timeout = 0;
while(!(REG_READ(CH_STATUS) & (1<<16)) && (timeout++ < DMA_TIMEOUT));
if(timeout >= DMA_TIMEOUT) {
// 触发超时处理流程
}
原子性保证:
缓存一致性:
c复制// DMA操作前刷新缓存
clean_dcache_range(src_addr, size);
invalidate_dcache_range(dest_addr, size);
电源管理集成:
实时性关键配置:
c复制// 最小化延迟的配置组合
REG_WRITE(CH_CTRL, (0xF<<4) | 0x3); // 最高优先级 + 32bit传输
REG_WRITE(CH_INTREN, 0x1); // 仅使能完成中断
通过深入理解DMA-350寄存器的工作原理和精心优化配置参数,开发者可以充分发挥该控制器的性能潜力。在实际项目中,建议结合具体应用场景进行基准测试,以确定最优的通道参数和传输策略。