yoshi kuwae yoshi
/
DeepSleep-m0
a
Fork of DeepSleep-m0 by
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Thu Jul 21 2022 14:09:38 by 1.7.2