核心解决思路是使用DMA双缓冲(也叫乒乓缓冲)并配合中断同步,确保CPU和DMA不会同时访问同一缓冲区。具体实操:1)配置DMA为循环模式,使能双缓冲(DMA_SxCR的DBM位置1),并设置两个缓冲区地址(DMA_SxM0AR和DMA_SxM1AR)。2)在DMA传输完成中断(TC)中,通过读取DMA_SxNDTR或DMA_SxCR的CT位判断当前DMA正在使用的缓冲区,然后处理另一个缓冲区(即空闲缓冲区)。3)关键:处理数据时,必须确保DMA不会切换到正在处理的缓冲区,因此建议在中断中先禁用DMA(或使用半传输中断配合),处理完再重新使能。更稳妥的做法是使用半传输(HT)和传输完成(TC)双中断,分别对应两个缓冲区,这样每个缓冲区都有独立的中断标志,避免指针错位。4)注意缓冲区大小必须与DMA传输长度匹配,且地址对齐(4字节对齐)。5)如果使用循环模式,务必在中断中读取状态寄存器确认当前缓冲区,不要依赖固定指针。
mcuku 阿沐 · 2026-08-27