見出し画像

STM32マイコンのIoT実験で遊ぼう! その10 ~タイマ割り込みをつかう~

今回の実験はLEDをタイマ割り込み処理の機能で点灯させます。
外付け回路は使用しません。
ARM-First上の2つのLEDをタイマで点滅させます。

1.作成する機能の概要

橙色のLEDは、
0.5秒ごとにタイマ6により点滅
割り込みを使わず
プログラムでカウンタ値を読んで制御

緑色のLEDは、
0.1秒ごとにタイマ7により点滅
割り込みを発生させて制御

2.マイコンの設定

STM32CubeIDEを使用して、
新しいプロジェクトを作成し、ピンの設定をします。
 
 LED(橙):PA15ピン   (デジタル出力)
 LED(緑):PB4ピン   (デジタル出力)

 

① TIM6の設定
   
Activated にチェックをいれてタイマを有効にします。
 次に、Prescaler と Counter Period を設定します。

 

 [ Prescaler と Counter Periodの設定値の決め方]

LEDを0.5秒ごとに点灯・消灯するために、PrescalerとCounter Periodの設定を考えます。以下がその手順です:

  1. 目標時間の設定

    • 0.5秒(500ms)ごとにLEDを切り替えたいので、タイマーが500msで1回繰り返すように設定します。

  2. タイマーカウンタの動作周期

    • タイマーのカウンタが1msごとに増えるようにします。これにより、カウンタが500まで到達したときに500msが経過することになります。

  3. クロックの分周(Prescaler)

    • STM32のタイマーは16MHzのクロック信号を受け取ります。しかし、カウンタが1msごとに増えるようにするために、1kHzのクロックがカウンタに入力されるようにクロックを遅くする必要があります。

    • 16MHzを1kHzにするための割合は、16,000分の1です。これはPrescaler(分周設定)を16000に設定することで実現できます。

  4. カウンタの周期(Counter Period)

    • カウンタが0から500まで数えると500msが経過します。したがって、Counter Periodを500に設定します。

結果の設定値

  • Prescaler:16000 (マイコンの仕様で-1して設定)

  • Counter Period:500 (マイコンの仕様で-1して設定)

この設定により、カウンタは1msごとに1増加し、500msごとに0に戻り、そのタイミングでLEDを操作することができます。


② TIM7の設定

Activated にチェックをいれてタイマを有効にします。
次に、Prescaler と Counter Period を設定します。

 

 [ Prescaler と Counter Periodの設定値の決め方]

100msごとに割り込みを発生させてLEDを操作します。
プリスケーラーはTIM6と同じにすれば、
1msごとにカウンタにクロックがはいります。
比較値は100となります。

結果の設定値

  • Prescaler:16000 (マイコンの仕様で-1して設定)

  • Counter Period:100 (マイコンの仕様で-1して設定)

TIM7では、さらに割り込みの設定が必要です。

System Core の NVIC を選び、
TIM7 global interrupt のチェックを入れ、
Preemption Priority に1を設定します。

 

3.ソースプログラムの作成

次にプログラムのソースコードを自動生成します。

main.c が出来上がりました。

 

次のコードを追加します

 

・HAL_TIM_Base_Start(&htim6);
・HAL_TIM_Base_Start_IT(&htim7);

 タイマを起動します。割り込みを使うかどうかで、タイマ起動に使う関数が異なります。
 HAL_TIM_Base_Start()は、割り込みなしでタイマを起動します。
 HAL_TIM_Base_Start_IT()は、割り込みありでタイマを起動します。
どちらも、引数で起動するタイマを指定します。

・while(__HAL_TIM_GET_COUNTER(&htim6) != 0);
タイマ6のカウンタ値を読み込んで、0でなければ、何もしない処理を繰り返しています。つまり、0になるまで停止します。
・HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_15);
500ms経過すると何もしないループから抜け、LEDの点灯状態を反転させます。

 

・void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
割り込みが発生すると呼ばれる関数です。
今回は100ms経過して割り込みが発生したときに呼ばれます。
・if(htim == &htim7)
タイマ7の割り込みかを判定しています。今回はタイマ7しか割り込みが発生しませんので、この処理はなくても問題ありません。
・HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
LEDの点灯状態を反転させています。

このプログラムを実行することによって、橙色のLEDが0.5秒ごとに点滅し、緑色のLEDが0.1秒ごとに点滅します。

4.ビルドの実行

 

成功!
エラーはありません。

5.マイコンへの書込み

ARM-First をパソコンに接続します。

 

STM32CubeProgrammer ツールで書込みます。

 

6.実行

それでは、リセットボタンを押して実行します。

 

橙色と緑色のLEDがそれぞれの間隔で点滅を始めました。
成功です!


(参考にした教材です)

CQ出版社の下記の書籍を参考にさせていただきました。


いいなと思ったら応援しよう!