マイコン工作実験日記

Microcontroller を用いての工作、実験記録

省電力化の試み -- その2

2010-10-28 22:36:03 | Weblog
Idleモード対応の次のステップとして、Power Downモード対応です。Idleモードではプロセッサクロックが止まりましたが、クロック発振器は動き続けており、内蔵周辺機器部分は動いていました。それに対してPower Downモードではクロックの発振器そのものとPLL、そしてフラッシュメモリを止めてしまいます。そのため、内蔵周辺機器も動作しません。Sleepモードも同じようにクロック発振器とPLLを止めますが、フラッシュメモリは止まりません。

Power Downモードは、アプリケーションが休止状態になった時に入ることにしました。時計表示の時には、LCDが消えた時点でユーザには機能的に意味が無いので休止したも同じです。MP3プレーヤの時には、LCDが消えても再生中であれば動作を止めるわけにはいきませんが、再生が休止された状態であれば動作を止めることができます。

クロックが止まり内蔵周辺機器へのクロック供給が止まるので、任意のデバイスからの割り込みで復旧というわけにはいかず、復旧できる割り込み要因は限定されます。外部割り込み、ポート0またはポート2からのGPIO割り込み、Ethernet, USB, CANなどの割り込みでの復旧は可能ですが、UART, SPIなどの割り込みでは復旧できません。まずはタッチパネルにタッチすることで、復旧するとともにバックライトも点灯させることにしました。タッチパネル割り込みはGPIO割り込みを使っているのですが、幸いなことにポート2を使っているので、これでWakeup可能でした。具体的な処理としては割り込みハンドラにおいてWakeupかどうかを判別して、そうであればクロックの初期化とPLLの接続をおこないます。Power downによりPLLが切断されているので、PLLの接続状態を確認することでWakeupされたかどうかを判断しています。

実装としては40秒のタイマを用意して、アプリケーションがこれをリロードしないでいると、タイムアウトが発生してPower downするコードを追加しました。LCDバックライトの30秒タイマよりも長い40秒にしてあるので、LCDが消えてしばらく経ってからPower downします。もともと1秒間隔でボード上のLEDが点滅する処理がメインタスクの中に含まれているのですが、この点滅が止まることでPower downされたことを確認できます。タッチにより、再び点滅を開始するとともにLCD表示が戻ってくるという具合です。

比較的簡単にPower downとWake upが実現できちゃいましたが、Wakeupさせる条件としてはタッチパネルだけでなくW-SIMやWT32の動作も考慮する必要があります。W-SIMについては着信があった時にWakeupさせねばいけません。Wake on Ringというやつですね。着信はW-SIMのRI信号を監視することで検出できますが、UART割り込みではWakeupできません。LPC2388側でRI信号に使っている端子はP2[6]だったので、この端子をGPIOに設定しなおして立下り割り込みでRI信号検出をするように変更。着信を入れると消えていたLCD画面の時計表示が戻ってくるようになりました。そろそろ、ちゃんと電話としての機能も実装しないといけません。

残りはWT32の動作に伴うWakeupですが、ちょっと満足できる方法が見つかっていません。詳しくは、次回の記事で書くことにします。