Enables lower power Sleep and power down modes for LPC11U24 systems than the mbed API supports directly.

Dependents:   mBuDice SleepyCounting

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers mBuinoSleep.cpp Source File

mBuinoSleep.cpp

00001 #include "mBuinoSleep.h"
00002 
00003 
00004 BusOut LEDs(LED1, LED2, LED3, LED4, LED5, LED6, LED7);
00005 
00006 DigitalIn progMode(P0_3,PullNone);
00007 
00008 bool sleep_CleanShutdown = false;
00009 
00010 void mBuinoSleep(enum sleepMode_t mode)
00011 {
00012 
00013     uint8_t oldLEDState = LEDs;
00014     LEDs = 0;
00015 
00016     progMode.mode(PullNone);
00017 
00018     if ((mode == DeepPowerDown) && (LPC_PMU->PCON & 0x08)) // bit 3 high blocks deep power down.
00019         mode = PowerDown;
00020 
00021     switch (mode) {
00022         default:
00023         case Sleep:
00024             LPC_PMU->PCON = 0x0;
00025             SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
00026             __WFI();
00027             break;
00028 
00029         case DeepSleep:
00030         case PowerDown:
00031         case PowerDownWD:
00032         case DeepSleepWD:
00033          {
00034             if ((mode == PowerDown) || (mode == PowerDownWD))
00035                 LPC_PMU->PCON = 0x2;
00036             else
00037                 LPC_PMU->PCON = 0x1;
00038 
00039             LPC_SYSCON->PDSLEEPCFG |= 0x7f;  // shut off everything we can.
00040 
00041             if ((mode == DeepSleepWD) || (mode == PowerDownWD))
00042               LPC_SYSCON->PDSLEEPCFG &= ~(1<<6);
00043               
00044             SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
00045 
00046             bool IRCPowered = (LPC_SYSCON->PDRUNCFG & 0x01); // only used for cleen shutdown but defined here for scope reasons.
00047             if (!IRCPowered)
00048                 LPC_SYSCON->PDRUNCFG &= 0xfffffffe; // power up the IRC
00049 
00050             if(sleep_CleanShutdown) {
00051                 LPC_SYSCON->MAINCLKSEL    = 0x00; // switch to IRC to avoid glitches
00052                 LPC_SYSCON->MAINCLKUEN    = 0x01;               /* Update MCLK Clock Source */
00053                 LPC_SYSCON->MAINCLKUEN    = 0x00;               /* Toggle Update Register   */
00054                 LPC_SYSCON->MAINCLKUEN    = 0x01;
00055                 while (!(LPC_SYSCON->MAINCLKUEN & 0x01));       /* Wait Until Updated       */
00056             }
00057 
00058             LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG; // switch on everything that is currently on when we wake up.
00059             __WFI();
00060 
00061             if(sleep_CleanShutdown) {
00062                 LPC_SYSCON->MAINCLKSEL    = 0x03; // switch to PLL output
00063                 LPC_SYSCON->MAINCLKUEN    = 0x01;               /* Update MCLK Clock Source */
00064                 LPC_SYSCON->MAINCLKUEN    = 0x00;               /* Toggle Update Register   */
00065                 LPC_SYSCON->MAINCLKUEN    = 0x01;
00066                 while (!(LPC_SYSCON->MAINCLKUEN & 0x01));       /* Wait Until Updated       */
00067             }
00068 
00069             if (!IRCPowered)
00070                 LPC_SYSCON->PDRUNCFG |= 0x01; // power down the IRC if it was off before
00071         }
00072         break;
00073         case DeepPowerDown:
00074             LPC_PMU->PCON = 0x3;
00075             LPC_SYSCON->PDSLEEPCFG |= 0x7f;  // shut off everything we can.
00076             SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
00077             __WFI();
00078     }
00079     LEDs = oldLEDState;
00080 }