LPC810の省電力モードでいろいろハマった

d.hatena.ne.jp
こちらの記事を参考にしながら、Deep-sleep modeに入ったり、Deep power-down modeに入ったりしてみた。
gist.github.com
とりあえず、main以外は、こんな感じ。
gist.github.com
最初はこんな感じだったと思う。
これだと、割り込みでWAKEUPした後、Deep-sleepに入ると、タイマーで復帰しなくなる。

	    	// Needed?
	    	NVIC_ClearPendingIRQ(WKT_IRQn);
	    	NVIC_DisableIRQ(WKT_IRQn);
	    	LPC_PMU->DPDCTRL = 0;
	    	SCB->SCR = 0;
	    	LPC_WKT->CTRL |= (1 << 1) | (1 << 2);

Needed?のところがまずかったらしい。
あと、LPC810メモ:deep power-downモード(Self wake-up timerで復帰) - みっかぼログにある、次のサンプルコードも原因の一つだった。

        // DPDFLAG(11)が立ってるので、deep power-downからの復帰である。
        //	同フラグをクリア
        LPC_PMU->PCON &= ~(1 << 11);

正しくは次の通りだ。

LPC_PMU->PCON |= (0x1<<11);

この修正を加えることで、ピン入力でWAKEUPしたあと、Deep-sleepに入ってもタイマーでちゃんと復帰するようになる。
しかし、これではDeep power-downに入った後、復帰後Deep-sleepに入ろうとすると一瞬で処理が終わる。
スリープしていない。
Needed?の部分は、LPC812, WKT, deep power down mode: working only once... | www.LPCware.comにあったのを持ってきたり、Deep power-downで消し忘れたレジスタがあるのでは無いか疑惑を払拭するために追加したのだが、これはまずかったみたい。
正しくは次の通りみたいだ。

	    	LPC_WKT->CTRL |= WKT_CLR;
	    	NVIC_ClearPendingIRQ(WKT_IRQn);
	    	NVIC_DisableIRQ(WKT_IRQn);

この修正を加えることで、ちゃんとスリープから復帰する。

しかし、フラグをクリアするのに、0を代入するんじゃ無くて、1を代入するとか罠だよな。
今年も残りわずかだが、なんとか年内に記事を公開できそうだ。

00:07追加
あけましておめでとうございました。
修正後のmainを貼り忘れた。
gist.github.com
直すと、こんな感じになるかと思う。