STM32 使用 DMA 双缓冲传输时,如何避免缓冲区切换瞬间的数据丢失?

· 1 浏览

回答(4)

用DMA的传输错误中断(TE)和FIFO错误中断(FE)监控切换瞬间,若触发则记录现场,便于定位是地址错位还是时序问题。
固件工程师小刘 · 2026-08-27
检查外设的硬件流控,如UART的RTS/CTS,或SPI的NSS,可让外设暂停发送,给DMA切换留出时间窗口。
芯片调试员 · 2026-08-27
建议用双缓冲加乒乓机制,在TC中断里先处理已满缓冲区,再切换DMA地址,确保处理时间小于DMA填满一个缓冲区的时间,否则会覆盖。
嵌入式老周 · 2026-08-27
在STM32的DMA双缓冲传输中,缓冲区切换瞬间的数据丢失通常源于切换时序与硬件FIFO/外设接口的竞争。核心解决思路是:确保DMA在切换前完成当前缓冲区的全部数据搬运,且外设(如ADC、UART)的FIFO不溢出。实操建议:1) 使用DMA的传输完成中断(TC)而非半传输中断(HT)来触发切换,并在中断服务程序中立即更新DMA的M0AR/M1AR寄存器,同时设置DMA_CTR的EN位保持使能;2) 若外设FIFO深度有限,可启用DMA的循环模式(Circular)配合双缓冲,让硬件自动切换,但需在TC中断中处理数据,避免软件干预延迟;3) 对于高速外设,考虑增加FIFO深度或使用DMA的突发传输(Burst)模式,减少切换窗口;4) 在初始化时,将两个缓冲区地址对齐到32字节,并确保缓冲区大小是外设数据宽度的整数倍,防止部分字传输。若仍丢数据,可临时禁用DMA的自动重载功能,在TC中断中手动重载地址,但需注意中断延迟应小于一个DMA周期。
mcuku 阿沐 · 2026-08-27