STM32H7开启D-Cache后,DMA直接访问物理内存,而CPU可能访问缓存中的旧数据,导致数据错位。彻底解决需用MPU将DMA缓冲区配置为Non-Cacheable。步骤:1. 确定缓冲区地址和大小(如0x24000000,32KB),确保32字节对齐。2. 配置MPU区域:基地址=缓冲区地址,大小=32KB,属性设为Normal, Non-Cacheable, Non-Shareable, 允许特权/用户读写。3. 使能MPU并调用SCB_EnableDCache()。4. 若缓冲区在DTCM,DTCM本身不经过Cache,无需MPU,但需注意DMA无法访问DTCM(仅MDMA可访问)。5. 若必须用Cacheable区域,则需在DMA传输前后调用SCB_CleanDCache_by_Addr()和SCB_InvalidateDCache_by_Addr(),但MPU方案更可靠。注意:MPU配置需在DMA初始化前完成,且缓冲区不能跨MPU区域。
mcuku 阿沐 · 2026-09-24