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

STM32特定优先级配置下中断无法正常触发问题排查

STM32 EXTI中断未触发问题排查

问题概述

基于STM32项目开发,需通过PE2和PC11引脚的PWM上升沿触发EXTI中断计算车轮转速。已完成GPIO、EXTI、NVIC配置,全局中断开启,且优先级为0的按钮中断可正常工作,但示波器确认PWM信号存在的前提下,对应中断服务程序(ISR)始终未触发。

现有GPIO/EXTI/NVIC配置代码

GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOC, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOC, &GPIO_InitStructure);

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource11);

EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; 

EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

EXTI_InitStructure.EXTI_Line = EXTI_Line11; 
EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_Init(&NVIC_InitStructure);

中断服务程序示例(EXTI2)

void EXTI2_IRQHandler(void) {
    if (EXTI_GetITStatus(EXTI_Line2) != RESET) {
        uint32_t current_timer_value = TIM5->CNT; 
        uint32_t diff;
        float Tp, omegaR;

        if (current_timer_value >= last_left_timer_value) {
            diff = current_timer_value - last_left_timer_value;
        } else {
            diff = (0xFFFF - last_left_timer_value) + current_timer_value + 1;
        }

        Tp = diff * (1.0 / 1000000.0); 

        if (Tp > 0) {
            omegaR = 1 / (32 * Tp); 
            left_wheel_ticks = (uint32_t)(omegaR * 100); 
        }

        last_left_timer_value = current_timer_value; 
        EXTI_ClearITPendingBit(EXTI_Line2); 
    }
}

关键排查点与解决方案

1. 遗漏SYSCFG时钟使能

SYSCFG_EXTILineConfig函数依赖SYSCFG外设时钟,代码中仅开启了GPIO的AHB1时钟,未开启SYSCFG的APB2时钟,这是EXTI中断映射失效的最常见原因。需添加:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

2. GPIO输入模式冗余参数

输入模式下GPIO_OType_PP(推挽输出类型)参数无效,虽不直接导致中断失败,但建议移除该配置,避免代码混淆:

// 移除该行冗余配置
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

3. 检查EXTI中断标志位状态

使用调试器查看EXTI->PR寄存器的第2位(PE2对应EXTI_Line2)和第11位(PC11对应EXTI_Line11):

  • 若标志位已置位但ISR未触发:说明NVIC配置存在异常,或有更高优先级中断持续占用CPU(但优先级0的按钮中断正常,此可能性较低)。
  • 若标志位未置位:说明EXTI未检测到上升沿,需确认PWM信号的低电平是否符合下拉配置(低电平需接近GND),上升沿是否满足触发阈值。

4. 确认NVIC优先级分组配置

若项目中未明确配置NVIC优先级分组,可能导致优先级设置不符合预期。需在初始化阶段添加:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 示例:2位抢占优先级,2位子优先级,可根据需求调整

确保抢占优先级和子优先级的设置与分组规则匹配。

5. 排查硬件连接问题

即使示波器检测到信号,仍需确认:

  • 引脚焊接是否牢固,有无虚焊。
  • PWM信号源与STM32引脚之间是否存在电平不匹配(例如信号为5V但STM32引脚为3.3V兼容,需确认是否有电平转换)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:04:56