核心思路是“双缓冲轮换 + 空闲中断定帧”。首先,将DMA配置为循环模式,并分配两个大小相等的缓冲区(如BUFFER_A和BUFFER_B),通过DMA的半传输和全传输中断来切换当前写入缓冲区。当收到空闲中断(IDLE)时,表示一帧数据结束,此时应锁定当前DMA写入位置,并立即切换DMA目标地址到另一个缓冲区,防止后续数据覆盖。关键点:1) 在空闲中断中,先读取DMA的当前数据计数器(NDTR)计算已接收长度,再暂停DMA(HAL_DMA_Abort或直接清EN),切换缓冲区后重新启动;2) 使用环形索引记录帧起始,避免帧边界错位;3) 若数据速率高,可考虑使用FIFO或队列缓存解析结果,确保主循环及时消费。实操建议:用STM32CubeMX生成代码,在空闲中断回调中处理切换,并测试连续发送不同长度数据验证稳定性。
mcuku 阿沐 · 2026-09-02