a

Dependencies:   mbed

Fork of DeepSleep-m0 by Suga koubou

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 GINT1_IRQHandler(void) {
00009     LPC_GPIO_GROUP_INT1->CTRL |= (1<<0);
00010     NVIC_ClearPendingIRQ(GINT0_IRQn);
00011 }
00012 
00013 void initStartLogic (unsigned int p0, unsigned int p1) {
00014     LPC_SYSCON->SYSAHBCLKCTRL |= (1<<24);
00015     LPC_GPIO_GROUP_INT1->PORT_POL[0] = 0;
00016     LPC_GPIO_GROUP_INT1->PORT_POL[1] = 0;
00017     LPC_GPIO_GROUP_INT1->PORT_ENA[0] = p0;
00018     LPC_GPIO_GROUP_INT1->PORT_ENA[1] = p1;
00019     LPC_GPIO_GROUP_INT1->CTRL = 0; // Edge, OR, INT
00020 
00021     LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
00022 
00023     LPC_SYSCON->STARTERP1 = (1<<21); // start logic GROUP1
00024     NVIC_ClearPendingIRQ(GINT1_IRQn);
00025     NVIC_EnableIRQ(GINT1_IRQn);
00026 }
00027 
00028 unsigned int setSystemMainClock(unsigned short S) {
00029     LPC_SYSCON->MAINCLKSEL    = S;     /* Select PLL Clock Output  */
00030     LPC_SYSCON->MAINCLKUEN    = 0x01;               /* Update MCLK Clock Source */
00031     LPC_SYSCON->MAINCLKUEN    = 0x00;               /* Toggle Update Register   */
00032     LPC_SYSCON->MAINCLKUEN    = 0x01;
00033     while (!(LPC_SYSCON->MAINCLKUEN & 0x01));       /* Wait Until Updated       */
00034 
00035     SystemCoreClockUpdate();
00036     return SystemCoreClock;
00037 }
00038 
00039 unsigned int setSystemFrequency(unsigned short M, unsigned short P) {
00040     LPC_SYSCON->SYSPLLCTRL = ((P & 0x03)<<5) | (M & 0x1f);
00041     while (!(LPC_SYSCON->SYSPLLSTAT & 0x01)); // Wait Until PLL Locked
00042     SystemCoreClockUpdate();
00043     return SystemCoreClock;
00044 }
00045 
00046 void PowerDown () {
00047     LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
00048     LPC_PMU->PCON = (2<<0);
00049     SCB->SCR |= (1<<2);
00050     __WFI();
00051 }
00052 
00053 void DeepSleep () {
00054     LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
00055     LPC_PMU->PCON = (1<<0);
00056     SCB->SCR |= (1<<2);
00057     __WFI();
00058 }
00059 
00060 void Sleep () {
00061     LPC_PMU->PCON = 0;
00062     SCB->SCR &= ~(1<<2);
00063     __WFI();
00064 }
00065 
00066 int main() {
00067     int i;
00068 
00069 //    setSystemFrequency(3, 1); // M, P, 48MHz
00070 //    setSystemFrequency(1, 2); // M, P, 24MHz
00071 
00072     LPC_GPIO->SET[1] = (1<<26);
00073     LPC_GPIO->DIR[1] |= (1<<26);
00074 
00075     pc.baud(9600);
00076     pc.printf("low power\r\n");
00077 
00078     for (i = 0; i < 6; i ++) {
00079         led1 = !led1;
00080         wait(0.2);
00081     }
00082 
00083     initStartLogic((1<<22)|(1<<1), 0); // p20(P0.22), ISP(P0.1)
00084 
00085     for (;;) {
00086     
00087         pc.printf("enter sleep\r\n");
00088         wait_ms(10);
00089 
00090         setSystemMainClock(0); // IRC clock
00091         LPC_GPIO->CLR[1] = (1<<26);
00092 //        Sleep();
00093 //        DeepSleep();
00094         PowerDown();
00095 
00096         LPC_GPIO->SET[1] = (1<<26);
00097         setSystemMainClock(3); // PLL clock
00098 
00099         pc.printf("wake up\r\n");
00100         for (i = 0; i < 6; i ++) {
00101             led1 = !led1;
00102             wait(0.2);
00103         }
00104 
00105         for (;;);
00106 
00107     }
00108 }