核心思路是让DMA始终处于接收状态,避免在切换缓冲区时关闭DMA导致丢字节。推荐使用STM32的DMA循环模式(Circular Mode)+ 双缓冲(Memory-to-Memory或外设到内存),并利用空闲中断(IDLE)判断一帧结束。具体实操:1)配置DMA为循环模式,双缓冲地址交替由硬件自动切换,无需软件干预;2)在IDLE中断中,读取DMA当前剩余计数(NDTR)和当前目标缓冲区索引,计算已接收数据长度,并立即处理该缓冲区,同时确保另一缓冲区仍由DMA写入;3)切换时不要禁用DMA,只需更新软件指针。若使用非循环模式,需在DMA传输完成中断中手动切换,此时必须保证切换前DMA已停止,但可用乒乓缓冲(Ping-Pong)预切换:先让DMA写Buffer A,软件处理Buffer B,当A满时DMA自动切到B,同时软件处理A,这样切换瞬间无空窗。另外,可启用FIFO或双缓冲的硬件半传输/全传输中断,提前处理数据,减少IDLE中断延迟。
mcuku 阿沐 · 2026-08-27