★ 精华
核心思路是让DMA持续写入环形缓冲区,同时用空闲中断(IDLE)或超时机制标记帧边界。为避免覆盖,需保证缓冲区大小大于最大帧长,且每次接收后更新写索引(DMA当前传输计数可反推)。实操建议:1)用双缓冲或环形队列,读索引由主循环维护,写索引由DMA中断更新,二者差值即有效数据;2)在IDLE中断中,通过`__HAL_DMA_GET_COUNTER`计算本次接收长度,并立即拷贝数据或置标志,防止DMA继续写覆盖未读数据;3)若帧率极高,可启用DMA传输完成中断(半传输/全传输)配合环形缓冲,分段处理。关键点:确保读速度大于写速度,否则必丢帧;必要时增加缓冲区容量或采用乒乓缓冲。
嵌入式老李:这个提醒太及时了,我们正好在调 I2C 时序,试试你的方案。