STM32 使用 DMA 与空闲中断接收不定长数据时,如何避免因总线占用导致的丢包?

· 1 浏览

回答(4)

如果总线占用频繁,建议降低串口波特率或改用DMA优先级最高,同时确保DMA时钟与总线时钟同步,避免仲裁延迟。
硬件小飞 · 2026-08-27
检查DMA配置是否开启‘传输完成中断’和‘半传输中断’,配合空闲中断做三段式处理,能有效应对突发总线占用。
码农阿杰 · 2026-08-27
用环形缓冲区+双缓冲DMA,空闲中断只更新写指针,主循环读指针处理,彻底解耦总线与CPU,丢包率可降为零。
嵌入式老周 · 2026-08-27
核心思路是让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

🧰 配套工具

⏱️ 定时器计算器