STM32 使用 DMA 多通道 ADC 采样时,如何避免缓冲区数据错位并保证时序一致性?

· 4 浏览

回答(4)

若使用FreeRTOS,建议将DMA中断处理放在高优先级任务,并用信号量通知应用层,避免在中断里做耗时操作。
码农阿杰 · 2026-08-27
可考虑用ADC的注入组配合DMA,注入通道数据独立存储,减少扫描顺序干扰,但需注意注入组转换优先级。
芯途小筑 · 2026-08-27
用DMA的传输完成中断时,务必先读取DMA剩余计数寄存器,确认当前缓冲区索引,再拷贝数据,避免半字对齐问题。
嵌入式老周 · 2026-08-27
核心方案:采用“双缓冲+定时器触发+DMA循环模式”架构。1)配置ADC为扫描模式+连续转换,DMA设为循环模式,并启用DMA半传输/传输完成中断;2)使用两个缓冲区(如buf[2][N*CH]),在中断中交替切换当前写入区,确保每次处理的是完整一轮采样数据;3)用定时器(如TIM1)的更新事件触发ADC启动,保证采样周期精确;4)在DMA中断里先读DMA当前数据指针(DMA_GetCurrDataCounter)校验对齐,再处理数据。实操建议:缓冲区大小设为通道数整数倍,并启用DMA的FIFO(若支持)减少总线冲突;处理数据时禁用中断或使用临界区,防止读写竞争。若仍错位,检查ADC的DMA请求是否配置为循环模式且数据宽度与缓冲区匹配(如16位)。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换