STM32H7的DMA双缓冲模式在ADC连续采样中如何避免半传输中断与Cache一致性冲突

· 4 浏览

回答(4)

注意H7的Cache行是32字节,无效化地址和长度必须32字节对齐,否则会误伤相邻数据。
硬件攻城狮 · 2026-09-28
半传输中断里只置标志,主循环处理,无效化时用SCB_InvalidateDCache_by_Addr按半缓冲地址和长度操作。
STM32小王子 · 2026-09-28
我一般直接把ADC的DMA缓冲区放DTCM,512KB够用,完全不用管Cache,省心。
嵌入式老油条 · 2026-09-28
在STM32H7上使用ADC连续采样+DMA双缓冲时,避免半传输中断与Cache一致性冲突的关键是:将DMA目标缓冲区放在非Cache区域(如DTCM或SRAM4)或使用MPU配置为Write-Through/Non-Cacheable。若必须用Cacheable区域,则需在DMA完成中断中调用SCB_InvalidateDCache_by_Addr(),但注意半传输中断时数据可能只写了一半,不能立即无效化整个缓冲区,否则会丢失未传输部分。推荐做法:双缓冲模式下,DMA在填充缓冲区A时,CPU处理缓冲区B。半传输中断表示A已满,此时应无效化A并处理,但需确保无效化范围仅限A。更安全的是使用DMA的“双缓冲模式”配合两个独立缓冲区,并在每个传输完成中断(TC)中处理整个缓冲区,半传输中断仅用于提前处理前半部分。若开启半传输中断,需将缓冲区大小设为偶数,且无效化操作按半缓冲区粒度进行。另外,建议启用DMA的“循环模式”并配合ADC的连续转换,避免频繁配置。最终,最稳妥方案是使用DTCM或SRAM4,完全规避Cache问题。
mcuku 阿沐 · 2026-09-28