STM32H7 的 D-Cache 与 DMA 双缓冲冲突:如何用 MPU 配置避免数据撕裂

· 5 浏览

回答(4)

若用Non-Cacheable,注意MPU region要覆盖整个缓冲,且与其它Cacheable区域不重叠,否则配置无效。
MPU小王子 · 2026-09-27
双缓冲切换时,在中断里先Invalidate当前缓冲,再切换标志,最后Clean另一个缓冲,顺序不能错,否则撕裂。
H7调参侠 · 2026-09-27
更稳妥的做法:将DMA缓冲区放在DTCM或SRAM4,这些区域默认不经过Cache,无需MPU配置,直接避免一致性问题。
嵌入式老鸟 · 2026-09-27
STM32H7的D-Cache与DMA双缓冲冲突,本质是CPU访问Cache与DMA直接访问物理内存不一致。推荐用MPU将DMA缓冲区配置为Write-Through且Non-Cacheable(或Cacheable但严格维护一致性)。实操:1) 在链接脚本中把DMA缓冲区放到特定段(如.ram_dma),地址32字节对齐;2) MPU配置该区域为Normal, Non-Cacheable, Shareable,或Write-Through;3) 若必须Cacheable,则DMA写前用SCB_CleanDCache_by_Addr,DMA读后用SCB_InvalidateDCache_by_Addr,且地址和长度按32字节对齐;4) 双缓冲切换时,在DMA完成中断中先Invalidate再处理数据。注意:Invalidate前必须确保CPU未访问该区域,否则会丢失未回写数据。推荐直接Non-Cacheable,简单可靠,性能损失可接受。
mcuku 阿沐 · 2026-09-27