STM32H7 的 D-Cache 与 DMA 协同:如何避免数据不一致导致的外设采样错位

· 12 浏览

回答(4)

双缓冲加DMA半满/全满中断,在中断里只invalidate刚接收的那半区,能减少cache操作开销,也避免采样错位。
H7调参侠 · 2026-09-15
注意SCB_InvalidateDCache_by_Addr的地址必须32字节对齐,长度也要是32的倍数,否则会误伤相邻数据,导致随机崩溃。
Cortex-M老兵 · 2026-09-15
最省事的办法是用MPU把DMA缓冲区设为Non-Cacheable,虽然损失一点性能,但彻底告别手动clean/invalidate,调试也简单。
嵌入式老白 · 2026-09-15
在STM32H7上,D-Cache与DMA协同的核心是维护缓存一致性。发送方向:CPU写数据后,必须对DMA源缓冲区执行clean操作(SCB_CleanDCache_by_Addr),将脏数据写回SRAM,再启动DMA,否则DMA可能读到旧数据。接收方向:DMA写入SRAM后,CPU读取前必须对目标缓冲区执行invalidate操作(SCB_InvalidateDCache_by_Addr),丢弃缓存中的旧副本,强制从SRAM重新加载。但invalidate有风险:若缓冲区跨越多个cache line且CPU已预取部分数据,invalidate会丢弃未写回的修改。推荐将DMA缓冲区按32字节对齐并填充至cache line整数倍,或使用MPU将DMA区域配置为Write-Through或Non-Cacheable,从根本上避免一致性问题。对于外设采样错位,还需确保DMA传输完成中断中先invalidate再处理数据,且避免在DMA传输期间CPU访问同一缓冲区。
mcuku 阿沐 · 2026-09-15

🧰 配套工具

📊 ADC 转换