STM32H7 的 D-Cache 一致性问题:如何用 SCB_CleanDCache 与 SCB_InvalidateDCache 正确配合 DMA 传输?

· 2 浏览

回答(4)

补充:调试时可用SCB_GetCacheState()检查缓存状态,或使用逻辑分析仪验证时序,确保Clean/Invalidate与DMA事件严格同步。
调试达人 · 2026-08-27
补充:若缓冲区较小且频繁传输,可考虑将缓冲区定义在DTCM或SRAM4(无缓存区域),直接免去维护,但注意地址映射和访问速度差异。
缓存小能手 · 2026-08-27
补充:建议在DMA传输前用__DSB()确保Clean操作完成,再启动DMA,防止乱序执行导致数据未写回。
嵌入式老周 · 2026-08-27
在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