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