STM32/タイマ割り込みでLEDを点滅させる

前回はメインループ内で点滅させましたが、今度はタイマ割り込み内で処理させてみます。STM32CubeMXを起動し、前回の作ったプロジェクトを Load Project から開きます。

左側にある Peripherals から TIM2 ツリーを開き、 Clock SourceInternal Clock を選択します。

Pinout

Clock Configuration タブに移動し、クロック周波数を確認します。

Clock Configuration

供給されているクロックが2.097MHzでした。この値はタイマ割り込み周期を決め上で必要な数値となるのでメモしましょう。

Configuration タブに移動し、 Control にある TIM2 をクリックします。

Configuration

Parameter Settings タブに移動し、 Prescaler(PSC – 16 bits value))2097 を、 Counter Period(AutoReload Register – 16 bits value)1000 を設定します。これにより1秒毎にタイマ割り込みが入ります。

Parameter Settings

NVIC Settings タブに移動し、 TIM2 global interrupt にある Enabled をチェックします。これによりタイマ割り込みが入るようになります。

NVIC Settings

ここまでできたら Project >> Generate Code を選択して、コードを生成しましょう。

コードを生成したら、Eclipseから Project >> C/C++ Index >> Rebuild を選択します。これをしておかないと、コンパイルエラーが発生することがあります。

前回 main.c に作成したコードはコメントアウトなどし、実行しないようにします。
同じく、 main.c の後半にある「/* USER CODE BEGIN 4 /」と直後の「/ USER CODE END 4 */」の間にタイマ割り込みのコードを記述します。

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == htim2.Instance) {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
  }
}
/* USER CODE END 4 */

タイマ割り込みを使用する場合は、そのための初期化が必要になります。main()内、while()ループには入る前に初期化コードを追加します。

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
  /* USER CODE END 2 */

ビルドを行い、実行してみよう。今度はタイマ割り込みによりLEDが点滅します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください