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