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

Dependencies:   mbed

Revision:
0:ae90ac40c518
Child:
1:d676ec86101e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Oct 15 05:07:10 2012 +0000
@@ -0,0 +1,97 @@
+#include "mbed.h"
+
+DigitalOut myled(LED1);
+
+Serial pc(p9, p10);
+
+void initStartLogic (unsigned int p0, unsigned int p1) {
+    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<24);
+    LPC_GPIO_GROUP_INT1->PORT_POL[0] = 0;
+    LPC_GPIO_GROUP_INT1->PORT_POL[1] = 0;
+    LPC_GPIO_GROUP_INT1->PORT_ENA[0] = p0;
+    LPC_GPIO_GROUP_INT1->PORT_ENA[1] = p1;
+    LPC_GPIO_GROUP_INT1->CTRL = 0; // Edge, OR, INT
+
+    LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
+
+    LPC_SYSCON->STARTERP1 = (1<<21); // start logic GROUP1
+    NVIC_ClearPendingIRQ(GINT1_IRQn);
+    NVIC_EnableIRQ(GINT1_IRQn);
+}
+
+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;
+}
+
+unsigned int setSystemFrequency(unsigned short M, unsigned short P) {
+    LPC_SYSCON->SYSPLLCTRL = ((P & 0x03)<<5) | (M & 0x1f);
+    while (!(LPC_SYSCON->SYSPLLSTAT & 0x01)); // Wait Until PLL Locked
+    SystemCoreClockUpdate();
+    return SystemCoreClock;
+}
+
+void DeepSleep () {
+    SCB->SCR |= (1<<2);
+    __WFI();
+}
+
+void Sleep () {
+    __WFI();
+}
+
+extern "C"
+void GINT1_IRQHandler(void) {
+    LPC_GPIO_GROUP_INT1->CTRL |= (1<<0);
+    NVIC_ClearPendingIRQ(GINT0_IRQn);
+}
+
+int main() {
+    int i;
+
+//    setSystemFrequency(3, 1); // M, P, 48MHz
+
+    pc.baud(9600);
+    pc.printf("low power\r\n");
+
+    for (i = 0; i < 6; i ++) {
+        myled = !myled;
+        wait(0.5);
+    }
+
+    initStartLogic((1<<8), 0);
+
+loop:
+    pc.printf("enter sleep\r\n");
+    wait_ms(10);
+    setSystemMainClock(0);
+
+    DeepSleep();
+
+    setSystemMainClock(3);
+
+    pc.printf("wake up\r\n");
+    for (i = 0; i < 6; i ++) {
+        myled = !myled;
+        wait(0.5);
+    }
+
+    goto loop;
+
+}