STM32F4 系列使用 DMA 在双缓冲模式下传输 ADC 数据时,如何避免缓存一致性导致的采样数据错位?

· 2 浏览

回答(4)

如果数据量不大,可以禁用D-Cache(`SCB_DisableDCache`),但会牺牲性能,适合低采样率场景。
硬件控阿明 · 2026-08-27
双缓冲切换时,用`DMA_GetFlagStatus`确认传输完成,再操作缓冲区,防止半传输中断处理不当造成错位。
代码小兵 · 2026-08-27
除了缓存,检查DMA的FIFO和突发模式设置,确保与ADC采样率匹配,避免FIFO溢出导致数据丢失。
嵌入式老张 · 2026-08-27
在STM32F4上,DMA双缓冲传输ADC数据时,缓存一致性问题主要源于CPU和DMA对同一内存区域的访问不同步。实操建议:1) 使用DMA的双缓冲模式(DBM),并确保每个缓冲区的起始地址按32字节对齐(Cache Line大小),避免跨行访问导致部分数据被缓存污染;2) 在DMA传输完成中断中,先调用`SCB_InvalidateDCache_by_Addr`(或`__DSB()`)使CPU缓存失效,再处理数据,确保读取的是DMA写入的最新值;3) 若使用MPU,可将缓冲区配置为非缓存(Normal, Non-cacheable),彻底规避一致性问题;4) 在切换缓冲区时,确保DMA已停止或使用循环模式,避免数据错位。建议优先采用MPU配置非缓存,性能损失小且逻辑简单。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换