deep sleep and wake-up. WDT interrupt sample. see: http://mbed.org/users/okini3939/notebook/low-power-m0/
main.cpp@0:766ef51c9b11, 2014-07-08 (annotated)
- Committer:
- okini3939
- Date:
- Tue Jul 08 05:57:10 2014 +0000
- Revision:
- 0:766ef51c9b11
1st build
Who changed what in which revision?
User | Revision | Line number | New 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 | } |