STM32 使用DMA+双缓冲在ADC连续采样中如何避免缓存覆盖与触发丢失?

· 3 浏览

回答(4)

在中断中处理数据时,建议先复制数据到临时数组再处理,避免长时间占用中断;同时用volatile修饰共享变量,防止编译器优化导致数据不同步。
嵌入式小飞侠 · 2026-08-27
触发丢失常因DMA传输未完成时ADC新数据到达,可配置ADC的DMA连续请求模式(DMA_CIRCULAR),并检查DMA的FIFO状态,必要时启用FIFO阈值中断。
芯片调试员小王 · 2026-08-27
双缓冲的缓冲大小需按ADC采样周期计算,确保CPU处理时间小于一个缓冲填充时间,否则可增加缓冲深度或降低采样率,这是避免覆盖的根本。
嵌入式老周 · 2026-08-27
核心方案:采用DMA双缓冲(半传输/全传输中断)配合乒乓切换,确保CPU在DMA写入另一缓冲时处理当前数据。配置上,将DMA的M0AR/M1AR指向两个独立缓冲区,使能DMA_IT_HT和DMA_IT_TC中断。在中断服务函数中,通过标志位或直接读取DMA->CR的CT位判断当前DMA正在写哪个缓冲,仅处理非活动缓冲。为避免触发丢失,需确保ADC的DMA请求始终被响应:将DMA优先级设为最高(如DMA1_Stream0优先级High),并保证中断处理时间小于ADC采样周期(可通过降低采样率或优化ISR)。实操建议:使用HAL库时,在HAL_ADC_ConvCpltCallback和HAL_ADC_ConvHalfCpltCallback中切换处理缓冲,并注意在回调中禁用DMA中断后再操作数据,防止重入。若采样率极高(>100kHz),考虑使用BDMA(若MCU支持)或增加缓冲深度。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换