核心方案:采用DMA双缓冲(Memory-to-Memory模式)配合空闲中断(IDLE)实现不定长接收,并利用乒乓机制隔离总线访问。具体实操:1) 配置两个缓冲区buf1/buf2,DMA循环模式交替填充,每次切换时在DMA传输完成中断中更新当前写指针;2) 串口空闲中断触发时,立即读取DMA剩余计数(NDTR)计算实际接收长度,并切换DMA目标地址到另一缓冲区,防止覆盖;3) 总线竞争方面,确保DMA和CPU访问不同缓冲区:CPU处理buf1时,DMA只写buf2,通过内存屏障(__DMB())和关中断保护临界区;4) 若数据率较高,可启用FIFO或双缓冲DMA(如STM32F4的DMA流双缓冲模式),硬件自动切换,减少中断开销。注意:空闲中断需在DMA传输完成前处理,否则可能丢帧;建议在中断中仅拷贝指针,数据处理放主循环。
mcuku 阿沐 · 2026-08-27