マイコン工作実験日記

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

眠らせる

2012-12-21 12:30:24 | Weblog
BlueHANDはリポ電池で動くようにしてありますが、正直なところちゃんと連続使用したことがないので、どのくらい電池が持つのかよくわかりません。消費電流を調べればおおよその予測を立てることができるでしょうが、それに先立って考えられる電力削減の手だてを打っておいた方がいいでしょう。

これまでにやってあるのは、次の2点だけ。
  1. クロック速度を12MHzに設定
  2. アイドル時にスリープする
開発に使っているCrossWorksにはLPC11xx用のCPUサポートも備わっているので、スタートアップルーチンも出来合いのものが用意されています。しかし、そのルーチンではPLLを使ってクロック速度を48MHzに設定してしまいます。こんなに早くなくてもいいので、PLLは使わずIRCの12MHzをそのまま使うようにしています。もっと下げられるかもしれません。

Cortex-MではWFI命令を使って割り込み待ちをおこなうことで省電力モードに遷移することができます。通常のスリープモードは、特別な前処理も必要とせずSCRレジスタのSLEEPDEEPをクリアした状態でWFI命令を実行するだけで遷移することができます。

RTOSを使うとスリープ処理はとても簡単に実現することができます。TOPPERSでは、CPU依存のディスパッチャにおいて実行可能タスクが無い場合にWFI命令を実行してくれます。そのため、ユーザ・プログラム側では何も考えなくてもスリープ状態に入ることができます。一方、CrossWorksで提供されているCTL (CrossWorks Tasking Library)では、アイドルタスク機構は提供されていませんので、明示的にこれを用意することになります。具体的なコードの流れは次のようになります。
int main(void)
{
  change_clock();      /* 12MHz IRC に変更 */
  SystemCoreClockUpdate();      /* クロック変更をCMSIS レイヤに反映 */

  /* 自分自身を main_taskとして登録するとともに、優先度を最高(255)にする */
  ctl_task_init(&main_task, 255, "main");

  /* 他のタスクを登録する */

  ctl_task_set_priority(&main_task, 0);   /* 自分の優先度を最低(0)にする */

  while (1) {
    __WFI();
  }
  return 0;
}

自分自身の実行優先度を最低とすることで、最後のwhileによる無限ループがアイドル時に実行されることになります。ここに__WFI() を挟めばいいだけですね。

ここまでは「いつものおまじない」のようなものですから、もう少し努力しなくては。AN11027によると、Sleepモードではコアのクロックは止まるものの消費電流は12MHzで2mA程度となっています。やはりDeep-sleepさせなくては。

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。