Enables lower power Sleep and power down modes for LPC11U24 systems than the mbed API supports directly.
Dependents: mBuDice SleepyCounting
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 }
Generated on Mon Jul 18 2022 19:56:58 by 1.7.2