ショウのマイクロマウス研修 マウス自作研修

ショウのマイクロマウス制作-Part8

Lチカ_tim ショウのマイクロマウス研修

こんにちは、ショウです。
前回はPWMを出力をしてモータを回しました。
今回はタイマー割り込みを実装します。
タイマー割り込みはマイクロマウスではセンサーの制御周期やセンサーの取得タイミングの指定に使います。
タイマーはTIM5を使います。

CubeMXの設定

TIM5を選択してClock SourceをInternal Clockに設定します。これでPWMと同じように時間毎に割り込んで実行ができるようになります。
また、PrescalerとAutoReloadRegisterも設定します。
TIM5を1ms毎、1kHzで割り込みに設定します。PWMと同じ周波数なので、PWMと同様に1699と99に設定します。

CubeMX

これで1ms毎にCNTをクリアすることができるようになりました。
割り込みはNVIC SettingsのタブでTIM5 global interruptのところのEnabledのチェックを入れると割り込み処理ができるようになります。

CubeMX

割り込み処理プログラム

CubeIDEではstm32g4xx_it.cという割り込み用のファイルが用意されています。
先程TIM5 global interruptのEnabledのチェックを入れるとstm32g4xx_it.cにTIM5_IRQHandlerという関数が用意されます。

void TIM5_IRQHandler(void)
{
    /* USER CODE BEGIN TIM5_IRQn 0 */

    /* USER CODE END TIM5_IRQn 0 */
    /* USER CODE BEGIN TIM5_IRQn 1 */

    /* USER CODE END TIM5_IRQn 1 */
}

この中に

if ( LL_TIM_IsActiveFlag_UPDATE(TIM5)==1){
    LL_TIM_ClearFlag_UPDATE(TIM5);
}

を追加します。
これはTIMのUIFレジスタをクリアする処理です。UIFは更新割り込みフラグというレジスタで、CNTの値がAutoReloadRegisterの値と一致した時に割り込みが発生する為のフラグを立ててくれます。

しかし、このレジスタは自動でフラグを戻してくれないので、UIFをチェックしてから戻す処理を自分で追加しています。

TIM5_IRQHandlerの中に処理を書くと、CubeMXで設定した通り1ms毎に書き込みが行われます。
ここに例えばLEDのオンオフを入れるとmain関数などでLEDを設定しなくてもLチカをすることができます。

動作確認

タイマー割り込みを使ってLチカをするプログラムを用意して動作確認をしました。

割り込み回数をカウントして1秒毎にLEDをオンオフしています。

1秒毎にLEDをオンオフ

当然ですが、Lチカと見た目が何も変わらない。

参考URL

STM32 + LL でTIMの割り込みを動かしてみる | Sora's Activity Record
STM32マイコンのペリフェラル関連記事を一覧にまとめました。 今回は、TIMの割り込みを有効にして割り込みができるようにするということをやっていきたいと思います。TIM割り込みの...
HALの内部構造~TIM3を追いかける~ - ばびろん's すたっく
STM32F303K8をターゲットとしてCubeMXを使って自動生成したソースコードを追いかけることで、HALライブラリの中身を理解する。この記事では、TIM3に関係する部分を見て行く。 TIM3の設定 まず、CubeMXでTIM3をInternal Clockを使うように設定する。そして、NVIC Settingsか...
タイトルとURLをコピーしました