Я работаю над 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;
}