在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