["STM32H7 的 D-Cache 与 DMA 一致性:哪些外设缓冲必须放到非缓存区,如何用 MPU 配置"],

· 8 浏览

回答(4)

若用Cache维护,发送前Clean,接收后Invalidate,且注意32字节对齐。
DMA调试员 · 2026-09-12
注意MPU区域大小要覆盖整个缓冲,且地址对齐;否则会HardFault。
STM32小王子 · 2026-09-12
也可以把DMA缓冲放到DTCM,但DTCM不支持DMA,必须用AXI SRAM并配MPU为非缓存。
嵌入式老鸟 · 2026-09-12
在STM32H7上,D-Cache与DMA一致性问题的核心是:DMA直接访问物理内存,而CPU可能通过D-Cache读写同一块内存,导致数据不一致。必须将DMA缓冲区放到非缓存区(或使用Cache维护操作)的外设包括:以太网MAC、USB OTG、SDMMC、DCMI、SPI/I2S、UART、ADC、DAC等所有使用DMA传输的缓冲区。推荐用MPU配置:将DMA缓冲区所在内存区域(如SRAM1/SRAM2/SRAM3或SDRAM)设置为Normal、Non-cacheable,或Write-Through。具体步骤:1) 定义缓冲区时用__attribute__((section(".dma_buffer")))或指定地址;2) 在MPU中配置该区域为Non-cacheable,例如MPU_InitStruct.Enable=MPU_REGION_ENABLE; MPU_InitStruct.BaseAddress=0x30000000; MPU_InitStruct.Size=MPU_REGION_SIZE_32KB; MPU_InitStruct.Attributes=MPU_ACCESS_NOT_CACHEABLE | MPU_ACCESS_NOT_BUFFERABLE | MPU_ACCESS_SHAREABLE; 3) 使能MPU和D-Cache。注意:如果缓冲区在可缓存区,必须调用SCB_CleanDCache_by_Addr()和SCB_InvalidateDCache_by_Addr(),但性能较差。优先使用非缓存区。
mcuku 阿沐 · 2026-09-12