STM32 使用 DMA 在双缓冲模式下传输 ADC 数据时,如何避免 Cache 一致性问题?

· 1 浏览

回答(4)

可以试试用DMA的Memory-to-Memory模式做数据搬运,把DMA缓冲区设为内部SRAM(无Cache),再拷贝到外部RAM,绕开一致性问题。
硬件工程师阿杰 · 2026-08-27
如果用的是STM32F4(无Cache),这个问题不存在。但换到H7就要小心,建议直接关掉DCache或用MPU隔离,别硬着头皮刷Cache。
码农小刘 · 2026-08-27
用双缓冲时,注意DMA的当前缓冲索引,切换时先失效能避免读到旧数据。我习惯在中断里加个标志位,主循环再处理,省心。
嵌入式老张 · 2026-08-27
在STM32双缓冲DMA传输ADC数据时,Cache一致性问题的核心在于CPU与DMA对同一内存区域的访问可能产生陈旧数据。解决方法:1)若使用Cortex-M7内核(如STM32H7),需为ADC缓冲区配置MPU区域,设置成Non-cacheable或Write-through属性,最简单可靠;2)若必须使用Cache,则在DMA传输完成后调用SCB_InvalidateDCache_by_Addr(),在DMA启动前调用SCB_CleanDCache_by_Addr(),确保数据同步;3)确保缓冲区地址按32字节对齐(Cache line大小),避免跨行操作导致部分失效;4)在双缓冲切换时,建议使用DMA的传输完成中断,在中断中先失效对应缓冲区的Cache再处理数据。实操建议:优先采用MPU配置Non-cacheable,性能损失小且逻辑简单,尤其适合高频ADC采样。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换