LPC11U68 programming low power modes

From emboxit
Revision as of 15:06, 21 April 2015 by NikoSysop (Talk)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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>

  1. 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>

  1. 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>