中断处理程序将无法运行

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

我工作的一个stm32l467并试图当我按下用户按钮运行一个ISR。一切看起来都正确地进行设置。我已经看了看在调试器(凯尔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;
}
interrupt stm32 keil
1个回答
0
投票

没关系:似乎有一些问题,延迟我有定时器2。它不使用中断,所以我很惊讶,这是造成麻烦。但是,如果我把它拿出来,并使用不同的延迟,从上面的代码中断正常工作。这是一个奇怪的一个。

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