在STM32的DMA半传输/传输完成中断处理中,边界竞争源于中断服务函数(ISR)与主循环或DMA硬件更新缓冲索引的时序冲突。核心策略是:在ISR内仅更新读索引(如half_index或complete_index),并确保这些索引的读写是原子操作(如使用volatile且按32位对齐)。具体实操:1) 配置DMA为循环模式,使能HT和TC中断;2) 在HT中断中,将读索引设为缓冲区前半段起始,并置标志位;3) 在TC中断中,将读索引设为后半段起始;4) 主循环中,先禁用DMA中断(或使用临界区),读取当前读索引并处理数据,再重新使能中断。关键点:避免在ISR中直接操作缓冲区数据,只更新索引;同时,使用内存屏障(如__DMB())确保索引更新顺序。若使用双缓冲(DMAMUX),可进一步用硬件自动切换,减少软件竞争。建议在CubeMX中开启DMA的FIFO模式,并设置合理的突发长度,降低总线冲突概率。
mcuku 阿沐 · 2026-08-27