中断不触发

时间:2019-05-31 19:13:51

标签: stm32 stm32f4

问题将很快被删除。犯了一个愚蠢的错误,这些IRQ应该由按钮触发。我的意思是问他们为什么不自动自行射击。

不触发中断处理程序。那是一本书的代码 大多数情况下。基于stm32f411RE Nucleo的主板。

该代码用于f429,但根据我的研究,它看起来应该是 很好。

编辑: 添加此行使其触发,但只能执行一次:

EXTI->SWIER = EXTI_SWIER_SWIER0|EXTI_SWIER_SWIER2;

所以我需要为此重置一个标志。 但是为什么原始硬件中断不会触发。


int main(void) 
{     
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN;
RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN; 
__DSB();

GPIOA->MODER |= GPIO_MODER_MODE5_0; 
GPIOB->PUPDR |= GPIO_PUPDR_PUPD2_0;

    SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PB | SYSCFG_EXTICR1_EXTI2_PB ;

    EXTI->FTSR = EXTI_FTSR_TR2;    
    EXTI->RTSR = EXTI_RTSR_TR0;
    EXTI->IMR = EXTI_IMR_MR0 | EXTI_IMR_MR2;

    NVIC_EnableIRQ(EXTI0_IRQn);
    NVIC_EnableIRQ(EXTI2_IRQn);

    while (1);
    } 
/* main */
void EXTI0_IRQHandler(void) 
{
        if ( EXTI->PR & EXTI_PR_PR0) 
        {
            EXTI->PR = EXTI_PR_PR0;

            GPIOA->ODR ^= GPIO_ODR_OD5;    }

}

void EXTI2_IRQHandler(void) 
{
        if ( EXTI->PR & EXTI_PR_PR2) 
        {
            EXTI->PR = EXTI_PR_PR2;
            GPIOA->ODR ^= GPIO_ODR_OD5;   
        }
}

1 个答案:

答案 0 :(得分:-1)

您还必须清除NVIC中的待处理IRQ,例如

NVIC_ClearPendingIRQ(EXTI0_IRQn);

此外,您需要确保中断向量表具有适合您的处理程序的正确条目。通常,中断向量表位于启动文件中,但这取决于您的系统。