中断处理程序将无法运行

时间:2019-02-03 19:01:14

标签: interrupt stm32 keil

我正在使用stm32l467并试图在按下用户按钮时运行ISR。一切看起来都可以正确设置。我已经查看了调试器(Keil uV)中的寄存器,一切看起来都很好,但是当我按下按钮时,我进入了默认处理程序,无法理解为什么处理程序未运行。

在调试器中运行,我可以看到当我按下按钮时,会得到一个中断挂起(EXTI-> PR1)标志,但是代码随后跳转到默认处理程序。我看不到我想念的东西。我知道有使用HAL层设置中断的简便方法,我只是想了解必须从低级别访问哪些寄存器。

任何人都可以建议缺少此步骤吗?

#include <stm32l4xx.h>
#define DELAY 1

void delay1Hz(void);
bool buttonInterrupt = false;

int main(void)
{
    __disable_irq();
    /* Configure the clocks */
    RCC->CR         &=  0xFFFFFF07;  //Clear ~MSIRANGE bits and MSIRGSEL bit
    RCC->CR         |=  0x00000088;  //Set MSI to 16MHz and MSIRGSEL bit
    RCC->AHB2ENR    |=  0x00000001;  //Enable PA5 clocks

    /* Enable PA0 for output */
    GPIOA->MODER    &=  0xFFFFF3FF;  //Clear GPIOA[5] MODER bits
    GPIOA->MODER    |=  0x00000400;  //Enable GPIOA[5] for output

    RCC->AHB2ENR    |= 0x4;                     //ENABLE GPIOC port clk
    GPIOC->MODER    &= 0xF3FFFFFF;      //Clear GPIOC[13] for input mode

    RCC->APB2ENR        |= 1;   //Enable SYSCFG clk 
    SYSCFG->EXTICR[3]   &= ~0x00F0;     //CLEAR_BIT the EXTI[13] bits
    SYSCFG->EXTICR[3]   |= 0x20;        //Enable GPIOC for EXTI[13]
    EXTI->IMR1          |= 0x2000;  //Unmask EXTI13
    EXTI->FTSR1         |= 0x2000;  //Enable falling edge trigger on pb
    NVIC_EnableIRQ(EXTI15_10_IRQn); //Enable EXTI15-to-10 interrupts

  __enable_irq();

    for (;;)
    {
        if(buttonInterrupt == true) {

            //flash LED's (doesn't get here)
        }
    }
}

void initTim2() {
    //timer 2 code - not causing a problem
}

void    delay1Hz() {
    //delay code - not interrupt controlled
}


/* This doesn't run */
void EXTI15_10_IRQHandler(void) {
        buttonInterrupt = true;
        EXTI->PR1 = 0x2000;
}

1 个答案:

答案 0 :(得分:0)

没关系:定时器2的延迟似乎有些问题。它没有使用中断,所以我很惊讶它引起了麻烦。但是,如果我将其取出并使用其他延迟,则上述代码的中断会正常工作。这很奇怪。