2025-08-02 6:55 AM
i have successfully make some basic module in stm32l552 nucleo in register level and in asm , successfully program
GPIO, TIMER, UART RX,TX,. But stuck in interrupt section for few days. i am tring to toggle onboard led(PA9) using user button PC13. my hal code running successfully using call back
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
&
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
But failed to get into ISR without using HAL. Athough EXTI->EXTICR[3] , IMR1, RTSR1 value is same as my HAL auto generated code.
please help. here is my simple code......................
//user button PC13(NUCLEO BOARD MANUAL PAGE NO.33 ) input STM32L5 Series
//pa9 onboard led
//board : NUCLEO L552ZET6Q
#include "stm32l5xx.h"
volatile int userbuttoncounter; //for monitoring
//void EXTI13_IRQHandler(void)
void EXTI13_IRQHandler()
{
//if (EXTI->RPR1 & EXTI_RPR1_RPIF13) or
if ((EXTI->RPR1 & (1U<<13)) != 0 )
{
//clear PR flag
EXTI->RPR1 |= (1U<<13);
userbuttoncounter++;
GPIOA->ODR ^= GPIO_ODR_OD9; //toggle led pa9
}
}
int main(void) {
//pa9 onboard led
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN;
/* set pin to output mode */
GPIOA->MODER &= ~(GPIO_MODER_MODE9_1);
GPIOA->MODER |= (GPIO_MODER_MODE9_0);
//enable gpioC clock
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN;
//user button as pc13 input
GPIOC->MODER &= ~(GPIO_MODER_MODE13_0);
GPIOC->MODER &= ~(GPIO_MODER_MODE13_0);
__disable_irq();
EXTI->EXTICR[3] |= 0x200;//FROM HAL BACKTESTING, pc13 EXTICR4 = 0x200
EXTI->IMR1 |= EXTI_IMR1_IM13; //EXTI_IMR1=FF9E2000,backtesting from hal is correct
EXTI->RTSR1 |= EXTI_RTSR1_RT13; //EXTI_RTSR1 = 0x2000,backtested
NVIC_EnableIRQ(EXTI13_IRQn); //source..../Driver/CIMSIS/Device/ST//.../stm32L552xx.h
//__enable_irq();
//as single IT is used ,priority setting is not required
while(1);
{
}
}
2025-08-02 7:02 AM - edited 2025-08-02 7:03 AM
__disable_irq();
...
//__enable_irq();
You have interrupts globally disabled.