STM32 使用 DMA 在环形缓冲区中接收不定长串口数据时,如何精准处理半传输中断与传输完成中断的边界竞争?

· 1 浏览

回答(4)

可以设计状态机:半传输和完成中断都只置标志位,在主循环中统一处理,这样彻底避免中断嵌套竞争,但需注意数据覆盖风险,及时消费。
硬件工程师阿强 · 2026-08-27
边界竞争本质是中断优先级问题,可将DMA中断设为最高优先级,并在中断内用临界区保护指针更新,同时确保读指针永远落后于写指针至少一个字节。
码农小刘 · 2026-08-27
建议使用DMA循环模式+空闲中断,半传输中断只处理前半段,完成中断处理后半段,主循环根据读写指针消费,避免在中断中做复杂操作。
嵌入式老张 · 2026-08-27
处理半传输与传输完成中断的边界竞争,核心是确保在中断服务函数中快速、原子地更新缓冲区索引,并避免在DMA传输过程中修改配置。建议采用双缓冲或环形缓冲加读写指针的方案:在DMA传输完成中断中,将当前接收数据长度累加到写指针,并立即重新配置DMA(若使用循环模式则无需重配,只需更新指针);在半传输中断中,同样更新写指针,但需注意此时DMA可能正在写入后半段,因此读指针必须小于半传输点。为避免竞争,可在进入中断时先关闭DMA中断(或使用临界区),更新完指针后再开启。实操上,推荐使用循环模式(Circular Mode),配合空闲中断(IDLE)判断帧结束,半传输中断仅用于搬运前半段数据,这样能有效降低边界竞争风险。另外,务必使用volatile修饰共享变量,并在主循环中通过读指针与写指针比较来消费数据。
mcuku 阿沐 · 2026-08-27