Code stop running at NVIC_EnableIRQ
#define HWREG(x) (*((volatile uint32_t *)(x)))
int dataFromRegister = 0;
void EXTI9_5_IRQHandler();
void GPIOH_Port15_Toggle();
void GPIOH_Init();
void GPIOK_Port5_Toggle();
void GPIOK_Init();
void SystemCLCKInit();
void setup() {
// put your setup code here, to run once:
/**********Enable Clock**************/
SystemCLCKInit();
// enable clock for system configuration
SET_BIT(RCC->APB4ENR, RCC_APB4ENR_SYSCFGEN_Msk);
delay(1000);
// enable clock for GPIO PORTH on AHB bus
SET_BIT(RCC->AHB4ENR, RCC_AHB4ENR_GPIOKEN_Msk);
delay(1000);
// enable clock for GPIO PORTK on AHB bus
SET_BIT(RCC->AHB4ENR, RCC_AHB4ENR_GPIOHEN_Msk);
delay(1000);
/************SETUP PORTH15****************/
GPIOH_Init();
digitalWrite(LEDB,LOW);
delay(1000);
/*************SETUP PORTK1***************/
GPIOK_Init();
digitalWrite(LEDB,HIGH);
delay(1000);
digitalWrite(LEDG,LOW);
delay(1000);
/************Interruption****************/
//CONF EXTI
SET_BIT(EXTI->IMR1, EXTI_IMR1_IM5_Msk);
SET_BIT(EXTI->RTSR1, EXTI_RTSR1_TR5_Msk);
CLEAR_BIT(EXTI->FTSR1, EXTI_FTSR1_TR5_Msk);
//CONF SYSCFG
SYSCFG->EXTICR[2] |= SYSCFG_EXTICR2_EXTI5_PK;
//CONF NVIC
NVIC_EnableIRQ(EXTI9_5_IRQn);
NVIC_SetPriority(EXTI9_5_IRQn,1);
digitalWrite(LEDG,HIGH);
delay(1000);
digitalWrite(LEDB,LOW);
delay(1000);
//NVIC_SetPriority(23);
}
void loop() {
// put your main code here, to run repeatedly:
GPIOK_Port5_Toggle();
}
void EXTI9_5_IRQHandler(void) {
//Serial.println("IT");
//delay(20);
digitalWrite(LEDB,LOW);
if (EXTI_PR1_PR5 & EXTI_PR1_PR5_Msk == 1) {
GPIOH_Port15_Toggle();
digitalWrite(LEDG,LOW);
SET_BIT(EXTI->PR1,EXTI_PR1_PR5_Msk);
}
}
void GPIOK_Init(void) {
SET_BIT(GPIOK->MODER, GPIO_MODER_MODE5_0);
CLEAR_BIT(GPIOK->MODER, GPIO_MODER_MODE5_1);
CLEAR_BIT(GPIOK->PUPDR, GPIO_PUPDR_PUPD5_1);
SET_BIT(GPIOK->PUPDR, GPIO_PUPDR_PUPD5_0);
SET_BIT(GPIOK->BSRR, GPIO_BSRR_BS5);
CLEAR_BIT(GPIOK->BSRR, GPIO_BSRR_BS5);
}
void GPIOK_Port5_Toggle(void) {
SET_BIT(GPIOK->BSRR, GPIO_BSRR_BS5);
CLEAR_BIT(GPIOK->BSRR, GPIO_BSRR_BS5);
delay(1000);
SET_BIT(GPIOK->BSRR, GPIO_BSRR_BR5);
CLEAR_BIT(GPIOK->BSRR, GPIO_BSRR_BR5);
delay(1000);
}
void GPIOH_Init(void) {
SET_BIT(GPIOH->MODER, GPIO_MODER_MODE15_0);
CLEAR_BIT(GPIOH->MODER, GPIO_MODER_MODE15_1);
CLEAR_BIT(GPIOH->OTYPER, GPIO_OTYPER_OT15);
}
void GPIOH_Port15_Toggle(void) {
digitalWrite(LEDB,HIGH);
SET_BIT(GPIOH->BSRR, GPIO_BSRR_BS15);
CLEAR_BIT(GPIOH->BSRR, GPIO_BSRR_BS15);
SET_BIT(GPIOH->BSRR, GPIO_BSRR_BR15);
CLEAR_BIT(GPIOH->BSRR, GPIO_BSRR_BR15);
}I am trying to use EXTI on GPIOK port 5 (LEDR for my portenta with microcontroller STM32H747) after using my LEDs to check where my code was stuck I noticed that it stopped running after NVIC_EnableIRQ(EXTI9_5_IRQn). I first supposed that the IT was immediately triggered and my code was stuck in the IT routine but since my blue led isn't triggered I guess I don't enter my Interrupt routine (also it is on a rising edge of the GPIOK so it shouldn't be triggered as my GPIO is in a LOW state after init). Is it linked to the __enable_irq() CMSIS function if it is how do I use it? I also read about defining the vector table (VTOR registers in the programming manual) but that shouldn't be the problem since my vector table is defined within a linker file, do I need a double definition?
