Same as ECE4180Lab1Part2 but with Power Management added. Turns off unused interfaces on mbed (including usb interface, so must be powered externally)
Dependencies: PowerControl mbed
main.cpp@0:da73efbce5d9, 2016-01-31 (annotated)
- Committer:
- wschon
- Date:
- Sun Jan 31 21:05:09 2016 +0000
- Revision:
- 0:da73efbce5d9
Same as ECE4180Lab1Part2 but with Power Management added
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wschon | 0:da73efbce5d9 | 1 | #include "mbed.h" |
wschon | 0:da73efbce5d9 | 2 | #include "PowerControl/PowerControl.h" |
wschon | 0:da73efbce5d9 | 3 | #include "PowerControl/EthernetPowerControl.h" |
wschon | 0:da73efbce5d9 | 4 | |
wschon | 0:da73efbce5d9 | 5 | PwmOut myled(p21); |
wschon | 0:da73efbce5d9 | 6 | DigitalIn button1(p30); |
wschon | 0:da73efbce5d9 | 7 | DigitalIn button2(p29); |
wschon | 0:da73efbce5d9 | 8 | DigitalIn switch1(p8); |
wschon | 0:da73efbce5d9 | 9 | DigitalOut myled4(LED4); |
wschon | 0:da73efbce5d9 | 10 | DigitalOut myled3(LED3); |
wschon | 0:da73efbce5d9 | 11 | float intensity = 0.5f; |
wschon | 0:da73efbce5d9 | 12 | |
wschon | 0:da73efbce5d9 | 13 | // Function to power down magic USB interface chip with new firmware |
wschon | 0:da73efbce5d9 | 14 | #define USR_POWERDOWN (0x104) |
wschon | 0:da73efbce5d9 | 15 | int semihost_powerdown() { |
wschon | 0:da73efbce5d9 | 16 | uint32_t arg; |
wschon | 0:da73efbce5d9 | 17 | return __semihost(USR_POWERDOWN, &arg); |
wschon | 0:da73efbce5d9 | 18 | } |
wschon | 0:da73efbce5d9 | 19 | |
wschon | 0:da73efbce5d9 | 20 | class Watchdog { |
wschon | 0:da73efbce5d9 | 21 | public: |
wschon | 0:da73efbce5d9 | 22 | // Load timeout value in watchdog timer and enable |
wschon | 0:da73efbce5d9 | 23 | void kick(float s) { |
wschon | 0:da73efbce5d9 | 24 | LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK |
wschon | 0:da73efbce5d9 | 25 | uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 |
wschon | 0:da73efbce5d9 | 26 | LPC_WDT->WDTC = s * (float)clk; |
wschon | 0:da73efbce5d9 | 27 | LPC_WDT->WDMOD = 0x3; // Enabled and Reset |
wschon | 0:da73efbce5d9 | 28 | kick(); |
wschon | 0:da73efbce5d9 | 29 | } |
wschon | 0:da73efbce5d9 | 30 | // "kick" or "feed" the dog - reset the watchdog timer |
wschon | 0:da73efbce5d9 | 31 | // by writing this required bit pattern |
wschon | 0:da73efbce5d9 | 32 | void kick() { |
wschon | 0:da73efbce5d9 | 33 | LPC_WDT->WDFEED = 0xAA; |
wschon | 0:da73efbce5d9 | 34 | LPC_WDT->WDFEED = 0x55; |
wschon | 0:da73efbce5d9 | 35 | } |
wschon | 0:da73efbce5d9 | 36 | }; |
wschon | 0:da73efbce5d9 | 37 | |
wschon | 0:da73efbce5d9 | 38 | // Setup the watchdog timer |
wschon | 0:da73efbce5d9 | 39 | Watchdog wdt; |
wschon | 0:da73efbce5d9 | 40 | |
wschon | 0:da73efbce5d9 | 41 | |
wschon | 0:da73efbce5d9 | 42 | int main() { |
wschon | 0:da73efbce5d9 | 43 | PHY_PowerDown(); //Power down Ethernet interface |
wschon | 0:da73efbce5d9 | 44 | int result; |
wschon | 0:da73efbce5d9 | 45 | result = semihost_powerdown(); //Power down USB interface |
wschon | 0:da73efbce5d9 | 46 | int count = 0; |
wschon | 0:da73efbce5d9 | 47 | Peripheral_PowerDown(0xFFFF7FFF); |
wschon | 0:da73efbce5d9 | 48 | |
wschon | 0:da73efbce5d9 | 49 | wdt.kick(4.0); |
wschon | 0:da73efbce5d9 | 50 | if ((LPC_WDT->WDMOD >> 2) & 1) |
wschon | 0:da73efbce5d9 | 51 | myled4 = 1; else myled3 = 1; |
wschon | 0:da73efbce5d9 | 52 | wait(2); |
wschon | 0:da73efbce5d9 | 53 | myled4 = 0; |
wschon | 0:da73efbce5d9 | 54 | myled3 = 0; |
wschon | 0:da73efbce5d9 | 55 | |
wschon | 0:da73efbce5d9 | 56 | |
wschon | 0:da73efbce5d9 | 57 | |
wschon | 0:da73efbce5d9 | 58 | while(1) { |
wschon | 0:da73efbce5d9 | 59 | if (button1 == 0) { |
wschon | 0:da73efbce5d9 | 60 | if (intensity <= 1.0f) { |
wschon | 0:da73efbce5d9 | 61 | intensity += 0.07f; |
wschon | 0:da73efbce5d9 | 62 | } |
wschon | 0:da73efbce5d9 | 63 | } |
wschon | 0:da73efbce5d9 | 64 | if (button2 == 0) { |
wschon | 0:da73efbce5d9 | 65 | if (intensity >= 0.0f) { |
wschon | 0:da73efbce5d9 | 66 | intensity -= 0.07f; |
wschon | 0:da73efbce5d9 | 67 | } |
wschon | 0:da73efbce5d9 | 68 | } |
wschon | 0:da73efbce5d9 | 69 | if (switch1 == 0) { |
wschon | 0:da73efbce5d9 | 70 | myled = intensity; |
wschon | 0:da73efbce5d9 | 71 | } |
wschon | 0:da73efbce5d9 | 72 | else { |
wschon | 0:da73efbce5d9 | 73 | myled = 0.0f; |
wschon | 0:da73efbce5d9 | 74 | } |
wschon | 0:da73efbce5d9 | 75 | wait(0.1); |
wschon | 0:da73efbce5d9 | 76 | count++; |
wschon | 0:da73efbce5d9 | 77 | if (count == 80) { |
wschon | 0:da73efbce5d9 | 78 | wait(11); |
wschon | 0:da73efbce5d9 | 79 | } |
wschon | 0:da73efbce5d9 | 80 | wdt.kick(); //kick the watchdog timer |
wschon | 0:da73efbce5d9 | 81 | } |
wschon | 0:da73efbce5d9 | 82 | } |