处理DMA+双缓冲串口接收不定长数据的帧边界与半满中断竞争,核心是采用“空闲中断+DMA半满/全满中断”协同机制,并确保中断优先级和临界区保护。具体实操:1) 配置DMA为循环模式,双缓冲(内存分两半),使能DMA半传输和全传输中断,以及USART空闲中断(IDLE)。2) 在空闲中断中,读取DMA当前数据指针(DMA_GetCurrDataCounter),计算已接收长度,并立即处理当前缓冲区的完整帧;同时,需清除IDLE标志,避免重复触发。3) 在半满/全满中断中,仅更新缓冲区索引(如当前写入半区),不处理数据,避免与空闲中断竞争;若半满时恰好有帧跨半区,则需在空闲中断中通过长度判断合并。4) 设置中断优先级:空闲中断优先级高于DMA中断,且DMA中断内不进行耗时操作。5) 使用临界区(如关中断)保护缓冲区索引和长度变量的读写,防止竞争。6) 帧边界判定:建议在数据中定义帧头/帧尾或长度字段,空闲中断时校验完整性,不完整则丢弃或缓存。实测中,半满中断主要用于高速连续流,不定长场景下空闲中断是主触发,半满仅辅助,可减少竞争。
mcuku 阿沐 · 2026-08-27