STM32 ゼロから始めるローパワーマイコン タイマー割り込みでLチカ

STM32 ゼロから始めるローパワーマイコン タイマー割り込みでLチカ

皆さま こんにちは。

前回、STM32L010F4P6は初期値が2.097MHzのMSIクロックで動作することがわかりました。
今回はこのクロックを使ってタイマー割り込みでLチカしてみます。

投稿時の開発環境を記しておきます。

PC:Windows10 OS
IDE: STM32CubeIDE Version1.3.0
Configurator: STM32CubeMX Version5.6.0
マイコン: STM32L010F4P6
Board: 自作のボード

プロジェクトは前回のものを使う

STM32 ゼロから始めるローパワーマイコン デバッガーでLチカ 前編 および後編でつくったプロジェクトを使っていきます。

main.cのLチカコードを削除しておく

コメントを除いたコードを以下のように編集しておきます。
(コメントは残しておいて結構です)

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  while (1)
  {
  }
}

タイマーの設定を行う

ProjectExplorer で STM32L010.ioc ファイルをダブルクリックします。

Pinout & Configuration – Categories – Timers をクリックし, TIM2 をクリックします。

TIM2 Mode and Configuration – Clock Source で Internal Clock を選択します。

Configuration – Parameter Settings – Counter Settings を以下の通りに設定します。

Prescaler : 499
Counter Mode : Up
Counter Period : 4193
Internal Clock Division : No Division
auto-reload preload : Enable

そして NVIC Settingsを選択し、 TIM2 global interrupt Enabled にチェックを入れます。

Clock Configurationを選択し、クロックを確認します。

System Clock Mux で MSI が選択されていることを確認します。

APB2 timer clocks が 2.097MHz になっていることを確認します。

1秒周期でLチカする計算

プリスケーラ × カウンタピリオド × 1/f = タイマー周期[秒] になります。
クロック周波数 f = 2.097MHz です。
プリスケーラを 500 、タイマー周期を1秒とすると、カウンタピリオドは 4194 になります。
プリスケーラとカウンタピリオドは16ビットなので 1-65535 までの値を設定するようにしてください。
それからオートリロードを Enable にしておきます。

プリスケーラとカウンタピリオドのカウント始まりはゼロなので、-1した値を設定します。

プリスケーラは 499, カウンタピリオドは 4193 を設定します。

以下の画像の通りであることを確認してください。

パラメーターの設定

割り込みの設定

ビルドする

ひとまず、ここまでで一度ビルドしておきましょう。

Project – Build All を選択します。

MX_TIM2_Init()という関数が追加されて設定した値を確認することができます。

コーディングする

タイマーを動かすにはスタートの関数を呼ぶ必要があります。
main.cの while()ループの手前の BEGIN 2 と END 2 の間に以下の関数を記述します。

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

次に Core - Src - stm32l0xx_it.c をダブルクリックして開き、以下の関数内に HAL_GPIO_TogglePin()を追記します。
お約束で BEGIN と END の間に記述するのでしたね。

TIM2_IRQHandler()がTIM2の割り込み関数になります。

void TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */

  /* USER CODE END TIM2_IRQn 0 */
  HAL_TIM_IRQHandler(&htim2);
  /* USER CODE BEGIN TIM2_IRQn 1 */
  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
  /* USER CODE END TIM2_IRQn 1 */
}

ビルドして実行してみる

Project - Built All でビルドしてエラーがないことを確認し、 Run - Debug します。

HAL_Init()のところで停止するので、F8キーを押して実行します。

1秒周期でLチカすれば成功です。

うまく動きましたでしょうか?

今回はMSIの 2.097MHz のクロックで計算しましたが、HSIの16MHzで計算してみるとか、いろいろ試してみてください。

お疲れさまでした。

LowPowerカテゴリの最新記事