deep sleep and wake-up. WDT interrupt sample. see: http://mbed.org/users/okini3939/notebook/low-power-m0/

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
00004 
00005 Serial pc(USBTX, USBRX);
00006 
00007 extern "C"
00008 void WDT_IRQHandler(void) {
00009     LPC_WWDT->MOD |= (1<<3);
00010     LPC_WWDT->MOD &= ~(1<<2);
00011     led2 = !led2;
00012 }
00013 
00014 void initWDT (float s) {
00015     LPC_SYSCON->SYSAHBCLKCTRL |= (1<<15);
00016     LPC_SYSCON->PDRUNCFG &= ~(1<<6); // WDT on
00017     LPC_SYSCON->PDSLEEPCFG &= ~(1<<6); // WDT on
00018     LPC_SYSCON->WDTOSCCTRL = (1<<5)|(0x1f<<0); // 500kHz / 64
00019 
00020     LPC_WWDT->CLKSEL = (1<<0);               // Set CLK src to PCLK
00021     uint32_t clk = 500000 / 64 / 4;    // WD has a fixed /4 prescaler, PCLK default is /4
00022     LPC_WWDT->TC = s * (float)clk;
00023     LPC_WWDT->WARNINT = 0;
00024     LPC_WWDT->MOD = (1<<0);                   // Enabled but Reset disable
00025 
00026     LPC_WWDT->FEED = 0xAA;
00027     LPC_WWDT->FEED = 0x55;
00028 
00029     LPC_SYSCON->STARTERP1 |= (1<<12);
00030     NVIC_ClearPendingIRQ(WDT_IRQn);
00031     NVIC_EnableIRQ(WDT_IRQn);
00032 }
00033 
00034 void PowerDown () {
00035     LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
00036     LPC_PMU->PCON = (2<<0);
00037     SCB->SCR |= (1<<2);
00038     __WFI();
00039 }
00040 
00041 void DeepSleep () {
00042     LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
00043     LPC_PMU->PCON = (1<<0);
00044     SCB->SCR |= (1<<2);
00045     __WFI();
00046 }
00047 
00048 void Sleep () {
00049     LPC_PMU->PCON = 0;
00050     SCB->SCR &= ~(1<<2);
00051     __WFI();
00052 }
00053 
00054 int main() {
00055     int i;
00056 
00057     pc.baud(9600);
00058     pc.printf("low power\r\n");
00059 
00060     for (i = 0; i < 6; i ++) {
00061         led1 = !led1;
00062         wait(0.2);
00063     }
00064 
00065     for (;;) {
00066     
00067         pc.printf("enter sleep\r\n");
00068         wait_ms(10);
00069 
00070         initWDT(1);
00071         wait_ms(10);
00072 //        Sleep();
00073         DeepSleep();
00074 //        PowerDown();
00075 
00076         pc.printf("wake up\r\n");
00077         for (i = 0; i < 6; i ++) {
00078             led1 = !led1;
00079             wait(0.2);
00080         }
00081 
00082         for (;;);
00083 
00084     }
00085 }