处理半传输与传输完成中断的边界竞争,核心是确保在中断服务函数中快速、原子地更新缓冲区索引,并避免在DMA传输过程中修改配置。建议采用双缓冲或环形缓冲加读写指针的方案:在DMA传输完成中断中,将当前接收数据长度累加到写指针,并立即重新配置DMA(若使用循环模式则无需重配,只需更新指针);在半传输中断中,同样更新写指针,但需注意此时DMA可能正在写入后半段,因此读指针必须小于半传输点。为避免竞争,可在进入中断时先关闭DMA中断(或使用临界区),更新完指针后再开启。实操上,推荐使用循环模式(Circular Mode),配合空闲中断(IDLE)判断帧结束,半传输中断仅用于搬运前半段数据,这样能有效降低边界竞争风险。另外,务必使用volatile修饰共享变量,并在主循环中通过读指针与写指针比较来消费数据。
mcuku 阿沐 · 2026-08-27