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

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?

UserRevisionLine numberNew 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 }