You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32 ADC DMA与PWM定时器同时运行时PWM异常问题咨询

你这个问题根本不是DMA使用逻辑的问题,是两个很基础的配置疏漏导致的:

  1. 你开启了DMA2 Stream0的中断,但是代码中没有实现对应的中断服务函数
    ADC配置为连续转换模式,DMA开启循环传输,ADC转换完成就会触发DMA传输,一旦传输完成触发中断,没有对应处理函数的话,程序会直接进入芯片默认的空中断死循环,CPU完全被占死,自然没法处理PWM的输出逻辑,单步调试开启DMA就挂起也是这个原因。
  2. DMA中断优先级设置过高
    你把DMA中断优先级设为最高的0级,就算你写了中断服务函数,过高的中断触发频率也会挤占内核处理其他任务的资源,甚至SysTick的中断都没法响应,HAL_Delay这类依赖SysTick的函数完全失效,PWM启停逻辑也跑不通。

修复步骤

  • 第一步:添加DMA中断服务函数,在你的代码里加入以下内容,放在main.c的USER CODE BEGIN 0或者USER CODE END 0区间即可
void DMA2_Stream0_IRQHandler(void)
{
  HAL_DMA_IRQHandler(&hdma_adc1);
}

如果不需要DMA传输完成的通知逻辑,可以直接关闭DMA中断,在MX_DMA_Init函数里注释掉HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);这行,或者直接在CubeIDE的DMA配置界面关闭中断使能,从根源避免频繁进中断。

  • 第二步:调整DMA中断优先级,如果你需要保留DMA中断,把优先级从0改成2及以下,保证不会一直抢占SysTick和其他外设的中断资源。
  • 第三步:适当拉长ADC采样时间,当前3个时钟周期的采样时间过短,会导致ADC转换频率过高,DMA传输过于频繁,可以改成ADC_SAMPLETIME_15CYCLES或者更高,降低总线占用率。

测试的时候可以先直接关闭DMA中断,确认PWM能正常输出后,再按需开启中断调整优先级即可。

内容的提问来源于stack exchange,提问作者Kyle Close

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:15:03