こんにちは、ショウです。
前回はPWMを出力をしてモータを回しました。
今回はタイマー割り込みを実装します。
タイマー割り込みはマイクロマウスではセンサーの制御周期やセンサーの取得タイミングの指定に使います。
タイマーはTIM5を使います。
CubeMXの設定
TIM5を選択してClock SourceをInternal Clockに設定します。これでPWMと同じように時間毎に割り込んで実行ができるようになります。
また、PrescalerとAutoReloadRegisterも設定します。
TIM5を1ms毎、1kHzで割り込みに設定します。PWMと同じ周波数なので、PWMと同様に1699と99に設定します。
これで1ms毎にCNTをクリアすることができるようになりました。
割り込みはNVIC SettingsのタブでTIM5 global interruptのところのEnabledのチェックを入れると割り込み処理ができるようになります。
割り込み処理プログラム
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をオンオフしています。
当然ですが、Lチカと見た目が何も変わらない。
参考URL

