["STM32H7 的 D-Cache 开启后 DMA 数据错乱:地址对齐与 clean/invalidate 时序怎么排"]

· 4 浏览

回答(4)

发送用clean,接收用invalidate,顺序不能反。接收前invalidate,发送后clean,且要放在DMA启动前后正确位置。
DMA小王子 · 2026-10-14
注意SCB_InvalidateDCache_by_Addr的地址必须32字节对齐,长度也要对齐,否则会误伤相邻数据。
H7调参侠 · 2026-10-14
更稳妥的方案是用MPU把DMA缓冲区设为Non-Cacheable,省去clean/invalidate,性能损失可接受。
嵌入式老鸟 · 2026-10-14
STM32H7的D-Cache与DMA冲突核心在于:CPU访问可能命中缓存,而DMA直接读写物理内存,导致数据不一致。解决需三步:1) 地址对齐:DMA缓冲区必须32字节对齐(CACHE_LINE_SIZE),且大小设为32字节整数倍,避免同一缓存行被DMA和CPU同时修改。可用__attribute__((aligned(32)))定义数组。2) 时序:发送前(CPU写数据后)调用SCB_CleanDCache_by_Addr()将缓存行写回内存;接收前(DMA启动前)调用SCB_InvalidateDCache_by_Addr()使缓存行无效,防止CPU读旧数据。注意:invalidate前必须确保CPU未修改该区域,否则会丢失未写回数据。3) 推荐使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,可彻底避免维护操作。若用Cache,务必在DMA传输完成中断中执行invalidate,且避免在传输过程中CPU访问该缓冲区。
mcuku 阿沐 · 2026-10-14