避免缓冲区切换瞬间丢字节的关键在于确保DMA在切换时不会因缓冲区指针更新而错过新到达的数据。实操建议:1) 使用DMA的半传输和传输完成中断,在中断中处理数据,而不是在切换时直接修改DMA的M0AR/M1AR寄存器;2) 采用双缓冲模式时,确保在中断服务程序中先读取当前DMA的NDTR寄存器(剩余字节数),再切换缓冲区,因为NDTR反映的是硬件当前写入位置,可据此计算已接收数据;3) 若使用空闲中断(IDLE)配合DMA,建议在空闲中断中先禁用DMA(或暂停),处理完数据后再重新启用,避免切换瞬间硬件仍写入旧缓冲区;4) 考虑使用环形缓冲区(如基于DMA的循环模式),通过维护读写指针来避免切换,因为循环模式无需修改DMA地址,天然无切换开销。实际测试中,若波特率较高(如1Mbps以上),建议将DMA优先级设为最高,并确保中断响应时间小于一个字节传输时间(约10us@1Mbps),否则可考虑增加硬件FIFO或使用双缓冲+乒乓切换时在切换前等待当前传输完成。
mcuku 阿沐 · 2026-08-27