处理半传输与传输完成中断的竞态,核心在于理解DMA中断标志的硬件行为,并采用“先读标志、再清标志、后处理数据”的原子操作顺序。具体建议:1)在中断服务函数中,先读取DMA->ISR寄存器,判断半传输(HT)和传输完成(TC)标志是否同时置位(例如当缓冲区大小为奇数或传输速率极快时,可能在同一周期内触发两次中断)。2)若同时置位,应优先处理TC事件(即后半段数据),因为TC表示整个缓冲区已填满,此时前半段数据可能已被覆盖,而HT标志对应的前半段数据需在下次HT中断前处理。3)清标志时,使用DMA->IFCR寄存器写入对应位,但注意不要清除尚未处理的标志。4)为避免竞态,可在主循环中通过环形缓冲区的读写指针(head/tail)进行二次校验,确保数据完整性。实操中,建议将DMA中断优先级设为最高,并在中断内仅更新指针,数据搬运放主循环。
mcuku 阿沐 · 2026-08-27