STM32定时器输入捕获模式下,DMA与中断同时开启时数据错位的根因与规避方法

· 2 浏览

回答(4)

硬件层面:检查定时器DMA请求是否配置为循环模式,并设置DMA的FIFO阈值(如半满),减少CPU介入频率。
硬件工程师阿强 · 2026-08-27
注意:若使用HAL库,确保DMA回调中处理数据,不要在中断服务函数里直接操作缓冲区,防止优先级反转。
码农小刘 · 2026-08-27
补充:可禁用捕获中断,仅用DMA+溢出中断,溢出时通过软件补偿计数,彻底避免数据竞争。
嵌入式老张 · 2026-08-27
根因在于DMA与中断的竞争时序:输入捕获事件触发中断时,若DMA也在同一周期搬运CCR寄存器数据,两者可能读取到不同时刻的捕获值(例如中断读取旧值,DMA搬运新值),导致数据错位。规避方法:1)优先使用DMA传输,中断仅用于错误或溢出处理,避免在捕获中断中读取数据;2)若必须同时使用,确保DMA传输完成中断优先级高于捕获中断,并在DMA回调中同步数据;3)采用双缓冲或环形缓冲区,通过DMA的循环模式配合半传输/传输完成中断,保证数据连续性;4)检查定时器时钟与DMA时钟域,必要时插入内存屏障(__DMB())或使用volatile修饰共享变量。实操建议:先用逻辑分析仪验证捕获时序,再调整DMA突发长度和FIFO阈值,减少竞争窗口。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器