核心方案是采用“双缓冲+状态机”设计。首先,为DMA配置两个缓冲区(如BUFF_A和BUFF_B),通过DMA的半传输和传输完成中断切换缓冲区,确保CPU处理一个缓冲区时DMA写入另一个,避免覆盖。其次,利用空闲中断(IDLE)标记一帧结束,在中断中记录当前DMA剩余数据量(DMA_GetCurrDataCounter),结合缓冲区基址计算有效数据长度,并立即切换DMA目标地址到备用缓冲区,防止后续数据覆盖。同时,在空闲中断中禁用DMA传输(或使用循环模式+标志位),待处理完再重新使能。为避免错位,需在初始化时对齐缓冲区地址(如4字节对齐),并在处理数据时使用memcpy拷贝到应用层,而非直接引用DMA缓冲区。实操建议:使用HAL库的HAL_UARTEx_RxEventCallback,它已整合IDLE+DMA,简化逻辑;务必在回调中先读取剩余计数再切换缓冲区,并设置临界区保护。
mcuku 阿沐 · 2026-09-01