SysTick(システムタイマ)
Cortex-M3はマイコンの周辺機能とは別にフレキシブルなシステムタイマを持っています。24ビットの自動再ロードダウンカウンタです。カウント終了割り込み発生機能が付いているため定期的な例外処理(第13回参照)を発生させることができます。他の例外処理と同じく優先順位は設定可能です。
SysTickクロックは2つのソースから選択可能です。ひとつはCPUクロックです。もう一つは外部参照クロックと呼ばれ、各マイコンによって異なります。外部参照クロックが選択できないマイコンもありますので、各マイコンの説明書を参照してください。多くの場合、外部参照クロックはCPUクロックを分周したクロックが選択できます(例えば、8分周等)。このタイマはリアルタイムOSやタスクスケジューリングのように時間管理に最適なタイマです。
SysTickの特徴
SysTick制御およびステータスレジスタ
SysTick機能を有効にするには、SysTick制御およびステータスレジスタを使用します。このレジスタのENABLEビットを1にすると、カウンタは動作をはじめます。つまり、カウンタにリロード値がロードされてから、カウントダウンが開始されます。カウント値が0になると、このレジスタのCOUNTFLAGビットを1にセットします。
また、TICKINTビットに基づいてSysTickハンドラを保留することもできます。その後、リロード値を再びロードして、カウントを開始します。ENABLEビットを0にするとカウンタは停止します。クロックソースを選択するには、CLKSOURCEビットを設定します。0の時は外部参照クロックが選択され、1の時はCPUクロックが選択されます。
SysTickリロード値レジスタ
カウンタの再ロード値をこのレジスタに設定します。カウンタが0になった時に、このレジスタの値をカウンタに設定し、再びカウントを始めます。0x00000001~0x00FFFFFFの任意の値が設定可能です。開始値を0にすることもできますが、SysTick割り込みとCOUNTFLAGビットは1から0へのカウントの際にアクティブとなるため、開始値0は無効です。このため、N+1回目のクロックパルス(Nは0x00000001~0x00FFFFFFの任意の値)ごとにアクティブとなります。
例えば、SysTick割り込みを100クロックパルスごとに発生させる必要がある場合、RELOADに99を書き込む必要があります。SysTick割り込みごとに新しい値が書き込まれる場合は、シングルショットとして扱われるので、実際のカウントダウンを書き込む必要があります。例えば、400クロックパルス後にSysTickを発生させる必要がある場合は、RELOADに400を書き込みます。
SysTick現在値レジスタ
レジスタの現在の値を調べるには、SysTick現在値レジスタを使用します。レジスタがアクセスされたときの現在値を得ることができます。このレジスタは書き込みクリアなので、任意の値を書き込むと、レジスタが0にクリアされ、SysTick制御およびステータスレジスタのCOUNTFLAGビットもクリアされます。
SysTick較正値レジスタ
SysTick較正値は各マイコンで固定値が格納されています。このオプションが使えないマイコンもあるのでマイコンの説明書を参照してください。例えば、SysTick較正値が9000に固定されている場合、SysTickクロックが9MHzの時に1msのタイムベースが生成されます。
電力管理
一般的にマイコンの電力管理と言えば、低消費電力モードを使ってマイコン全体の平均消費電力を最適化することを指します。そして、低消費電力モードというのは、具体的に次のような状態が挙げられます。
- マイコン全体が低周波数で動作する
- CPUは停止して周辺機能だけ動作する
- CPUも周辺機能も停止する
- クロックをゲーティング(クロックをゲートで制御して、供給したり、止めたりする)して、必要な機能のみを動作させる
この中で、CPUが停止する場合、CPUは消費電流の最も小さい状態で停止しなければなりません。一般的に、CPUに入力されるクロックを停止し、無駄な電流が流れないように内部の状態は設定されます。Cortex-M3にもこのような状態が準備されています。それも、複数の低消費電力モードが準備されています。これらのモードはスリープ(SLEEP)とディープスリープ(DEEP SLEEP)の2種類です。
スリープは、移行のタイミングの違いで、さらにスリープナウ(SLEEP NOW)とスリープオンエグジット(SLEEP on EXIT)の2種類に分かれます。ディープスリープは、スリープよりも深いスリープモードです。深いというのは、消費電力が前者より低いという意味です。ただし、起き上がるのに時間がかかります。これらの電力状態は、システム制御レジスタにより制御されます。では、各モードの詳細を説明いたします。
スリープナウ(SLEEP NOW)
このモードは、割り込み待ち(WFI)またはイベント待ち(WFE)命令によっ
て遷移します。プログラムの中で、これらの命令が実行されるとすぐにスリープモードへ入ります。「すぐ」という意味でNOWという言葉が使われています。
割り込み待ち(WFI)命令により移行した場合は、スリープからの起動のためのトリガが発生すると、割り込み処理(第13回参照)が実行されます。イベント待ち(WFE)により移行した場合は、スリープからの起動のためのトリガが発生後、割り込みは実行されません。割り込みサービスルーチンへ飛ばず、スリープに入った次のコードから実行されます。
これらの命令が実行されると、ネスト型ベクタ割り込みコントローラ(NVIC(第13回参照))は、他の例外を保留して、プロセッサを低電力状態に移行します。
スリープオンエグジット(SLEEP on EXIT)
システム制御レジスタのSLEEPONEXIT ビットがセットされている場合、最も優先度が低いISRから退出直後に、Cortex-M3は自動的にスリープモードに移行します。ISRが「終了してから」スリープモードに入るのでon EXITという言葉が使われています。コンテキストセーブ(レジスタのポップ)は行わずに、スリープモードに移行します。従って、次に例外処理が発生したときには、レジスタのPUSHを行わず(必要とせず)にその例外を処理します。ユーザーはメインルーチンでWFI/WFEを実行する前に、SLEEPONEXITビットをセットする必要があります。
ディープスリープ(DEEP SLEEP)
ディープスリープモードは、スリープナウおよびスリープオンエグジットと組み合わせて使用します。システム制御レジスタのSLEEPDEEPビットがセットされている場合、Cortex-M3は、より深いスリープ状態へ移行します。これは長時間用のスリープ状態です。
スリープ状態を示す信号
Cortex-M3は、いつスリープしているのかを通知するため、次の信号を出力しています。
- SLEEPING
- この信号は、スリープナウまたはスリープオンエグジットモードでアサートされ、プロセッサへのクロックを停止できることを示します。新しい割り込みを受信すると、NVICはコアをスリープから解除し、この信号をデアサートします。
- SLEEPDEEP
- システム制御レジスタのSLEEPDEEPビットがセットされている場合、スリープナウまたはスリープオンエグジットモードでこの信号がアサートされます。この信号はクロックマネージャまで配線され、プロセッサおよびフェーズロックドループ(PLL)を含むシステムコンポーネントをゲートして、より電力を節約することができます。新しい割り込みを受信すると、ネスト型ベクタ割り込みコントローラ(NVIC)はこの信号をデアサートし、クロックマネージャからクロックが安定しているという通知を受けた時点で、コアをスリープから解除します。
8ビットマイコン同様の電力モード管理
電力管理が必要なアプリケーションといえば、まず電池駆動のものが挙げられます。いかに消費電力を小さくして電池の寿命を延ばし、ユーザーの電池交換の手間を減らすかという課題のもとに開発されます。これらの用途では、パフォーマンスよりも消費電力が優先されます。そこで、消費電力が小さいという理由で、多くの場合8ビットマイコンが使われてきました。最近では、少し高機能化が進んで、16ビットマイコンも使われています。そのため、8ビットマイコンの低消費電力モードは、マイコン各社で色々なモードが考えられ、実際の仕様に盛り込まれてきました。
前述したさまざまな低消費電力モードも、主に8ビットマイコンで考え出され、16ビットマイコンに広まってきたものです。32ビットマイコンでは、ここまで細かく電力を管理することは少ないと思われます。しかし、Cortex-M3のコンセプトのひとつに低電力があります。前述したように、Cortex-M3を停止させるモードの時には、Cortex-M3のスリープナウ(SLEEP NOW)、スリープオンエグジット(SLEEP on EXIT)、ディープスリープ(DEEP SLEEP)の3種類を選択できるようになっています。そのため、Cortex-M3の電力管理は32ビットマイコンなのに、8ビットマイコン並みの適応範囲を持っていると言えます。
Cortex-M3を搭載したマイコンは現在では、世の中に沢山あります。そして各社のマイコンは多種多様な低消費電力モードを持っています。各マイコンが自身の持つ低消費電力モードに移行したときに、Cortex-M3がどの低消費電力モードに移るかは、マイコン側が決めます。各マイコンがそれらの低消費電力モードに移行し、Cortex-M3は、Cortex-M3のスリープナウ(SLEEP NOW)、スリープオンエグジット(SLEEP on EXIT)、ディープスリープ(DEEP SLEEP)のいずれかのモードが選択されます。
例えば、CPUは停止するが、周辺機能は動作していて、周辺機能または外部からのトリガでCPUがすぐ動作を始めなければならないような低消費電力モードの場合、Cortex-M3ではスリープナウ(SLEEP NOW)かスリープオンエグジット(SLEEP on EXIT)が適用されます。また、CPUも周辺機能も全部停止させて、マイコン全体が長時間低消費電力モードを維持する場合、Cortex-M3では、ディープスリープ(DEEP SLEEP)が適用されます。このように、Cortex-M3の最適な低消費電力モードはマイコンが自動的に選択(設定)しますので、ユーザーはマイコンの低消費電力モードの仕様を理解しておけば良いことになります。
マイコンの低消費電力モードについては各マイコンの仕様書をご参照の上、Cortex-M3が持っている8ビットマイコン並みの電力管理機能をご活用ください。
こちらも是非
“もっと見る” Cortex-M編
メモリマップ
Cortex-M3のメモリマップには、一般的なマイコンのメモリマップと若干異なる特徴があります。一般的なマイコンでは、メモリ領域を変更できるものもあります。しかし、Cortex-M3のメモリマップは定義されたメモリマップになっており、アドレス領域のマッピングは固定です。
ベクタテーブル
Cortex-M3のベクタテーブルは0番地から始まります。一般的なマイコンは、ベクタテーブルの最小アドレス部(0番地)にはリセットベクタが割り当てられていますが、Cortex-M3ではメインスタック(SP_main)の初期値が割り当てられています。
NVICレジスタ
NVIC(統合ネスト型ベクタ割り込みコントローラ)が持っている制御用レジスタを説明します。SysTick関係のレジスタもNVICレジスタに含まれますが、それらはSysTickの章で詳しく説明します。