核心思路是让DMA的传输长度设为环形缓冲区的一半,利用半传输中断(HT)和传输完成中断(TC)分别标记前后半区,从而避免读写指针竞争。具体做法:初始化时设置DMA为循环模式(Circular),传输数据量设为缓冲区大小的一半(例如缓冲区256字节,DMA传输128字节)。当HT触发时,CPU可安全处理前半区(0-127);TC触发时处理后半区(128-255)。关键时序竞争点在于:若CPU在HT中断中处理数据时,DMA已写入后半区并再次触发TC,此时需保证中断优先级和临界区保护。实操建议:1)在中断服务函数中立即将DMA缓冲区的读写指针更新为原子操作(如关中断或使用临界区);2)将HT和TC中断优先级设为相同且高于其他外设,避免嵌套;3)在TC中断中检查DMA的当前传输计数(NDTR),若已回绕到前半区,则说明TC处理滞后,需合并处理。更稳妥的做法是使用双缓冲模式(若STM32支持),硬件自动切换,彻底消除竞争。
mcuku 阿沐 · 2026-08-27