一定時間外部割り込みを停止する方法


はじめに

外部割り込みを入力された時に、しばらく、その外部割り込みを無効にしたい場合があります。手順としては以下のようにしてみます。
1. 外部割り込みを受けます
2. 受けたところで、外部割り込みを無効にして、タイマを設定します。このタイマに設定する時間がしばらく無効にする時間です
3. タイマ割り込みを受けます。ここで外部割り込みのペンディングをクリアして、外部割り込みを有効にします

サンプルコード

STM32CubeIDEとNucleo-F446ZEを使ってコードを作成します。このコードでは、一度USERボタンを押すと10秒間USERボタンを受け付けなくなります

/* USER CODE BEGIN 0 */
__IO uint8_t Pushed;
/* USER CODE END 0 */
  /* USER CODE BEGIN 2 */
  TIM2->EGR |= TIM_EGR_UG;
  __HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
  /* USER CODE END 2 */
    /* USER CODE BEGIN 3 */
      Pushed = 0;
      while (Pushed == 0)
          ;
      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
  }
  /* USER CODE END 3 */
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    Pushed = 1;
    HAL_NVIC_DisableIRQ(EXTI15_10_IRQn);
    HAL_TIM_Base_Start_IT(&htim2);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    HAL_TIM_Base_Stop_IT(&htim2);
    // Clear Pending IRQ
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);
    HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
/* USER CODE END 4 */

プロジェクトはGitHubにおいておきます。
https://github.com/kotetsuy/STM32forWindowsDemos/tree/master/DisableIRQSampleF446ZE
動画はこちらです
https://twitter.com/kotetsu_yama/status/1210930004558630912?s=20

注意点

例のEXTI13は、IRQTypeの定義ファイル内でEXTI[15:10]となっています。
DisableIRQSampleF446ZE/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h

  EXTI15_10_IRQn  = 40,     /*!< External Line[15:10] Interrupts */

これはEXIT15からEXIT10の6ラインを一つの割り込みにまとめて入力しているという意味で、この割り込みを無効にすると、EXIT13だけではなく、EXTI10やEXTI15も無効になります。STM32では回避する手段が無いので、外部回路を工夫して無効にしたい割り込みをEXTI0からEXTI4などの単独で無効にできるピンに割り当てる必要があります。