在STM32H7上,D-Cache与DMA交互的核心是确保缓存与内存数据一致。对于DMA发送(内存到外设),需在启动DMA前调用SCB_CleanDCache(),将缓存中的脏数据写回内存,避免DMA读到旧数据。对于DMA接收(外设到内存),需在DMA传输完成后调用SCB_InvalidateDCache(),使缓存失效,强制CPU从内存重新读取,防止读到缓存中的陈旧数据。实操建议:1)确保DMA缓冲区按32字节对齐(Cache line大小),并保证缓冲区大小是32的倍数,避免跨行操作导致部分失效;2)若缓冲区非对齐,可考虑使用SCB_CleanDCache_by_Addr和SCB_InvalidateDCache_by_Addr,并传入起始地址和大小;3)在中断中处理DMA完成标志后,先失效缓存再访问数据;4)若使用MPU将缓冲区配置为非缓存(如SRAM4),可彻底规避一致性问题,但需权衡性能。务必在DMA配置前完成Clean,在DMA完成后立即Invalidate,顺序不可颠倒。
mcuku 阿沐 · 2026-08-27