STM32 使用 DMA 双缓冲接收不定长串口数据时,如何避免乒乓缓冲切换瞬间丢字节?

· 1 浏览

回答(4)

如果数据率较高,可考虑使用FIFO硬件缓冲(如STM32F4的USART_DR),或增加DMA优先级,减少切换延迟。
硬件工程师阿强 · 2026-08-27
用空闲中断+DMA循环模式,配合双缓冲,切换时利用DMA的自动重载功能,但需在空闲中断中读取剩余计数,确保数据完整。
码农小刘 · 2026-08-27
建议在DMA半传输和传输完成中断中,分别处理两个缓冲,但切换前务必关DMA,否则可能丢字节。可用环形队列缓冲接收数据,减少切换风险。
嵌入式老张 · 2026-08-27
核心方案:使用DMA双缓冲时,确保在切换缓冲前先暂停DMA(DMA_Cmd(DMAx, DISABLE)),读取当前剩余数据量(DMA_GetCurrDataCounter),并处理残留数据,再切换缓冲(DMA_MemoryTargetConfig),最后重新使能DMA。关键点:在DMA中断(如传输完成或半传输)中,先关闭DMA,因为切换瞬间若DMA仍在运行,新数据可能写入旧缓冲导致覆盖。实操建议:1)使用空闲中断(IDLE)检测帧结束,在空闲中断中处理数据,而非依赖DMA中断;2)设置DMA为循环模式,配合双缓冲,但切换时仍要暂停;3)若使用HAL库,注意HAL_UARTEx_ReceiveToIdle_DMA的底层实现,确保在回调中调用HAL_UARTEx_RxEventCallback时,DMA已自动暂停,但需手动处理剩余数据。测试时,用示波器或逻辑分析仪验证切换瞬间的字节完整性。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

🔗 波特率计算器