You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ADC中断未触发求助:期望EOC后调用ADC中断服务程序

排查ADC EOC中断未触发的常见问题

看起来你碰到了ADC转换结束(EOC)后中断没触发的麻烦,结合你给出的寄存器定义,咱们一步步排查最容易踩坑的几个点:

1. 先确认ADC自身的EOC中断是否开启

你需要检查ADC1_CR1寄存器的**EOCIE位(位5)**是否置1——这是ADC内部开启EOC中断的关键开关,没开的话转换结束肯定不会触发中断。

ADC1_CR1 |= (1 << 5); // 置位EOCIE,开启ADC1的EOC中断

2. 确认EOC标志的触发时机是否符合你的需求

有些STM32型号里,ADC1_CR2的**EOCS位(位10)**会决定EOC标志的触发时机:

  • 如果是单次转换/每个通道转换完成后触发EOC:ADC1_CR2 &= ~(1 << 10);
  • 如果是整个序列转换全部完成后触发EOC:ADC1_CR2 |= (1 << 10);
    要是这个位配置和你的转换模式不匹配,中断触发条件就不对,自然不会触发。

3. 别漏了NVIC层面的中断使能

就算ADC本身开了中断,如果NVIC(嵌套向量中断控制器)里没给ADC1的中断通道开绿灯,CPU根本不会响应这个中断。比如STM32F1系列的ADC1中断通道是ADC1_2_IRQn,你需要加上:

NVIC_EnableIRQ(ADC1_2_IRQn);    // 使能ADC1对应的中断通道
NVIC_SetPriority(ADC1_2_IRQn, 1); // 按需设置中断优先级,数值越小优先级越高

注意:不同MCU型号的中断通道名称可能不一样,比如有些系列是ADC1_IRQn,要对应你用的芯片手册来改。

4. 先确认ADC转换真的完成了

有时候中断没触发,根源是转换根本没执行。你可以检查这几个点:

  • ADC1_CR2的**ADON位(位0)**是否置1:这是ADC的总开关,没开的话转换没法启动
  • 如果用软件触发转换,ADC1_CR2的**SWSTART位(位22)**是否被正确置位启动转换
  • 手动读取ADC1_SREOC位(位1),看看转换结束后这个位有没有置1——如果连硬件标志都没置,说明转换流程本身有问题,先解决转换启动的问题再说中断。

5. 检查全局中断和优先级冲突

如果系统里全局中断被关闭了(比如调用过__disable_irq()),或者有更高优先级的中断一直在占用CPU,那ADC的中断也没法被响应。先确保全局中断是开启的:

__enable_irq(); // 开启全局中断

6. 中断服务函数名称必须完全正确

中断服务函数的名称必须和启动文件里定义的中断向量表条目完全一致,比如STM32F1系列的ADC1中断服务函数是ADC1_2_IRQHandler,名字写错一个字母,CPU都找不到对应的处理函数,看起来就像中断没触发。正确的示例:

void ADC1_2_IRQHandler(void)
{
    if(ADC1_SR & (1 << 1)) // 先检查EOC标志,避免误触发
    {
        // 这里写你的中断处理逻辑
        ADC1_SR &= ~(1 << 1); // 一定要清除EOC标志,否则会重复触发中断
    }
}

你可以按这个顺序逐一排查,大概率是NVIC配置或者EOCIE位没开的问题——这两个是新手最容易漏掉的点。

内容的提问来源于stack exchange,提问作者Muzahir Hussain

火山引擎 最新活动