LPC11U68 programming low power modes
From emboxit
Sleep mode
- Tested (Liam)
<cpp> //Liam's code with added comments void scheduler::enterSleepMode() {
LPC_PMU->PCON |= (1<<11); //clear power down flag SCB->SCR &= ~(1<<2); //clear deepsleep bit __WFI(); //Enter Sleep Mode
} </cpp>
Deep Sleep mode
Not Tested (Liam) <cpp> //Liam's code with added comments void scheduler::enterDeepSleepMode() {
LPC_SYSCON->PDRUNCFG &= ~((1<<0) | (1<<1) | (1<<2)); //turn on IRC and flash // REGISTER BLOCK SYSCON, PDRUNCFG = Power configuration register LPC_SYSCON->MAINCLKSEL = 0; // MAINCLKSEL = Main clock source select register, 2bits used: 0x0=IRC, 0x1=PLL in, 0x2=Watchdod osc, 0x3=PLL out LPC_SYSCON->MAINCLKUEN = 0; // MAINCLKUEN = Main clock source update enable register, only bit0 is used LPC_SYSCON->MAINCLKUEN = 1; while(!(LPC_SYSCON->MAINCLKUEN & 0x01)); LPC_PMU->PCON = (1<<11); // REGISTER BLOCK PMU, PCON register 11:0bits used: 2:0 00=default, 0x1-Deep sleep, 0x2=Power down, 0x3=Deep power down....... // bit11: Just sets the power-down-mode FLAG [not used for deep power down] LPC_SYSCON->PDSLEEPCFG = 0x00000FFF; //PDSLEEPCFG = Deep-sleep mode configuration register bit3 and bit6 = 1 ->BOD, WDT powered down [not used for deep power down] LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG; // PDAWAKECFG register: controls the power configuration when waking up from Deep-sleep or Power-down mode. [not used for deep power down] // PDRUNCFG register: controls the power to the various analog blocks. LPC_SYSCON->STARTERP0 |= (1<<(2)); //STARTERP0 Start logic 0 interrupt wake-up enable register 0 Pin interrupt 2 wake-up [????not used for deep power down] SCB->SCR |= (1<<2); __WFI();
} </cpp>
DeepSleep mode
- Tested (Javier)
<cpp>
- include "mbed.h"
InterruptIn wakeup(P0_16); DigitalOut led(P2_2);
void deepsleep(void) {
// PCON[PD] set to deepsleep LPC_PMU->PCON = 0x1;
// SRC[SLEEPDEEP] set to 1 = deep sleep SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
// Power up everything after powerdown LPC_SYSCON->PDAWAKECFG &= 0xFFFFF800;
// wait for interrupt __WFI();
}
static void dummyHandler(void)
{
led = 1; wait(0.2); led = 0; wait(0.2); return;
}
int main () {
wait(1); led = 1; wait(0.2); led = 0; wakeup.fall(&dummyHandler); // Setup falling edge interrupt deepsleep(); // Deep sleep until external interrupt while (1) {
led = !led; wait(0.5);
}
} </cpp>
DeepPowerDown
- Tested (Javier, Nikos)
below works,
- WAKEUP pin wakes it up, but wakening up from deep-power-down is like reset, so it goes to deep-power-down again
- To re-program:
- pull-down pin WAKEUP and press the RESET + ISP button...RESET does not work in deep-power-down-mode
<cpp>
- include "mbed.h"
DigitalOut myled(P2_2);
int main() {
LPC_PMU->PCON |= ((1<<1) | (1<<1) | (1<<0)); //set deep-power-down SCB->SCR |= (1<<2); //set deepsleep bit __WFI(); //Enter Sleep Mode while(1) { myled = 1; wait(0.2); myled = 0; wait(0.2); }
} </cpp>