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
相关产品推荐
相关产品推荐

