Обработчик прерываний не запускается - PullRequest
0 голосов
/ 03 февраля 2019

Я работаю над 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 голосов
/ 03 февраля 2019

Не берите в голову: Кажется, есть некоторая проблема с задержкой, которую я имею с таймером-2.Он не использует прерывания, поэтому я удивлен, что это вызывает проблемы.Но если я возьму его и использую другую задержку, прерывание из приведенного выше кода работает нормально.Это странный.

...