暇人の技術備忘録

ハサミの技術備忘録

趣味でやっている電子工作の備忘録です。

【STM32備忘録】タイマー割り込みの使い方

f:id:sbasami:20210417145021p:plain

はじめに

前回はGPIOの設定について書きました。

sbasami-tech.hatenablog.com

今回はタイマー割り込みの設定について書きます。CubeMXで設定をしてGenerate Codeし、タイマー割り込みでLチカします。

CubeMXでの設定

タイマー割り込みはクロックの設定も必要で内部クロックを使うか外部クロックを使うかなどで設定も変わってくるが、今回は内部クロックでTIM3のタイマー割り込みを使用する。

クロックの設定

  1. 外部クロックを使用する場合は最初に「System Core」→「RCC」でクロックソースの設定を行う必要がある。外部からクロックを入力する場合は「BYPASS Clock Source」、水晶振動子などを使用する場合は「Crystal/Ceramic Resonator」を選択する。
    f:id:sbasami:20210418125137p:plain

  2. クロック設定は「Clock Configuration」で行うことができる。TIM3はAPB1のクロックに基づいて動く、今回はデフォルトの状態で設定変更はしない。
    f:id:sbasami:20210418125155p:plain
    どのTIMがどのクロックに基づいて動くかはSTM32F303K8のデータシートを見ると分かる。

    f:id:sbasami:20210418125212p:plain

タイマーの設定

  1. 「Timers」→「TIM3」を見ると以下のような画面が表示される。
    f:id:sbasami:20210418125406p:plain
    因みにタイマーによって画面表示は異なる、以下はTIM6の設定画面。これは各タイマーが持っている機能の違い、TIM3は設定項目が多いので色々な機能を持っているということになる。
    f:id:sbasami:20210418125427p:plain

  2. 「Clock Sorece」で「Internal Clock」を選択すると、「Configuration」に設定項目が出てくる。因みに「⚠」のマークが表示されていたり、黄色くなっている場所は設定によっては機能が競合するということを教えてくれている。赤い表示は機能が競合するから設定できない。
    f:id:sbasami:20210418125459p:plain

  3. 「Parameter Settings」で「Prescaler」と「Counter Period」の設定を行う。下記は1秒毎に割り込みを行う設定。PrescalerとCounter Periodについては後で詳しく書く。
    f:id:sbasami:20210418125547p:plain

  4. 「NVIC Settings」でチェックボックスにチェックを入れる。これによって割り込みが有効化される。
    f:id:sbasami:20210418125603p:plain

  5. 設定が終わったら「Ctrl」+「s」でGenerate Code。main.cにMX_TIM3_Init()が追加されていればOK。
    f:id:sbasami:20210418125620p:plain

PrescalerとCounter Periodの設定

TIM3はAPB1の8MHzで動作するがPrescaler(分周器)によって更に動作周期を変更できる。今回はPrescalerを8kHzに設定したのでTIM3は1kHzでカウントアップするようになる。


\displaystyle{8000000Hz / 8000Hz = 1000Hz}

Counter Periodはタイマーのカウントが幾つになったら割り込みを発生させるかの値。今回は1000と設定したので1秒毎にタイマー割り込みが行われる。


\displaystyle{1000 / 1000Hz = 1s}

Counter Periodを500にすると0.5秒毎にタイマー割り込みが行われる。


\displaystyle{500 / 1000Hz = 0.5s}

因みにConfigurationで設定する時に「8000-1」や「1000-1」のように設定していたのは、プログラム上では0からスタートするので1引いた値を設定している。

Lチカプログラムの作成

タイマーを開始するには以下の関数を追加すれば良い。TIM3なのでhtim3、TIM6ならhtim6になる。
f:id:sbasami:20210418125706p:plain

HAL_TIM_Base_Start_IT(&htim3);

タイマー割り込みが発生した時に呼ばれるコールバック関数も追加する。HAL_TIM_PeriodElapsedCallbackは既に用意されている関数でタイマー割り込みが発生すると呼ばれる。引数のhtimに渡された値からどの割り込みが発生したのか判別し処理を行う。
f:id:sbasami:20210418125722p:plain

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim == &htim3){
        HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);//ピンの出力を切り替え
    }
}

あとはビルドして書き込めば1秒周期のLチカができるはず。

おわりに

今回はタイマー割り込みの設定について書きました。次はシリアル通信について書きたい。

書きました↓↓↓

sbasami-tech.hatenablog.com