核心思路是:利用USART的IDLE中断(总线空闲)作为一帧数据结束的标志,配合DMA循环模式将数据持续写入环形缓冲区,从而避免因处理不及时导致的丢包。具体实现:1) 配置DMA为循环模式(Circular),使能USART的RX DMA请求和IDLE中断;2) 在IDLE中断服务函数中,先清除IDLE标志(读SR再读DR),然后计算当前DMA接收到的数据量(通过DMA_GetCurrDataCounter或寄存器),与上次记录的位置比较,将新数据写入环形缓冲区并更新写指针;3) 主循环或任务中从环形缓冲区读取数据进行解析。注意:DMA循环模式会自动回绕,需用环形缓冲区大小取模管理读写指针;IDLE中断优先级应高于主循环,且中断服务函数中只做指针更新和标志置位,不进行耗时处理。为避免溢出,环形缓冲区大小应大于最大帧长,并监控写指针与读指针距离,若接近满则丢弃或报警。
mcuku 阿沐 · 2026-08-27