1
1

More than 1 year has passed since last update.

NUCLEO-G031K8ではHAL_GPIO_EXTI_Callback関数が使えない。

Last updated at Posted at 2023-03-29

HAL_GPIO_EXTI_Callback関数が動かない

主題の通り、NUCLEO-G031K8を使って外部割り込みを試みたが、HAL_GPIO_EXTI_Callback関数を呼び出してるのに全く割り込んでくれない。

Core\Src\main.c
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if (GPIO_Pin == GPIO_PIN_0)
	{
		HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
	}
	else
	{
		__NOP();
	}
}
/* USER CODE END 4 */

公式のチュートリアルそのままなのに、動いてくれない。

そもそもHAL_GPIO_EXTI_Callback関数が存在しなかった。

試しに、HAL_GPIO_EXTI_Callback関数を検索したら全くヒットしない。
おかしいと思ってstm32g0xx_hal_gpio.cを覗いてみたらそもそもHAL_GPIO_EXTI_Callback関数が存在しなかった。
そりゃ動きません。

Drivers\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_gpio.c
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if (__HAL_GPIO_EXTI_GET_RISING_IT(GPIO_Pin) != 0x00u)
  {
    __HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Rising_Callback(GPIO_Pin);
  }

  if (__HAL_GPIO_EXTI_GET_FALLING_IT(GPIO_Pin) != 0x00u)
  {
    __HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin);
  }
}

/**
  * @brief  EXTI line detection callback.
  * @param  GPIO_Pin Specifies the port pin connected to corresponding EXTI line.
  * @retval None
  */
__weak void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);

  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Rising_Callback could be implemented in the user file
   */
}

/**
  * @brief  EXTI line detection callback.
  * @param  GPIO_Pin Specifies the port pin connected to corresponding EXTI line.
  * @retval None
  */
__weak void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);

  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Falling_Callback could be implemented in the user file
   */
}

解決

今回は立ち下がりで割り込んでほしかったので、HAL_GPIO_EXTI_Falling_Callback関数を使った。

Core\Src\main.c
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
	if (GPIO_Pin == GPIO_PIN_0)
	{
		HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
	}
	else
	{
		__NOP();
	}
}
/* USER CODE END 4 */

これで動いてくれた。良かった良かった。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1