CMTの使い方
ここでは,SH7085が内蔵するCMTの使い方を学ぶ.
CMT とは
CMT は,Compare Match Timer の略であり,コンペア(比較)し,マッチ(一致)したら何かが起こるタイマである.実際には,クロックをカウントするカウンタと,ユーザが設定する値とを比較していて,一致するとレジスタの特定ビットが1になったり,割込みを発生させることもできる.
タイマと呼ばれるものは,時間をカウントするもので,マイコンの世界では,頻繁に使われており,ソフトウェアタイマと大別できる.
ソフトウェアタイマとは,簡単に言えば,次のようなプログラムである.
for ( i = 0; i < 10000; i++) ;
上記の場合,待ち時間は,「出たとこ勝負」である.もちろん(ビルドしてマシン語に変換された)命令の実行時間やハードウェア性能などから正確な時間を計算することも可能ではあるが,現実的ではない.
ハードウェアを使用したタイマは,正確な周期の信号をカウントするので,カウント値と時間の関係は一定であり,正確な時間を知る(作る)ことができるのである.
マイコンには,このような用途のカウンタ機能が組込まれていることが多く,SH7085の場合には,ここで解説するCMT と,さらに多機能なMTU2 などのタイマ機能も組込まれている.
モジュールスタンバイ
SH7085の内蔵モジュールは,初期状態でスタンバイモードになっているものが多い.今回使用するCMT も初期状態では,スタンバイモードになっているモジュールの一つである.
これは,SH7085 の消費電力を抑えるためである.SH7085 内部のモジュールは,カウントや通信などを行わずにじっとしている場合にも,クロックが供給されているだけで,一定の電力を消費してしまう.特に,バッテリ駆動の機器の場合などは無駄な電力消費は大きな問題となる.そこで,不要なモジュールはクロックを断ってしまうのである.
CMT モジュールを動作可能な状態にするには,モジュールのスタンバイモードを解除する必要がある.そのためには,スタンバイコントロールレジスタ4(STB.CR4)の ビット5 を使う.このビットを0にすることで,クロックが供給されて,CMT は動作可能状態になる(図1).
図1:モジュールスタンバイの解除
図1は,ハードウェアマニュアルに記載されているビットの名称である.しかし,このビットの名称は,直感的ではないので,ルネサスが提供する 7080S.H では,下記のように構造体と共用体が宣言されている.
struct st_stb { union { unsigned char BYTE; struct { unsigned char STBY:1; } BIT; } CR1; ~ 中略 ~ union { /* STBCR4 */ unsigned char BYTE; /* Byte Access */ struct { /* Bit Access */ unsigned char _MTU2S:1; /* MTU2S */ unsigned char _MTU2 :1; /* MTU2 */ unsigned char _CMT :1; /* CMT */ unsigned char :2; unsigned char _AD2 :1; /* A/D2 */ unsigned char _AD1 :1; /* A/D1 */ unsigned char _AD0 :1; /* A/D0 */ } BIT; } CR4; ~ 中略 ~ }; #define STB (*(volatile struct st_stb *)0xFFFFE802)/* STB Address*/
モジュールスタンバイレジスタにアクセスするには,下記のようなプログラムになる.
STB.CR4.BIT._CMT = 0; /* モジュールスタンバイの解除 */ STB.CR4.BYTE &= 0xDF; /* モジュールスタンバイの解除 */
CMT の構成
CMT には,2チャネルのカウンタが内蔵されており,それぞれ,CMT0(CMT チャネル0) とCMT1(CMT チャネル1) と呼ぶ.CMT のチャネル0 の概念図を図2に示す.なお,チャネル0 もチャネル1 も同じ構成になっている.
図2:CMT の概念図
周辺バスクロック(Pφ) を 20MHzとする.
①.1/8 ,1/32 ,1/128 ,1/512 に分周し,いずれかの分周比を選択し,そのクロックをカウントし,カウント結果がCMCNT レジスタへ格納される.クロックの分周比は,CMCSR レジスタのCKS ビット(2ビット)で選択する.初期値は 00 (1/8)である.
②.CMCOR レジスタは,CMCNT レジスタと比較する値が格納されたレジスタである.このCMCOR レジスタに格納された値とCMCNT レジスタの値が比較され,一致すれば CMCSR レジスタのビット7 が1 になる.同時にCMCNT レジスタは,0 にクリアされ,再びカウントを開始する.
③.カウントの開始と停止を行うレジスタがCMSTR レジスタである.このレジスタのSTR0 と STR1 ビットでカウントの開始と停止を行う.
④.CMCSR レジスタのビット7のように,判定の結果を示すビットをフラグビットと呼ぶ.フラグが1になることを「フラグが立つ」と言うことが多い.逆にフラグビットが0になることを「フラグが倒れる」などと言うことがある.
Pφ の分周比を1/8 に設定した場合,20[MHz] × 1 / 8 = 2.5 [MHz] をカウントすることになる(図3).この場合,1周期は,0.4[us](400[ns])であるから,CMCNT レジスタの値は,0.4 us ごとに1づつ増加する.CMCNT レジスタは,16ビットレジスタなので,0x0000 〜 0xFFFF までをカウントできる.0xFFFF に1 を加えると 0x0000 に戻る.10進数では, 0 〜 65535 までである.