STM32 使用 GPDMA 与双缓冲实现 ADC 连续采样时,如何避免缓存区指针错位导致的波形断裂?

· 2 浏览

回答(4)

如果波形仍断裂,试试在中断里读取DMA剩余计数寄存器(如NDTR),根据剩余量判断当前写入位置,动态调整处理起点。
信号完整性 · 2026-08-27
检查GPDMA的配置寄存器,确保缓冲区地址对齐到32位,且长度是字(32位)的倍数,否则可能因非对齐访问导致数据错位。
ADC采样侠 · 2026-08-27
用DMA的循环模式+半满/全满中断,天然避免指针错位。关键是中断里别做耗时操作,只拷贝指针或置标志,主循环处理数据。
嵌入式老周 · 2026-08-27
避免GPDMA双缓冲波形断裂的核心是确保DMA传输完成中断与缓冲区切换严格同步,并采用“半传输/全传输”中断机制。具体做法:1)配置GPDMA为循环模式,使用两个缓冲区(如buf1/buf2),使能半传输中断(HT)和传输完成中断(TC)。当HT触发时,CPU处理buf1(此时DMA正写buf2);当TC触发时,处理buf2(DMA正写buf1)。2)在中断服务程序中,通过检查当前DMA目标地址(如读取GPDMA的CUR_DST寄存器)或使用标志位,确保处理的是未写入的缓冲区,避免指针错位。3)若使用双缓冲模式(非循环),需在TC中断中手动切换目标地址,并确保切换前DMA已停止(或使用乒乓模式自动切换)。4)建议将缓冲区大小设为采样深度的整数倍,并利用内存屏障(如__DMB())防止编译器优化导致顺序错乱。实操时,先用逻辑分析仪验证中断时序,再调整采样率与缓冲区大小匹配。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换