cancel
Showing results for 
Search instead for 
Did you mean: 

EXTI not getting into isr L552zetq/ nucleo-144

sourav
Associate II

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);
{

}

}

1 ACCEPTED SOLUTION

Accepted Solutions
TDK
Super User
__disable_irq();
...
//__enable_irq();

You have interrupts globally disabled.

If you feel a post has answered your question, please click "Accept as Solution".

View solution in original post

4 REPLIES 4
TDK
Super User
__disable_irq();
...
//__enable_irq();

You have interrupts globally disabled.

If you feel a post has answered your question, please click "Accept as Solution".
sourav
Associate II

..................

..................

__disable_irq();

EXTI->EXTICR[3] |= 0x200;

EXTI->IMR1 |= EXTI_IMR1_IM13;

EXTI->RTSR1 |= EXTI_RTSR1_RT13;

NVIC_EnableIRQ(EXTI13_IRQn);

__enable_irq();

..........................

.................

also not working

sourav
Associate II

Ok, i find it , the actual prolem was pc13 as input MODER should be 00, it was my copy pase error that i forget change the next line last bit value from 0 to 1,i.e 

GPIOC->MODER &= ~(GPIO_MODER_MODE13_0);

GPIOC->MODER &= ~(GPIO_MODER_MODE13_1);

 

MR. TDK is also crrect, but it was my error at the time of uploading. I forgot to remove "//"" before __enable_irq()

DBonh.1
Associate III

Turns out that I had an incomplete BGA installation. Some balls were good, some weren't. Firmware that drove QSPI clock was fine.