我正在开发一个使用 STM32 微控制器的项目,其中我需要处理由引脚 PE2 和 PC11 上的 PWM 信号生成的中断。尽管配置了中断并确保启用了全局中断,但我还是遇到了一个问题,即这些引脚的中断服务例程 (ISR) 未按预期触发。
我的 GPIO 配置如下所示:
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);
ISR 应该根据 PWM 信号的上升沿计算车轮速度。然而,尽管存在信号(用示波器确认),但它们并没有被调用。我已将这些中断的优先级设置为 1,子优先级为 0,而优先级为 0 的按钮中断工作正常。
其中一个 ISR 的示例:
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);
}
}
我已经验证了 GPIO 和 NVIC 配置,确保启用了全局中断,并使用示波器检查了信号。我还尝试了不同的优先级和子优先级设置,但没有成功。
什么可能阻止我的 ISR 被触发?是否与优先级配置有关,或者还有其他我可能忽略的事情吗?
我已经成功解决了该问题,并希望在此与将来可能遇到类似问题的任何人分享解决方案。
问题的根源在于我试图将外部中断 (EXTI) 与来自 STM32 微控制器上两个不同 GPIO 端口的引脚一起使用。尽管 STM32 在处理不同端口的外部中断方面具有灵活性,但我最初将 PE2(来自 GPIOE)和 PC11(来自 GPIOC)一起使用的方法并没有按预期工作。
我决定尝试仅使用一个 GPIO 端口的引脚来实现外部中断。这一变化使一切都按预期进行。