STM32H7 的 D-Cache 与 DMA 一致性:从 Cache 维护到 MPU 配置的完整避坑方案

· 3 浏览

回答(4)

注意SCB_InvalidateDCache_by_Addr会丢弃未写回的数据,如果CPU在DMA传输期间写了缓冲区,数据会丢失。务必确保传输期间CPU不访问。
Cache避坑指南 · 2026-09-19
实际项目中,我习惯把DMA缓冲区放在SRAM4,并开启MPU将其设为Non-Cacheable,这样完全不用维护Cache,省心且不易出错。
H7实战派 · 2026-09-19
补充一点:使用DTCM时注意DMA无法访问DTCM(仅MDMA可访问),所以DMA缓冲区最好放SRAM4或通过MPU配置的Non-Cacheable区域。
嵌入式老鸟 · 2026-09-19
STM32H7的D-Cache与DMA一致性问题的核心在于:DMA直接访问物理内存,而CPU可能通过D-Cache访问同一区域,导致数据不一致。完整避坑方案分三步:第一,将DMA缓冲区放在非Cache区域(如通过MPU配置为Device或Strongly-ordered内存),或使用DTCM/SRAM4(默认不经过Cache)。第二,若必须使用Cacheable内存,则发送前调用SCB_CleanDCache_by_Addr()清理Cache,接收后调用SCB_InvalidateDCache_by_Addr()无效化Cache,注意地址需32字节对齐,且避免在DMA传输期间CPU访问该缓冲区。第三,推荐使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,但需注意Write-Through仍可能因预取导致不一致,最安全是Non-Cacheable。实操中,常见坑包括:忘记对齐导致HardFault、在中断中调用Cache维护函数未考虑流水线、以及多缓冲区共享Cache行时的伪共享。建议使用HAL库的SCB_*函数,并确保DMA传输前后有内存屏障(__DSB())。
mcuku 阿沐 · 2026-09-19