Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン_9(タイマ割り込み:LED点滅)

​​​​

タイマー割り込みとLED点滅

1.本日の内容

 (1) STM32マイコン(nucleo f401RE)を使用して、タイマー割り込みにより、LEDの点滅を行う。

・目次

 

2.内容

​​(1) やる内容の詳細​

  ・STM32マイコン(nucleo f401RE)を使用して、タイマー割り込みにより、LEDの点滅を行う。
      点滅:1秒点灯、1秒消灯の繰り返し。 

  ・CubeMxによる。タイマ割り込みの設定方法について。 

  ・タイマ割り込みの開始の仕方

  ・タイマー割り込みとは

    100ミリ秒ごとといった、決まった時間ごとに割り込み処理を発生させる。
    定期的に処理が呼び出され、その処理を定期的に行なうことができる。

 

(2) 使用部品
個数 部品名 型番
1 USBケーブル USBミニBタイプ  
1 mbed(マイコンボード) ​​nucleo f401RE

 

(3) STM32CubeMXの設定、プログラムを出力

  CubeMXの設定の詳細は下記を参照

  →STM32マイコン学習_1(環境の導入:CubeMXとTrueStdio) - Project_OKI’s diary

 

  (a)使用ピンを設定
   ・PA5:GPIO_Output
   
  (b)使用するピンの名前を変更 
   ・PA5→右クリック→Enter Username→LED1とする。

  (c) 割り込み設定
   ・System Core → RCCをクリック
   ・High Speed Clock(HSE)を、Crystal/Ceramic Resonatorに設定
    →内部水晶振動子などを使用する。
    →外部からクロックを入力する場合は、「BYPASS Clock Source」に設定。
   
  (d) タイマーの設定(ここで何ms毎に処理するか設定)
   ・TimersのTIM3をクリック
   ・Clock Source を Internal Clock に設定
   ・Parameter Settingsタブをクリック
   ・Prescalerを    1000-1
   ・Counter Periodを 16000-1
    に設定
   ・NVIC Settingsタブをクリック
   ・Enableのチェックを入れる。
   ※「⚠」のマークが表示されていたり、黄色くなっている場所は
    設定によっては機能が競合するということ。


  (d)プログラムの出力

   ・Project Maagerを選択
   ・Project Nameにプログラムの名前を入力:SW_LED5   
    ※スペース、空白文字、日本語を含めるとエラーになる場合があるので、使用しない。

   ・Project Location:プロジェクトを保存する場所
   ・Application Structure:Advanced (出力するフォルダの構成を選択)
   ・Toolchain/IDE:TrueSTUDIO(今回は、AtoricTrueStdioを使用するため)

  (f)GENERATE CODEで、コードを出力
  (g)Open pROJECTをクリックすると、AtricTrueStdioが自動的に起動される。

(4) AtricTrueStdioでプログラム作成
  (a) AtricTrueStdioから開く場合(上記(g)をした場合は不要)
    ・AtricTrueStdioを起動
    ・インポート元のディレクトリをクリック
    ・CubeMXで作成した場所を指定
    ・フォルダーにSW_LED5(作成したプロジェクトの名前)が表示
    ・チェックされているのを確認して、終了をクリック 

 (b) プログラムの書き込み
   ・トンカチマークをクリックして、ビルドする。
   ・エラーが出ないことを確認する。
   ・下記プログラムを記載する。
 
/* USER CODE BEGIN 2 */
  //TIM3開始
  HAL_TIM_Base_Start_IT(&htim3);
/* USER CODE END 2 */
 
//タイマー割り込み実行関数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim == &htim3){	//TIM3割り込み処理
		//LED点灯時は、LEDを消灯。 LED消灯時は、LEDを点灯する。
		HAL_GPIO_TogglePin(LEDOUT1_GPIO_Port,LED1_Pin);
	}
}
/* USER CODE END 4 */
 
 
(5) プログラムの説明
 (a)PrescalerとCounter Periodの設定値について
  ・PrescalerとCounter Period、APBの値によって、割り込みタイミング[s]が決定する。
  ・APBは、Clock Configurationの値が参照される。
  ・今回は、TIM3を使用するので、APB1を参照し、16MHzとなる。
   →APB1:TIM2, 3, 4, 5,
    APB2: TIM1, 9, 10, 11
    参照:​STM32F401xEのデータシートのP.14
 Gyazo

Gyazo


 (b) 割り込みタイミング[sec]の計算
   ・計算式:
    タイマカウントの動作タイミングをf[Hz]とすると。
    f = APB1/(Counter Period+1)/(Prescaler+1)

    今回の場合:
    APB1      = 16000000
    Counter Period  = 16000-1
    Prescaler      = 1000 - 1
    より
    f = 16000000/(16000-1+1)/(1000-1+1)
     = 1[Hz]
    f[Hz] = 1/s[sec] より
    s = 1/f
     =1 [sec] となる。
    つまり、1秒に一回、TIM3の割り込み処理が動作するということ。

 (c) 式から、設定したい秒数をPrescalerの値によって決める。
   例えば、10msに1回、動作させたいと考える。 
   その場合、PrescalerとCoutenter Periodは、いくつにすればよいか。
   簡単なのは、Counter Periodの値をAPB1/1000に固定する。
 
  つまりCounter Period-1  = APB1/1000とする。
  今回の場合で考えると、CounterPeriod = 16000000/1000-1になる。
  CounterPeriod = 16000-1
  そうすれば、下記の形でPrescalerが計算できる。

   T[Hz] = APB1/(APB1/1000)/(Prescaler + 1)になる。
      =1000/(Prescaler + 1)
   (Prescaler + 1) = 1000/T
            =1000 * s
     Prescaler    =1000 * s - 1
   で、計算することができる。
   例:10msに設定したい場合
         Prescaler =  1000*10/1000 -1
        = 10 - 1 と設定すれば、10msごとに割り込み処理が入る。
   同様に、100msと設定したい場合は、
   Prescaler = 100 -1 とすればよい。
   注意点:PrescalerとCouter Periodは、16bit(65535)までしか設定できない。 
 
  ※CounterPeriod = 16000-1, Prescaler = 10-1 とすると10msごとに割り込みが入る。

 (c)  HAL_TIM_Base_Start_IT(&htim3);
   ・タイマー割り込みをEnableにする。
   ・引数(&htim3)のタイマー割り込みを使用可能とする。(この場合はTIM3)
   
 (d)void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    ・タイマー割り込みを実行するための関数

   (e) if(htim == &htim3){ }
   ・TIM3の実行、TIM3が動作すると、{}の中を実行する。
   参考:​https://babyron64.hatenablog.com/entry/2018/07/31/000537

作成の参考動画:
 

3.関連記事

過去の記事:
組み込みC言語