LPC810メモ:deep power-downモード(wake up pinで復帰)

reduced power modes(省電力モード?)のうち、最も簡単そうで、かつ最も低消費電力らしい、「deep power-downモード」の実験。

前提とする環境はこちら→LPC810メモ 共通の準備

  • 消費電力順にならべると以下のとおりらしい。数値は電流、データシートLPC81xMの「11. Static characteristics」のTypicalの数値から。
      • active mode(1.4mA)
      • sleep mode(0.8mA)
      • deep-sleep mode(150μA)
      • powor-down mode(0.9μA)
      • deep powor-down mode(170nA)
  • deep power-downモード特徴
    • 一度このモードに入ると、wake up pin(2番pin)をLOWにするか、あらかじめ設定したwake up timerの時間に到達するまで動作停止
    • wake upで復帰すると、main関数の実行からやり直し。なので、電源を入れなおしたのに近い。
    • 単なる電源onと違って、deep power-down専用の汎用レジスタの値だけは保持される
      • 32bitレジスタ4個で16byte分あるから、多分、大概は十分なんだろう。
  • この例の内容
    • 電源onすると、LED一回点滅してdeep power-down
    • ボタンを押す(wake up pinがLOWになる)とwake up、LEDを2回点滅してdeep power-down
    • 以降、ボタン押す度にwake up、点滅回数が一回ずつ増える。

サンプルコード

#include "LPC8xx.h"

int main(void) {
    // 何回目の起動かを判別用 
    uint32_t count = 1;

    // wake up時の手順、deep power-downに入る手順は、それぞれ
    // UM10601の5.7.7.2、5.7.7.3

    // wake upかどうか判定
    // UM10601 5.6.1 Power control register
    if(LPC_PMU->PCON & (1 << 11)) {
        // DPDFLAG(11)が立ってるので、deep power-downからの復帰である。
        //	同フラグをクリア
        LPC_PMU->PCON &= ~(1 << 11);

        // Deep power-downする前に記録した汎用レジスタから値を読み込み
        // UM10601 5.6.2 General purpose registers 0 to 3
        count = LPC_PMU->GPREG0;
    }

    // countの回数分、8番pinのLEDを点滅
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
    LPC_GPIO_PORT->DIR0 |= (1<<0);
    for(uint32_t i = 0; i < (count * 2); i++) {
        LPC_GPIO_PORT->NOT0 |= (1<<0);
        for(volatile int i = 0; i < 200000; i++) {}
    }

    // Deep power-downの処理
    // UM10601 5.6.3 Deep power-down control register
    LPC_PMU->DPDCTRL |= (1 << 0);  // Hysteresis for WAKEUP pin enabled

    // UM10601 5.6.1 Power control register
    LPC_PMU->PCON &= ~(1 << 3); // NODPD = 0
    LPC_PMU->PCON |= 0x3; // PM = 0x3

    // UM10601 5.6.2 General purpose registers 0 to 3
    LPC_PMU->GPREG0 = count + 1;    // 次回のために汎用レジスタをカウントアップ

    // UM10601 5.3.1.1 System control register
    SCB->SCR |= (1 << 2);  // SLEEPDEEP = 1

    //  Use the ARM WFI instruction.
    __WFI();

    return 0 ;
}

接続

  • ボタンは4番pin、LEDは8番pin
  • 電池はいつもの3本じゃなくて2本にしてる。2.5vだけど一応動いている。
  • 1,2番をpull upしてるのは、UM10601「5.4 Pin description」の記載による。
    • WAKEUPとRESETは安定化のために外部でpull upせよとか。
  • 6,7番pin(Vdd,GND)は0.1μFのコンデンサ

補足/雑感

  • 精度は怪しいけど、テスターで電流測ってみた。
    • LED点滅中(active mode) -> 2mA前後
    • deep power-down mode -> 0.1-0.3μAくらい
    • データシートの数値とわりと近い。
  • 0.3μAとかだと、ボタン電池一つで何年も持ちそう。誕生日カードとかで押すと音楽が鳴るやつ、ああいうの作ってみたい。

みっかぼの無料Androidアプリはこちら。