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

Dependencies:   mbed

Committer:
okini3939
Date:
Tue Jul 08 05:57:10 2014 +0000
Revision:
0:766ef51c9b11
1st build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:766ef51c9b11 1 #include "mbed.h"
okini3939 0:766ef51c9b11 2
okini3939 0:766ef51c9b11 3 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
okini3939 0:766ef51c9b11 4
okini3939 0:766ef51c9b11 5 Serial pc(USBTX, USBRX);
okini3939 0:766ef51c9b11 6
okini3939 0:766ef51c9b11 7 extern "C"
okini3939 0:766ef51c9b11 8 void WDT_IRQHandler(void) {
okini3939 0:766ef51c9b11 9 LPC_WWDT->MOD |= (1<<3);
okini3939 0:766ef51c9b11 10 LPC_WWDT->MOD &= ~(1<<2);
okini3939 0:766ef51c9b11 11 led2 = !led2;
okini3939 0:766ef51c9b11 12 }
okini3939 0:766ef51c9b11 13
okini3939 0:766ef51c9b11 14 void initWDT (float s) {
okini3939 0:766ef51c9b11 15 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<15);
okini3939 0:766ef51c9b11 16 LPC_SYSCON->PDRUNCFG &= ~(1<<6); // WDT on
okini3939 0:766ef51c9b11 17 LPC_SYSCON->PDSLEEPCFG &= ~(1<<6); // WDT on
okini3939 0:766ef51c9b11 18 LPC_SYSCON->WDTOSCCTRL = (1<<5)|(0x1f<<0); // 500kHz / 64
okini3939 0:766ef51c9b11 19
okini3939 0:766ef51c9b11 20 LPC_WWDT->CLKSEL = (1<<0); // Set CLK src to PCLK
okini3939 0:766ef51c9b11 21 uint32_t clk = 500000 / 64 / 4; // WD has a fixed /4 prescaler, PCLK default is /4
okini3939 0:766ef51c9b11 22 LPC_WWDT->TC = s * (float)clk;
okini3939 0:766ef51c9b11 23 LPC_WWDT->WARNINT = 0;
okini3939 0:766ef51c9b11 24 LPC_WWDT->MOD = (1<<0); // Enabled but Reset disable
okini3939 0:766ef51c9b11 25
okini3939 0:766ef51c9b11 26 LPC_WWDT->FEED = 0xAA;
okini3939 0:766ef51c9b11 27 LPC_WWDT->FEED = 0x55;
okini3939 0:766ef51c9b11 28
okini3939 0:766ef51c9b11 29 LPC_SYSCON->STARTERP1 |= (1<<12);
okini3939 0:766ef51c9b11 30 NVIC_ClearPendingIRQ(WDT_IRQn);
okini3939 0:766ef51c9b11 31 NVIC_EnableIRQ(WDT_IRQn);
okini3939 0:766ef51c9b11 32 }
okini3939 0:766ef51c9b11 33
okini3939 0:766ef51c9b11 34 void PowerDown () {
okini3939 0:766ef51c9b11 35 LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
okini3939 0:766ef51c9b11 36 LPC_PMU->PCON = (2<<0);
okini3939 0:766ef51c9b11 37 SCB->SCR |= (1<<2);
okini3939 0:766ef51c9b11 38 __WFI();
okini3939 0:766ef51c9b11 39 }
okini3939 0:766ef51c9b11 40
okini3939 0:766ef51c9b11 41 void DeepSleep () {
okini3939 0:766ef51c9b11 42 LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
okini3939 0:766ef51c9b11 43 LPC_PMU->PCON = (1<<0);
okini3939 0:766ef51c9b11 44 SCB->SCR |= (1<<2);
okini3939 0:766ef51c9b11 45 __WFI();
okini3939 0:766ef51c9b11 46 }
okini3939 0:766ef51c9b11 47
okini3939 0:766ef51c9b11 48 void Sleep () {
okini3939 0:766ef51c9b11 49 LPC_PMU->PCON = 0;
okini3939 0:766ef51c9b11 50 SCB->SCR &= ~(1<<2);
okini3939 0:766ef51c9b11 51 __WFI();
okini3939 0:766ef51c9b11 52 }
okini3939 0:766ef51c9b11 53
okini3939 0:766ef51c9b11 54 int main() {
okini3939 0:766ef51c9b11 55 int i;
okini3939 0:766ef51c9b11 56
okini3939 0:766ef51c9b11 57 pc.baud(9600);
okini3939 0:766ef51c9b11 58 pc.printf("low power\r\n");
okini3939 0:766ef51c9b11 59
okini3939 0:766ef51c9b11 60 for (i = 0; i < 6; i ++) {
okini3939 0:766ef51c9b11 61 led1 = !led1;
okini3939 0:766ef51c9b11 62 wait(0.2);
okini3939 0:766ef51c9b11 63 }
okini3939 0:766ef51c9b11 64
okini3939 0:766ef51c9b11 65 for (;;) {
okini3939 0:766ef51c9b11 66
okini3939 0:766ef51c9b11 67 pc.printf("enter sleep\r\n");
okini3939 0:766ef51c9b11 68 wait_ms(10);
okini3939 0:766ef51c9b11 69
okini3939 0:766ef51c9b11 70 initWDT(1);
okini3939 0:766ef51c9b11 71 wait_ms(10);
okini3939 0:766ef51c9b11 72 // Sleep();
okini3939 0:766ef51c9b11 73 DeepSleep();
okini3939 0:766ef51c9b11 74 // PowerDown();
okini3939 0:766ef51c9b11 75
okini3939 0:766ef51c9b11 76 pc.printf("wake up\r\n");
okini3939 0:766ef51c9b11 77 for (i = 0; i < 6; i ++) {
okini3939 0:766ef51c9b11 78 led1 = !led1;
okini3939 0:766ef51c9b11 79 wait(0.2);
okini3939 0:766ef51c9b11 80 }
okini3939 0:766ef51c9b11 81
okini3939 0:766ef51c9b11 82 for (;;);
okini3939 0:766ef51c9b11 83
okini3939 0:766ef51c9b11 84 }
okini3939 0:766ef51c9b11 85 }