LPCOpenライブラリのスタートアップ処理変更
スタートアップ処理は、本来変更不要 です。但し、唯一変更したい箇所が、デフォルト24MHzのシステム動作クロック設定:SystemSetupClocking()です。テンプレートは、CPU最大速度の30MHz動作 にします(目的は、後述)。このシステム動作クロックは、ユーザプロジェクト処理のHdwInit()で再設定も可能です。しかし、一旦設定したクロックを再度設定するのは、なんとも気持ちが悪いです。このクロックはマイコン全ハードの動作を決めるので、SleepやPower_Downで止める以外は、安定発振が無難だからです。
LPCOpen APIとCubeSuite+コード生成の違い
LPCOpenサンプルソフトのシステム動作クロック設定関数SystemSetupClocking()を観ると、API関数に、やたらと1や2などの数値パラメタを代入しています(L103と112)。これは、CubeSuite+コード生成ではGUIで設定するパラメタを、LPCXpressoでは、API関数に直接代入して動作を変えるからです。GUIか、パラメタ代入か、どちらが簡単かは、意見の分かれるところですが、私はGUIが好きです。パラメタの場合は、マニュアルを読みながら値を設定する必要があるからです。
SystemSetupClocking()
私のようなGUI好きな人向きに、システム動作クロックのパラメタを算出するExcelツール があります。
システム動作クロックパラメタ算出ツール
Excelツールの使い方
Excelツールは、内臓PLLのMain CLKとFinを設定すると、システム動作クロック設定に必要となるMSEL、SPEL、DIVの3パラメタを算出します。2ページ構成で、1ページ目にPLL outのMain CLKとFinの入力セルがあります。ここへ60MHz、12MHzを設定します。するとPLLが安定動作する(緑エリア)MSELとPSELが4,1と判ります。また30MHz のSystem Clockには、SYSAHBCLKDIV=DIVのラジオボタンで2を選択すれば良いことも判ります。マニュアルを読むよりも簡単です。算出パラメタをAPI関数へ代入して、デバッガでSystemCoreClockをプローブすると、30MHzに変わったことが確認できました。
SystemCoreClockの確認
システム最大動作設定の目的
テンプレートは、システム最大動作速度の30MHzで開発します。これは、最短で処理を行うためです。そして、処理後はCPUをSleep(RL78/G1xはHALT)させます。この時は、周辺回路だけが動作します。Tick割込みでCPUのSleepは解除され、再び同じ動作を繰り返します。CPU最大速度とSleepの時間割合で最終的な消費電力が決まるわけです。つまり、CPUは時分割動作 します。
例を示します。表示デバイスとして良く使うLCDの初期化には、数msec以上の待ち時間が必要ですが、この時間をCPUが待つのはムダです。そこで、この間はSleepし、数msec経過後に起き上がってLCD処理を行うなどです。これは、RL78/G1xテンプレートに添付したLCDアプリ例 で実施しています。
テンプレートを当該アプリへ適用した後に消費電力を調整します。LPC8xxの場合は、Excelツールを使ってシステム動作クロックを徐々に下げ、時分割処理が達成でき、かつ、消費電力も低くなるシステム動作クロックを探します。システム動作クロックを下げればCPU消費電力は下がりますが、逆に処理時間は長くなりSleepが短くなるので、この方法で、両者のバランスがとれたクロック速度を探します。
RL78/G1xテンプレートの場合も同じです。CubeSuite+コード生成は、GUIで動作クロック速度を選択し、コード生成をクリックすると、ユーザプログラムに上書きされるので、作成ソースをいじることなく簡単安全にクロック速度の変更ができます。やはりGUIの方が楽ですね。
携帯やスマートフォン搭載のマイコンは、バッテリを長持ちさせるために、あらゆる方法を駆使して消費電力を下げる工夫をしています。ここで示したシステム動作クロックを下げるのも、その方法の1つです。
システム最大動作クロックをテンプレートに適用した後にアプリを開発すれば、消費電力を削減する方法が明確になりますし、その方法も簡単 です。後は、この方法を成功させるように、CPU時分割処理向きのアプリを開発すれば良い のです。