Skip to main content
Visitor II
November 13, 2024
Solved

Ext. Interrupt conflict on STM32H7 ?

  • November 13, 2024
  • 2 replies
  • 1632 views

Hello, I'm using H723 Nucleo. I set 5 ext interrupt pins: PA0, PA1, PA4, PC2_C, and PC13 as EXTI to 5 switches, enabled NVIC interrupt, GPIO pull-up,  interrupt with rising edge triggered, and tied these 5 pins to switches with the other end to ground. The code is working fine, but I observe that only 1 interrupt (either 1 of the 5 switches) can work at any one time, and all 5 interrupts cannot work together at any instance... is this interrupt conflict on H7? Anyone can advise? 

 

 

if (GPIO_Pin == GPIO_PIN_0)
	{
		// on LED1
	}

 

 

    This topic has been closed for replies.
    Best answer by mƎALLEm

    Hello @HMSEdinburge ,

    First, I have remarks regarding the info you provided:


    @HMSEdinburge wrote:

    enabled NVIC interrupt, GPIO pull-up,  interrupt with rising edge triggered,

     

     -> You set pull up and you set the EXTI edge to rising which is not correct. You need either to set pull-up resistor and set the edge to falling or set pull-down resistor and set the edge to rising.


    @HMSEdinburge wrote:

    Hello, I'm using H723 Nucleo. I set 5 ext interrupt pins: PA0, PA1, PA4, PC2_C, and PC13

     

    PA1 is connected to the ETH PHY RMII_REF_CLK pin on the board. need to select another pin. PC13 is used by the user button which has already an external pull-down resistor. So no need to set pull up/down internal resistor.

    Now regarding the code, this is how it could be managed:

     

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
     switch(GPIO_Pin)
     {
     case GPIO_PIN_0: exti_source = 1; break; // PA0
     case GPIO_PIN_3: exti_source = 2; break; // PA3 instead of PA1
     case GPIO_PIN_4: exti_source = 3; break; // PA4
     case GPIO_PIN_2: exti_source = 4; break; // PC2_C 
     case GPIO_PIN_13: exti_source = 5; break; // PC13
     default: exti_source= 0; break;
     }
    }

     

    I've attached a project running on NUCLEO-H723 that uses all these EXTIs (just replaced PA1 by PA3) . Put exti_source in live watch and you can see the value that changes according to the EXTI event triggered.

    Hope that answers your question.

     

    2 replies

    ST Employee
    November 13, 2024

    Hello @HMSEdinburge,

    Make sure that each EXTI line is configured for the respective GPIO pins, each pin should be assigned to a unique EXTI

    Also, could share some code? 

    Visitor II
    November 13, 2024

    Hi i had checked and re-check the Pins assignment as screenshot and code below:

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
    	if (GPIO_Pin == Btn1_Pin) // PIN_0
    	{
    		// LED1 on
    	}
    
    	else if (GPIO_Pin == GPIO_PIN_1) 
    	{
    		// LED2 ON
    	}
    
    	else if (GPIO_Pin == Btn2_Pin) 
    	{
    		// LED 3 ON
    	}
    
    	else if (GPIO_Pin == Btn3_Pin)
    	{
    		// LED3 ON;
    	}
    
    	else if (GPIO_Pin == GPIO_PIN_13)
    	{
    		// LED 4 ON
    	}
    }

    below, 

    GPIOa.jpggpioB.jpg

    mƎALLEmAnswer
    Technical Moderator
    November 13, 2024

    Hello @HMSEdinburge ,

    First, I have remarks regarding the info you provided:


    @HMSEdinburge wrote:

    enabled NVIC interrupt, GPIO pull-up,  interrupt with rising edge triggered,

     

     -> You set pull up and you set the EXTI edge to rising which is not correct. You need either to set pull-up resistor and set the edge to falling or set pull-down resistor and set the edge to rising.


    @HMSEdinburge wrote:

    Hello, I'm using H723 Nucleo. I set 5 ext interrupt pins: PA0, PA1, PA4, PC2_C, and PC13

     

    PA1 is connected to the ETH PHY RMII_REF_CLK pin on the board. need to select another pin. PC13 is used by the user button which has already an external pull-down resistor. So no need to set pull up/down internal resistor.

    Now regarding the code, this is how it could be managed:

     

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
     switch(GPIO_Pin)
     {
     case GPIO_PIN_0: exti_source = 1; break; // PA0
     case GPIO_PIN_3: exti_source = 2; break; // PA3 instead of PA1
     case GPIO_PIN_4: exti_source = 3; break; // PA4
     case GPIO_PIN_2: exti_source = 4; break; // PC2_C 
     case GPIO_PIN_13: exti_source = 5; break; // PC13
     default: exti_source= 0; break;
     }
    }

     

    I've attached a project running on NUCLEO-H723 that uses all these EXTIs (just replaced PA1 by PA3) . Put exti_source in live watch and you can see the value that changes according to the EXTI event triggered.

    Hope that answers your question.

     

    Visitor II
    November 14, 2024

    yes, i m using PC13 on-board switch, I'll try your code and suggestion...