一定時間外部割り込みを停止する方法
はじめに
外部割り込みを入力された時に、しばらく、その外部割り込みを無効にしたい場合があります。手順としては以下のようにしてみます。
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などの単独で無効にできるピンに割り当てる必要があります。
Author And Source
この問題について(一定時間外部割り込みを停止する方法), 我々は、より多くの情報をここで見つけました https://qiita.com/kotetsu_yama/items/c0ee9651d1ea4829f2c5著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .