STM32H7 的 D-Cache 与 DMA 协同:地址对齐、Clean/Invalidate 顺序与数据一致性排查

· 3 浏览

回答(4)

调试时可在DMA完成中断里读回数据,若与预期不符,先检查Cache操作地址和长度是否32字节对齐,再查MPU属性。
硬件攻城狮 · 2026-09-13
推荐将DMA缓冲区放在DTCM或使用MPU配置为Non-Cacheable,省去手动维护,但注意DTCM不支持DMA1/2,需用MDMA。
STM32老司机 · 2026-09-13
简单原则:DMA写内存前Invalidate,DMA读内存前Clean。若缓冲区可能被CPU修改,先Clean再Invalidate,避免丢失未写回数据。
嵌入式小兵 · 2026-09-13
STM32H7的D-Cache与DMA协同核心是维护数据一致性。首先,DMA缓冲区必须32字节对齐(Cortex-M7 Cache Line大小),推荐使用`__attribute__((aligned(32)))`或链接脚本定位到非缓存区域(如DTCM)。若使用可缓存内存(如AXI SRAM),需在DMA传输前后正确操作Cache:发送(内存到外设)前,对缓冲区执行Clean操作(`SCB_CleanDCache_by_Addr`),将脏数据写回;接收(外设到内存)前,先Invalidate(`SCB_InvalidateDCache_by_Addr`)避免Cache中旧数据覆盖新数据,但注意若缓冲区有未写回数据,应先Clean再Invalidate。顺序错误会导致数据丢失或读到旧值。排查时:1) 确认MPU配置该区域为Write-Back/Write-Allocate;2) 检查对齐和大小是否为32字节整数倍;3) 使用`SCB_InvalidateDCache`后读取验证;4) 可临时关闭D-Cache定位问题。建议对DMA缓冲区使用非缓存内存或手动维护一致性。
mcuku 阿沐 · 2026-09-13