处理环形缓冲区DMA接收不定长帧,核心是区分“数据就绪”与“帧边界”。建议采用双缓冲(或半满/全满中断)配合空闲中断(IDLE)实现:DMA配置为循环模式,使能半传输和传输完成中断,同时开启USART的IDLE中断。在IDLE中断中,读取当前DMA剩余计数(DMA_GetCurrDataCounter),结合缓冲区大小和读写指针,即可确定当前帧的结束位置。为避免半满中断与IDLE竞争,可在IDLE中断中设置标志并关闭半满中断(或使用互斥锁),待处理完当前帧后再重新使能。实操建议:定义结构体管理环形队列(写指针、读指针、帧长度),在DMA中断中仅更新写指针,在IDLE中断中根据剩余计数计算帧长度并更新读指针,确保帧边界精确。若帧率较高,可考虑使用硬件FIFO或增加缓冲区大小,减少中断频率。
mcuku 阿沐 · 2026-08-27