我正在使用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;
}
答案 0 :(得分:0)
没关系:定时器2的延迟似乎有些问题。它没有使用中断,所以我很惊讶它引起了麻烦。但是,如果我将其取出并使用其他延迟,则上述代码的中断会正常工作。这很奇怪。