cancel
Showing results for 
Search instead for 
Did you mean: 

External Interrupt is not triggerd

lnxlnr
Visitor

Hi, 

I am going to run a simple external Interrupt excercise on Nucleo-G0B1RE. The push button (PC13) works correctly but the ISR is not working on this pin!  The sample code is attached. What is the problem with the Interrupt?

 

#include "main.h"

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

int main(void)

{

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  while (1)

  {

  }

}

 

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 

  /** Configure the main internal regulator output voltage

  */

  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

 

  /** Initializes the RCC Oscillators according to the specified parameters

  * in the RCC_OscInitTypeDef structure.

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;

  RCC_OscInitStruct.PLL.PLLN = 14;

  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;

  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;

  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

 

  /** Initializes the CPU, AHB and APB buses clocks

  */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

 

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

  {

    Error_Handler();

  }

}

 

/**

  * @brief GPIO Initialization Function

  * @PAram None

  * @retval None

  */

static void MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

/* USER CODE BEGIN MX_GPIO_Init_1 */

/* USER CODE END MX_GPIO_Init_1 */

 

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOC_CLK_ENABLE();

  __HAL_RCC_GPIOF_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

 

  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);

 

  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);

 

  /*Configure GPIO pin : PB_Int_Pin */

  GPIO_InitStruct.Pin = PB_Int_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(PB_Int_GPIO_Port, &GPIO_InitStruct);

 

  /*Configure GPIO pin : LED1_Pin */

  GPIO_InitStruct.Pin = LED1_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);

 

  /*Configure GPIO pin : LED2_Pin */

  GPIO_InitStruct.Pin = LED2_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(LED2_GPIO_Port, &GPIO_InitStruct);

 

  /* EXTI interrupt init*/

  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);

  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

 

/* USER CODE BEGIN MX_GPIO_Init_2 */

/* USER CODE END MX_GPIO_Init_2 */

}

 

/* USER CODE BEGIN 4 */

// EXTI Line9 External Interrupt ISR Handler CallBackFun

 

 

 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

 {

    if(GPIO_Pin == GPIO_PIN_13) // If The INT Source Is EXTI Line9 (A9 Pin)

    {

    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // Toggle The Output (LED) Pin

        }

 

 }

/*

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

  if(GPIO_Pin == GPIO_PIN_13) {

                 HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5);

  }

void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */

  __disable_irq();

  while (1)

  {

  }

  /* USER CODE END Error_Handler_Debug */

}

 

#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

 

8 REPLIES 8

Welcome to the forum.

Have you tried the standard example from STM32CubeIDE?

Please see How to write your question to maximize your chances to find a solution for how to properly post source code (and other tips) - people aren't going to want to download an MS Word document ...

Thank you Andrew. Yes,this is the code from a standard excersice:

The Code inserted properly as Andrew said.

 

 

You didn't follow the tips on how to post source code.

See also: How to insert source code.

Please edit your post:

AndrewNeil_0-1736955081838.png

 

I don't see in your code where do you set PC13 to be source of EXTI.

JW

Indeed.

@lnxlnr you would expect to see:

GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

(or falling - as the case may be) 

 

BTW:

To see what that GPIO_MODE_IT_RISING actually means, use the CubeIDE 'Open Declaration' feature; default keyboard shortcut is F3:

#define  GPIO_MODE_IT_RISING                    (MODE_INPUT | EXTI_IT | TRIGGER_RISING)                     /*!< External Interrupt Mode with Rising edge trigger detection          */
#define  GPIO_MODE_IT_FALLING                   (MODE_INPUT | EXTI_IT | TRIGGER_FALLING)                    /*!< External Interrupt Mode with Falling edge trigger detection         */
#define  GPIO_MODE_IT_RISING_FALLING            (MODE_INPUT | EXTI_IT | TRIGGER_RISING | TRIGGER_FALLING)   /*!< External Interrupt Mode with Rising/Falling edge trigger detection  */

 

Thanks again. I corrrected it.

@waclawek.jan, PC13 was in this part of the code the point of recieving interupt:

 

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_13) {
      HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_5);
  }
}

 

 

Hello @lnxlnr and welcome to the community,

There is no callback called HAL_GPIO_EXTI_Callback() for G0 as for other STM32 series

There are two separated callbacks:

 HAL_GPIO_EXTI_Falling_Callback() for falling edge

and HAL_GPIO_EXTI_Rising_Callback() for rising.

See the example: https://github.com/STMicroelectronics/STM32CubeG0/blob/master/Projects/NUCLEO-G070RB/Examples/GPIO/GPIO_EXTI/Src/main.c

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.
PS: This is a collaborative space. So please be polite in your reply. Otherwise, it will be reported as inappropriate and you will be permanently blacklisted from my help/support.