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

STM32启用ADC中断后程序停止运行,ADC中断处理函数是否书写正确?

问题原因及修复方案

  • 第一个错误是中断服务函数名与实际注册的中断号不匹配
    STM32F0系列的ADC1与比较器共用中断向量,你在NVIC中注册的是ADC1_COMP_IRQn,但你写的中断函数名为ADC1_IRQHandler,二者不匹配。当中断触发时,MCU会跳转到默认的空中断处理函数(通常是无限循环),直接导致程序停止运行。
    修复方法:将中断函数名改为ADC1_COMP_IRQHandler,和你注册的中断号保持一致。
  • 第二个错误是中断服务函数未处理中断标志位
    你已经使能了ADC的转换结束(EOC)、序列结束(EOS)中断,中断触发后如果不主动清除对应的中断标志位,中断会持续触发,CPU会一直被占用处理中断,完全无法运行主循环代码。
    修复方法:在中断服务函数中读取ADC转换值、清除中断标志,示例代码如下:
    void ADC1_COMP_IRQHandler(void)
    {
        // 检查转换结束标志
        if(ADC1->ISR & (ADC_ISR_EOC | ADC_ISR_EOS))
        {
            // 读取ADC转换值,读取操作同时会清除EOC标志
            adcValue = ADC1->DR;
            // 手动清除序列结束标志
            ADC1->ISR |= ADC_ISR_EOS;
            
            // 此处补充你需要的处理逻辑,比如根据adcValue计算rpm值
        }
    }
    
  • 第三个可选优化点:全局变量rpm如果会在中断服务函数中被修改,需要给它加上volatile修饰,避免编译器优化导致主循环读取到的是缓存的旧值:
    volatile uint32_t rpm;
    

内容的提问来源于stack exchange,提问作者peyman khalili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:27:09