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

· 2 浏览

回答(4)

实际调试时,用逻辑分析仪观察DMA中断频率和ADC采样率,若中断太频繁,可增大缓冲区或降低采样率。同时,在中断中处理数据要快,避免影响实时性。
调试小能手 · 2026-08-27
对于带Cache的MCU,除了失效和清理,还需确保缓冲区在SRAM中且非DMA不可达区域。可考虑使用MPU配置为非缓存区域,从根本上避免一致性问题。
缓存大师 · 2026-08-27
注意:双缓冲模式下,DMA的NDTR寄存器会自动重载,但需在中断中手动切换内存目标,否则数据会覆盖。建议使用HAL库的HAL_DMAEx_MultiBufferStart函数简化配置。
嵌入式老张 · 2026-08-27
在STM32双缓冲DMA传输ADC数据时,核心配置包括:1)初始化DMA为循环模式,设置双缓冲(Memory0/Memory1)并启用DMA_CTRL_MEMORY_INC;2)在ADC配置中启用DMA请求,并设置数据对齐(如右对齐16位);3)在DMA中断回调中切换当前活动缓冲区(通过读取DMA_GetCurrentMemoryTarget),确保在缓冲区切换前处理完数据。缓存一致性方面,若使用带Cache的MCU(如STM32H7),需在DMA访问前调用SCB_InvalidateDCache_by_Addr(读取前)或SCB_CleanDCache_by_Addr(写入前),并确保缓冲区地址按32字节对齐;若使用不带Cache的F1/F4系列,则无需处理,但需注意DMA传输完成后数据才有效,建议在传输完成中断中处理数据,避免在传输过程中访问缓冲区。实操建议:使用双缓冲时,在DMA传输完成中断中先切换目标缓冲区,再处理已满缓冲区,并设置缓冲区大小满足ADC采样率,防止溢出。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换