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