cancel
Showing results for 
Search instead for 
Did you mean: 

How to enable GPIO inputs for INTERRUPT MODE ?

bnguy.1
Associate III

The H745 Datasheet says General-purpose input/outputs : Up to 168 I/O ports with interrupt capability

Yet, every pin I select as GPIO (ex. PORTC.13 (PIN E3)), only lists INPUT or OUPUT options, but no Interrupt mode.

If I bypass the Stm32CubeIde 1.3.1's auto-code-generation, and forcefully initialize a GPIO to interrupt.. reading the PIN works, but the interrupt does not:

GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;  
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pin = GPIO_PIN_13;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 
/* Enable and set EXTI lines 15 to 10 Interrupt to the lowest priority */
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
 
/* Configure the EXTI line for IT*/
HAL_EXTI_D1_EventInputConfig(EXTI_LINE13 , EXTI_MODE_IT, ENABLE);

How can I make any GPIO issue a interrupt?

1 ACCEPTED SOLUTION

Accepted Solutions
bnguy.1
Associate III

Thanks, I hadn't noticed that GPIO_EXTI option! However, even selecting that, and setting it to Interrupt mode, it generates the same code as the snippet I had tried/posted.

I finally got it to work by adding this to stm32h7xx_it.c:

void EXTI15_10_IRQHandler(void)
{
 HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}

 The other GOTCHA, is that setting PE0 as GPIO_EXT will automatically remove that mode from PX0! I didn't realize but it seems all ports (A-I) share the 13 interrupts, i.e. for a given bit you can only have ONE interrupt for this bit across ALL ports! ex. PC0 interrupt means no PE0 interrupt available.

View solution in original post

3 REPLIES 3
TDK
Guru

When you click on a pin, there is a "GPIO_EXTIx" option. Select that. Set its context to the M7 or M4 core and enable the interrupt in NVIC. You'll get code similar to this (just an example):

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
 
  /*Configure GPIO pin : PD4 */
  GPIO_InitStruct.Pin = GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 
  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI4_IRQn);
 
}

BTW, all pins can be configured to generate an interrupt, but not at the same time. You're limited to 1 per pin number.

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

Or, read the EXTI and SYSCFG chapters in RM and set it up yourself.

JW

bnguy.1
Associate III

Thanks, I hadn't noticed that GPIO_EXTI option! However, even selecting that, and setting it to Interrupt mode, it generates the same code as the snippet I had tried/posted.

I finally got it to work by adding this to stm32h7xx_it.c:

void EXTI15_10_IRQHandler(void)
{
 HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}

 The other GOTCHA, is that setting PE0 as GPIO_EXT will automatically remove that mode from PX0! I didn't realize but it seems all ports (A-I) share the 13 interrupts, i.e. for a given bit you can only have ONE interrupt for this bit across ALL ports! ex. PC0 interrupt means no PE0 interrupt available.