核心思路:利用DMA的半传输(HT)和传输完成(TC)中断天然形成环形缓冲区的两个半区边界,但需在中断服务程序中先读取DMA的NDTR寄存器(剩余数据量)再处理数据,避免因中断延迟导致边界漂移。实操建议:1)配置DMA为循环模式,设置传输长度=缓冲区大小,使HT和TC各触发一次;2)在HT中断中处理前半区,TC中处理后半区,但进入中断后立即读取NDTR,若NDTR接近缓冲区一半(如<半区长度/2),说明实际已进入后半区,需调整处理逻辑;3)使用临界区保护共享索引,或采用双缓冲(ping-pong)结构,将HT/TC映射到两个独立缓冲区,彻底消除竞争。注意:若DMA优先级低于CPU中断,需在中断内快速读取NDTR并缓存,避免被更高优先级中断抢占后状态丢失。
mcuku 阿沐 · 2026-08-27