システムタイマ【STM32のSysTickタイマ詳細】
システムタイマはSysTickタイマと呼ばれARM Cortex-M3シリーズにCPUコアの一部として備えているシンプルなタイマです。次章で解説するペリフェラルの汎用タイマはとても高機能ですが反面、設定も多岐項目にわたるため、設定も多岐項目にわたるため、ちょっとした用途にはSysTickタイマを使うと便利です。
SysTickタイマはSTMマイコンのAHBクロックHCLKをカウントします。SysTickタイマはダウンカウンタで値を設定するとカウントダウンしていき、0に到達すると次のカウントで割り込みを発生しカウンタ値を設定値に戻すのを繰り返すタイマです。
SysTickタイマは設定した期間のサイクルで割り込みを発生させますのでちょっとした用途、例えばある処理を1秒ごと周期的に実行させるのにSysTickタイマを使うと簡単です。SysTickタイマの割込み機能を1秒ごと発生させてそのたびに割り込み処理を実行させるのです。例を示して解説します。
分周した9MHzのシステムクロックをSysTickタイマとした割り込み:
実際のプログラム内での設定を解説します。
72MHzのシステムクロックの場合はデフォルト設定値(SystemCoreClock)が72M(7200万)のため、そのままSystemCoreClockを設定値としてしまうと1秒間72M回のカウントを繰り返します。
実際問題としてSysTickタイマについているカウンタは24ビットなのでカウントできる上限は最大224の16,777,216でこの制限値を超えないように設定しなければいけません。STM32マイコンではシステムクロックをそのままの速度で使用するか、8分の1に分周したものを使用するか選択することができます。
システムクロックが72MHzの場合はカウンタ上限を超えていますので8分の1に分周したものを使用します。
① SysTickタイマのカウンタ値を設定
SysTickタイマのカウンタ値を設定するにはSysTickConfig()関数を使用します。1秒サイクルの割込みを発生させるにはシステムクロックそのままの場合には関数の引数はカウンタ設定値SystemCoreClockとなりますが、8分周したクロックを使用する場合はSystemCoreClock/8とします。
プログラムでは実行例でSysTick_Config関数の戻り値(正常の場合は0、タイマのカウント上限を超えるなど不正なtickが与えられると1)をチェックして正常実行を確認してから次の処理に進んでいます。
② システムクロック源を指定
システムクロック源を指定するのはSysTick_CLKSourceConfig()関数を使用します。
引数にはAHBクロックそのままか、8分周したクロックを指定します。
■ SysTick_CLKSource_HCLK : AHBクロックそのまま
■ SysTick_CLKSource_HCLK_Div8 : AHBクロックを8分周したもの
③ 割り込み処理の記述
SysTickConfig()関数を実行したことで割り込みは有効となりました。SysTickクロックによる割り込みが発生した場合には専用割り込み処理関数SysTick_Handler()関数が実行されるように設定されています。
そこでこの関数にシステムタイマ割り込み時に実行させたい処理を記述しておけば割り込み発生時に希望の処理を行わせることができます。
上記プログラム例では1秒サイクルの割り込みを発生させるものでした。割り込みのサイクルを変更するには①SysTick_Config()関数の引数(カウント設定値)を変えるだけです。
例えば上記プログラムの条件でSysTick_Config(SystemCoreClock/8 /1000)とすると、1msサイクルで割り込みが発生し、割り込み関数SysTick_Hander()が呼び出されますので、そのたびに1だけ値を増やすか、減らすかの処理を記述しておけば、簡単に1msタイマが作成できます。
この章で紹介して解説したSysTickクロックを利用した簡単なタイマ機能を使えばマイコンプログラムでよく使用するdelay関数などを簡単に最低限のコードで作成できるようになります。