在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