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モード特徴
- この例の内容
- 電源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とかだと、ボタン電池一つで何年も持ちそう。誕生日カードとかで押すと音楽が鳴るやつ、ああいうの作ってみたい。