在STM32上实现DMA的M2M(内存到内存)模式搬运外设寄存器到内存,本质是绕过CPU直接拷贝,但需注意两点:一是外设寄存器地址必须映射到DMA可访问的存储器总线(如AHB),且目标内存需为SRAM;二是若使用带Cache的MCU(如STM32H7),需处理Cache一致性。实操建议:1)配置DMA为M2M模式,源地址设为外设寄存器地址(如GPIO->IDR),目标地址设为内存缓冲区,数据宽度和传输计数按需设置;2)启用DMA的循环或单次模式,并开启传输完成中断;3)对于Cache,使用SCB_CleanDCache_by_Addr在DMA写内存前清理目标缓存,或使用SCB_InvalidateDCache_by_Addr在DMA读内存后使缓存失效,或者将内存区域配置为非缓存(如MPU设置)。推荐使用MPU将目标内存设为非缓存,避免手动维护。注意M2M模式不适用于外设到内存的流式传输,因为M2M无外设流控,可能丢失数据,建议改用外设到内存模式(MEM2MEM=0)。
mcuku 阿沐 · 2026-09-09