Deep power-down mode example program.

Dependencies:   mbed

LPC810のDeep power-downモードのテストプログラム。
LEDが消灯している時間はDeep power-downモードで作っています。

Warning

Deep power-downモードではリセットピンによるリセットは効きません。
フラッシュ書き込みにはISPモード(nISP=L)でパワーオンリセットして下さい。

DeepPowerDown.h

Committer:
va009039
Date:
2014-08-27
Revision:
1:de1ba63f90b8
Parent:
0:843a94215f82

File content as of revision 1:de1ba63f90b8:

#pragma once

class DeepPowerDown {
public:
    static void wakeupTimer(uint32_t delay_sec) {
        wakeupTimer_ms(delay_sec * 1000);
    }

    static void wakeupTimer_ms(uint32_t delay_ms) {
        LPC_PMU->DPDCTRL |= (1<<2)|(1<<3); // enable low-power oscillator
        LPC_SYSCON->SYSAHBCLKCTRL |= 1<<9;
        LPC_WKT->CTRL = 0x03; // low power clock(10kHz)
        LPC_WKT->COUNT = delay_ms * (10000/1000);
    }

    static void wakeupPin(bool enable) {
        if (enable) {
            LPC_PMU->DPDCTRL &= ~(1<<1);
        } else {
            LPC_PMU->DPDCTRL |= (1<<1);
        }
    }

    static void setData0(uint32_t data) { LPC_PMU->GPREG0 = data; }
    static void setData1(uint32_t data) { LPC_PMU->GPREG1 = data; }
    static void setData2(uint32_t data) { LPC_PMU->GPREG2 = data; }
    static void setData3(uint32_t data) { LPC_PMU->GPREG3 = data; }

    static uint32_t getData0() { return LPC_PMU->GPREG0; }
    static uint32_t getData1() { return LPC_PMU->GPREG1; }
    static uint32_t getData2() { return LPC_PMU->GPREG2; }
    static uint32_t getData3() { return LPC_PMU->GPREG3; }

    static void entry() {
        LPC_PMU->PCON = 0x03|(1<<3); // Deep power-down mode setting
        SCB->SCR = 1<<2; // Deep sleep for ARM core
        __WFI();
        /* NOTREACHED */
    }

    static bool is_entry() {
        return (LPC_PMU->PCON & (1<<11)) ? true : false;
    }

    static void clear() {
        LPC_PMU->PCON &= ~(1<<11); // clear DPDFLAG
    }
};