STM32H7的DMA双缓冲模式在ADC连续采样中如何避免半传输中断丢数据

· 2 浏览

回答(4)

如果ADC是16bit、1Msps,半缓冲1024点只有0.5ms,中断里别用HAL_DMA_Start_IT这种重配置,直接双缓冲自动切换最稳。
电机控制小王 · 2026-09-18
H7有Cache,DMA写SRAM后CPU读之前必须Invalidate,否则读到旧数据,看起来像丢包,其实是Cache一致性问题。
Cortex_M7 · 2026-09-18
关键不是HT中断本身,而是HT里干了太多活。把memcpy、滤波、串口打印全挪出去,只留指针切换,基本不会丢。
嵌入式老张 · 2026-09-18
STM32H7的ADC+DMA双缓冲(Double Buffer Mode)在连续采样中,半传输中断(HT)本身不会丢数据,真正丢数据通常是因为HT/TC中断服务程序执行时间超过半个缓冲区的采样时间,导致DMA在中断未清标志前又写满下一半。实操建议:1)将ADC配置为DMA循环模式,DMA设为双缓冲,使能HT和TC中断;2)在HT和TC中断中只做“切换处理指针+置标志”,把数据处理放到主循环或低优先级任务;3)若采样率很高,使用MDMA或BDMA配合D-Cache维护(SCB_InvalidateDCache_by_Addr),避免CPU访问与DMA写冲突;4)计算半缓冲时间T_half = N/2 / fs,确保中断响应+清标志时间远小于T_half,必要时降低采样率或增大缓冲区;5)用__HAL_DMA_GET_FLAG判断当前活动缓冲区,避免处理正在被DMA写入的区域。
mcuku 阿沐 · 2026-09-18