LoginSignup
1
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-28

はじめに

外部割り込みを入力された時に、しばらく、その外部割り込みを無効にしたい場合があります。手順としては以下のようにしてみます。
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などの単独で無効にできるピンに割り当てる必要があります。

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