deep sleep and wake-up. GPIO group interrupt, start logic sample see: http://mbed.org/users/okini3939/notebook/low-power-m0/

Dependencies:   mbed

Revision:
2:5412d5b8242c
Parent:
1:d676ec86101e
--- a/main.cpp	Mon Oct 15 15:06:04 2012 +0000
+++ b/main.cpp	Mon Jun 10 02:13:58 2013 +0000
@@ -1,9 +1,8 @@
 #include "mbed.h"
 
-DigitalOut myled(LED1);
+DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
 
-Serial pc(p9, p10);
-
+Serial pc(USBTX, USBRX);
 
 extern "C"
 void GINT1_IRQHandler(void) {
@@ -27,22 +26,12 @@
 }
 
 unsigned int setSystemMainClock(unsigned short S) {
-    
-    if ((S & 0x03) == 3) {
-        LPC_SYSCON->PDRUNCFG     &= ~(1 << 5);          /* Power-up System Osc      */
-        for (int i = 0; i < 200; i++) __NOP();
-    }
-    
     LPC_SYSCON->MAINCLKSEL    = S;     /* Select PLL Clock Output  */
     LPC_SYSCON->MAINCLKUEN    = 0x01;               /* Update MCLK Clock Source */
     LPC_SYSCON->MAINCLKUEN    = 0x00;               /* Toggle Update Register   */
     LPC_SYSCON->MAINCLKUEN    = 0x01;
     while (!(LPC_SYSCON->MAINCLKUEN & 0x01));       /* Wait Until Updated       */
 
-    if ((S & 0x03) == 0) {
-        LPC_SYSCON->PDRUNCFG     |= (1 << 5);          /* Power-down System Osc      */
-    }
-
     SystemCoreClockUpdate();
     return SystemCoreClock;
 }
@@ -54,12 +43,22 @@
     return SystemCoreClock;
 }
 
+void PowerDown () {
+    LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
+    LPC_PMU->PCON = (2<<0);
+    SCB->SCR |= (1<<2);
+    __WFI();
+}
+
 void DeepSleep () {
+    LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
+    LPC_PMU->PCON = (1<<0);
     SCB->SCR |= (1<<2);
     __WFI();
 }
 
 void Sleep () {
+    LPC_PMU->PCON = 0;
     SCB->SCR &= ~(1<<2);
     __WFI();
 }
@@ -68,32 +67,42 @@
     int i;
 
 //    setSystemFrequency(3, 1); // M, P, 48MHz
+//    setSystemFrequency(1, 2); // M, P, 24MHz
+
+    LPC_GPIO->SET[1] = (1<<26);
+    LPC_GPIO->DIR[1] |= (1<<26);
 
     pc.baud(9600);
     pc.printf("low power\r\n");
 
     for (i = 0; i < 6; i ++) {
-        myled = !myled;
-        wait(0.5);
+        led1 = !led1;
+        wait(0.2);
     }
 
-    initStartLogic((1<<8)|(1<<1), 0);
+    initStartLogic((1<<22)|(1<<1), 0); // p20(P0.22), ISP(P0.1)
 
     for (;;) {
     
         pc.printf("enter sleep\r\n");
         wait_ms(10);
-        setSystemMainClock(0);
 
-        DeepSleep();
+        setSystemMainClock(0); // IRC clock
+        LPC_GPIO->CLR[1] = (1<<26);
+//        Sleep();
+//        DeepSleep();
+        PowerDown();
 
-        setSystemMainClock(3);
+        LPC_GPIO->SET[1] = (1<<26);
+        setSystemMainClock(3); // PLL clock
 
         pc.printf("wake up\r\n");
         for (i = 0; i < 6; i ++) {
-            myled = !myled;
-            wait(0.5);
+            led1 = !led1;
+            wait(0.2);
         }
 
+        for (;;);
+
     }
 }