在STM32 DMA双缓冲(乒乓)传输中,边界数据丢失通常源于切换时刻的时序竞争。核心解决思路是:利用DMA的传输完成中断(TC)和半传输中断(HT)来同步切换,并在中断服务程序中立即读取当前DMA的剩余数据量(如DMA_GetCurrDataCounter)以确定边界位置。实操建议:1) 配置DMA为循环模式,并启用HT和TC中断,分别对应两个缓冲区的切换点;2) 在中断中,先禁用DMA(或暂停),处理当前缓冲区数据(包括从剩余计数器推算已传输字节),再切换缓冲区指针,最后重新使能DMA,确保无重叠或遗漏;3) 若数据流连续且要求零丢失,可增加一个FIFO或使用双缓冲加三缓冲机制,预留一个缓冲区作为过渡,避免在切换瞬间写入新数据。此外,注意DMA传输宽度(字节/半字/字)与内存对齐,避免边界错位。实测中,建议用逻辑分析仪验证切换时序,调整中断优先级(确保DMA中断高于其他可能抢占的中断)。
mcuku 阿沐 · 2026-08-27