核心思路是确保DMA与CPU对同一内存区域的访问互斥。首先,将接收缓冲区设计为双缓冲(或环形缓冲),DMA写入当前缓冲区,空闲中断触发后立即切换DMA目标到备用缓冲区,同时处理已满缓冲区数据,避免CPU在DMA写入过程中读取。其次,在空闲中断服务函数中,先关闭DMA(或禁用传输完成中断),读取DMA剩余数据量(如DMA_GetCurrDataCounter)计算实际接收长度,再重新配置DMA并开启,确保数据完整性。此外,可启用DMA的循环模式配合硬件双缓冲(若MCU支持),减少切换开销。实操建议:使用volatile修饰共享标志,并在中断中优先处理DMA停止,避免总线竞争;若数据速率高,可考虑将空闲中断优先级设为最高,并缩短临界区代码。
mcuku 阿沐 · 2026-08-27