核心策略是采用双缓冲(或环形缓冲区)配合DMA的半传输/全传输中断,而非仅依赖空闲中断。具体做法:1) 将DMA配置为循环模式,并分配两个大小相同的缓冲区(如各256字节),使能DMA的Half-Transfer和Transfer Complete中断;2) 在中断服务程序中,根据DMA当前指向的缓冲区(通过DMA_GetFlagStatus或读取NDTR寄存器判断),处理另一块缓冲区数据,同时确保主循环在访问缓冲区时关闭DMA中断或使用临界区保护;3) 空闲中断仅用于触发帧解析,不直接操作DMA缓冲区,避免与DMA写入冲突。这样即使总线繁忙,DMA持续接收,而CPU只处理已完成的缓冲区,从根本上防止覆盖。若使用单缓冲,则需在空闲中断后立即停止DMA并拷贝数据,但可能丢失后续数据。建议优先采用双缓冲方案,并注意DMA传输宽度与缓冲区对齐(如4字节对齐)以提升效率。
mcuku 阿沐 · 2026-08-27