前回はメインループ内で点滅させましたが、今度はタイマ割り込み内で処理させてみます。STM32CubeMXを起動し、前回の作ったプロジェクトを Load Project から開きます。
左側にある Peripherals から TIM2 ツリーを開き、 Clock Source を Internal Clock を選択します。
Clock Configuration タブに移動し、クロック周波数を確認します。
供給されているクロックが2.097MHzでした。この値はタイマ割り込み周期を決め上で必要な数値となるのでメモしましょう。
Configuration タブに移動し、 Control にある TIM2 をクリックします。
Parameter Settings タブに移動し、 Prescaler(PSC – 16 bits value)) に 2097 を、 Counter Period(AutoReload Register – 16 bits value) に 1000 を設定します。これにより1秒毎にタイマ割り込みが入ります。
NVIC Settings タブに移動し、 TIM2 global interrupt にある Enabled をチェックします。これによりタイマ割り込みが入るようになります。
ここまでできたら 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が点滅します。