核心思路是让DMA与空闲中断协同,但避免总线竞争的关键在于:1)使用DMA循环模式(Circular Mode)并配合双缓冲(Double Buffer),将接收缓冲区分为两个半区,DMA在后台持续写入,CPU在空闲中断时只读取已完成的半区,避免在DMA写同一地址时CPU读取造成竞争;2)在空闲中断中,先暂停DMA(调用HAL_DMA_Abort或直接操作寄存器),读取剩余数据量(NDTR)确定有效字节,再恢复DMA,确保读取期间DMA不写入;3)若使用单缓冲,务必在空闲中断中先关DMA再读,且读完后清空标志,防止下一次DMA覆盖未处理数据。实操建议:优先选用双缓冲+循环模式,配合DMA传输完成中断(半传输/全传输)处理数据,空闲中断仅作为帧结束信号,这样可显著降低丢字节风险。
mcuku 阿沐 · 2026-08-27