STM32 中断在特定优先级设置下无法正确触发

问题描述 投票:0回答:1

我正在开发一个使用 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 被触发?是否与优先级配置有关,或者还有其他我可能忽略的事情吗?

c stm32 interrupt stm32f4discovery stm32f4
1个回答
0
投票

我已经成功解决了该问题,并希望在此与将来可能遇到类似问题的任何人分享解决方案。

问题的根源在于我试图将外部中断 (EXTI) 与来自 STM32 微控制器上两个不同 GPIO 端口的引脚一起使用。尽管 STM32 在处理不同端口的外部中断方面具有灵活性,但我最初将 PE2(来自 GPIOE)和 PC11(来自 GPIOC)一起使用的方法并没有按预期工作。

我决定尝试仅使用一个 GPIO 端口的引脚来实现外部中断。这一变化使一切都按预期进行。

© www.soinside.com 2019 - 2024. All rights reserved.