STM32 マイコンの HAL ライブラリには HAL_Delay 関数という時間待ち用の関数があります。使い方はいたって簡単で,例えば,
HAL_Delay(10);
とすれば,10 ms 待ってくれます。
しかしこの関数,ISR(割り込みサービスルーチン)内で使うときは注意が必要です。 なぜなら,HAL_Delay 関数は時間待ちをするのに SysTick 割り込みを使っているので,呼び出し元 ISR の割り込み優先順位が SysTick の割り込み優先順位より低くないと,SysTick 割り込みがブロックされてしまい,関数から戻ってこなくなるからです。
このことは HAL のユーザーズマニュアルにも書いてあるのですが,知らずに悩んだことがありました。
STM32CubeMX でコードを生成するときは,デフォルトですべての割り込みの優先順位が同一の 0 になっていたりするので注意が必要です。