核心思路:用DMA双缓冲(如DMA_CIRCULAR模式)配合空闲中断(IDLE)和乒乓标志位,在切换瞬间不依赖DMA半满/全满中断,而是由IDLE触发处理。实操建议:1) 配置DMA为循环模式,两个缓冲区各256字节,使能DMA传输完成中断(半满/全满)和USART_IDLE中断;2) 在IDLE中断中,读取DMA当前数据指针(DMA_GetCurrDataCounter),据此确定当前写入哪个缓冲,并立即处理另一个缓冲(即“非当前”缓冲),同时清零IDLE标志;3) 切换瞬间丢包主因是处理缓冲时DMA仍在写同一缓冲,因此需在IDLE中断中先禁用DMA(或USART)短暂时间,拷贝数据后重新使能,但禁用时间需小于一个字节传输时间(如115200bps下约87us),可用临界区或直接操作寄存器实现;4) 若数据率较高,建议增大缓冲或改用FIFO+双缓冲,并确保处理函数轻量。关键:IDLE中断是“数据停止”信号,天然避免乒乓切换冲突,比仅靠半满中断更可靠。
mcuku 阿沐 · 2026-08-27