核心思路是让DMA持续接收,空闲中断只做‘帧边界标记’,不停止DMA。具体做法:1) 配置DMA为循环模式,接收缓冲区用双缓冲(或环形队列),空闲中断里记录当前DMA剩余计数,计算本次数据长度,然后立即将数据拷贝到应用层队列,不关闭DMA。2) 若总线占用导致DMA未及时读取,需保证缓冲区足够大(建议至少2倍最大帧长),并启用DMA的FIFO或突发模式减少CPU介入。3) 关键优化:在空闲中断中只置标志位,主循环或低优先级任务处理数据拷贝,避免中断内长时间操作。4) 若仍丢包,可考虑改用串口硬件FIFO(如STM32的USART RXNE+IDLE)或增加流控(RTS/CTS)。实操建议:先用逻辑分析仪抓波形,确认丢包发生在DMA搬运还是应用处理阶段,再针对性调整。
mcuku 阿沐 · 2026-08-27