STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (15) TimerでLチカしよう


STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (14) PWMでサーボモーター(SERVO)を動かしてみようの続きです。
https://qiita.com/usashirou/items/59410a385ac930e0f5b2

今回は、タイマーを使ってLEDを光らせます。
なんだ、Lチカか
と思われると思いますが、タイマーを使うLチカは割り込みが入っており、意外と面倒です。
今回は、簡単なコマンドがあるのでこれでやってみましょう。

設定する

まず今回、使うのは、LEDなのでLD2ですね。
これにはTimer2 TIM2がアサインされています。

左側のTimersからTIM2を選択し
ClockSouceをInternalClockにします。

次は、クロックの設定です。
Clock Configurationをクリックし、最後の周波数を42MHzにします。

次は、出力を1Hzにします。
1Hzとすることで1秒間に1回動くこととなります。
42MHzを1Hzにするために42000000で割る必要があります。
今回は、42000と1000で割ります。
(0が含まれるので-1かな??)

次にNVICを設定します。
NVICは割り込みの機能になります。
GlobalInterruptのチェックを入れます。

これで、1Hz毎に割り込みが入ることになります。
Generationでコードを生成します。

プログラム

今回は以下を追加します。

  HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE BEGIN 4 */
void  HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
    HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
}
/* USER CODE END 4 */

初めに、タイマーを起動させます
HAL_TIM_Base_Start_ITは割り込みあり
HAL_TIM_Base_Startは割り込みなしです

今回は割り込みありなのでHAL_TIM_Base_Start_ITを選択します

Tim2を選択します。

これで割り込み機能付のタイマーが始動しました。
次は、LEDを点滅するプログラムです。
プログラム自身は
HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
ですね。
では、起動させるには?
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
と入れます。

これに先ほどのLチカのプログラムを入れればLEDが割り込み毎に点滅するようになります。

あれ?
Mainのプログラムに何も入っていない。
そうです、これは、1秒間に一回1Hz毎に割込みが動くのです。

割込みが入るとHAL_TIM_PeriodElapsedCallbackに飛びます。
ここで、LEDを点滅するプログラムを入れれば動作可能となります。

* 参考 [メモ] タイマー割り込みでLチカ (STM32L1-TIM2使用)

これを拡張すれば、いろいろな事が出来ますね