ECE 4180 Lab 1 Extra Credit 3
Dependencies: EthernetPowerControl mbed
main.cpp@0:d6455f342aef, 2018-10-09 (annotated)
- Committer:
- abraha2d
- Date:
- Tue Oct 09 00:15:25 2018 +0000
- Revision:
- 0:d6455f342aef
Save point
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
abraha2d | 0:d6455f342aef | 1 | #include "mbed.h" |
abraha2d | 0:d6455f342aef | 2 | #include "PowerControl/PowerControl.h" |
abraha2d | 0:d6455f342aef | 3 | #include "PowerControl/EthernetPowerControl.h" |
abraha2d | 0:d6455f342aef | 4 | // Need PowerControl *.h files from this URL |
abraha2d | 0:d6455f342aef | 5 | // http://mbed.org/users/no2chem/notebook/mbed-power-controlconsumption/ |
abraha2d | 0:d6455f342aef | 6 | |
abraha2d | 0:d6455f342aef | 7 | // Function to power down magic USB interface chip with new firmware |
abraha2d | 0:d6455f342aef | 8 | #define USR_POWERDOWN (0x104) |
abraha2d | 0:d6455f342aef | 9 | int semihost_powerdown() |
abraha2d | 0:d6455f342aef | 10 | { |
abraha2d | 0:d6455f342aef | 11 | uint32_t arg; |
abraha2d | 0:d6455f342aef | 12 | return __semihost(USR_POWERDOWN, &arg); |
abraha2d | 0:d6455f342aef | 13 | } |
abraha2d | 0:d6455f342aef | 14 | |
abraha2d | 0:d6455f342aef | 15 | DigitalOut myled1(LED1); |
abraha2d | 0:d6455f342aef | 16 | DigitalOut myled2(LED2); |
abraha2d | 0:d6455f342aef | 17 | DigitalOut myled3(LED3); |
abraha2d | 0:d6455f342aef | 18 | DigitalOut myled4(LED4); |
abraha2d | 0:d6455f342aef | 19 | |
abraha2d | 0:d6455f342aef | 20 | Ticker blinker; |
abraha2d | 0:d6455f342aef | 21 | int count=1; |
abraha2d | 0:d6455f342aef | 22 | |
abraha2d | 0:d6455f342aef | 23 | void blink() |
abraha2d | 0:d6455f342aef | 24 | { |
abraha2d | 0:d6455f342aef | 25 | count = count << 1; |
abraha2d | 0:d6455f342aef | 26 | if (count > 0x08) count = 0x01; |
abraha2d | 0:d6455f342aef | 27 | myled1 = count & 0x01; |
abraha2d | 0:d6455f342aef | 28 | myled2 = count & 0x02; |
abraha2d | 0:d6455f342aef | 29 | myled3 = count & 0x04; |
abraha2d | 0:d6455f342aef | 30 | myled4 = count & 0x08; |
abraha2d | 0:d6455f342aef | 31 | } |
abraha2d | 0:d6455f342aef | 32 | |
abraha2d | 0:d6455f342aef | 33 | int main() |
abraha2d | 0:d6455f342aef | 34 | { |
abraha2d | 0:d6455f342aef | 35 | int result; |
abraha2d | 0:d6455f342aef | 36 | // Normal mbed power level for this setup is around 690mW |
abraha2d | 0:d6455f342aef | 37 | // assuming 5V used on Vin pin |
abraha2d | 0:d6455f342aef | 38 | // If you don't need networking... |
abraha2d | 0:d6455f342aef | 39 | // Power down Ethernet interface - saves around 175mW |
abraha2d | 0:d6455f342aef | 40 | // Also need to unplug network cable - just a cable sucks power |
abraha2d | 0:d6455f342aef | 41 | PHY_PowerDown(); |
abraha2d | 0:d6455f342aef | 42 | |
abraha2d | 0:d6455f342aef | 43 | // If you don't need the PC host USB interface.... |
abraha2d | 0:d6455f342aef | 44 | // Power down magic USB interface chip - saves around 150mW |
abraha2d | 0:d6455f342aef | 45 | // Needs new firmware (URL below) and USB cable not connected |
abraha2d | 0:d6455f342aef | 46 | // http://mbed.org/users/simon/notebook/interface-powerdown/ |
abraha2d | 0:d6455f342aef | 47 | // Supply power to mbed using Vin pin |
abraha2d | 0:d6455f342aef | 48 | result = semihost_powerdown(); |
abraha2d | 0:d6455f342aef | 49 | // Power consumption is now around half |
abraha2d | 0:d6455f342aef | 50 | |
abraha2d | 0:d6455f342aef | 51 | // Turn off clock enables on unused I/O Peripherals (UARTs, Timers, PWM, SPI, CAN, I2C, A/D...) |
abraha2d | 0:d6455f342aef | 52 | // To save just a tiny bit more power - most are already off by default in this short code example |
abraha2d | 0:d6455f342aef | 53 | // See PowerControl.h for I/O device bit assignments |
abraha2d | 0:d6455f342aef | 54 | // Don't turn off GPIO - it is needed to blink the LEDs |
abraha2d | 0:d6455f342aef | 55 | Peripheral_PowerDown(0xFF7F7FFF); |
abraha2d | 0:d6455f342aef | 56 | |
abraha2d | 0:d6455f342aef | 57 | // use Ticker interrupt and Sleep instead of a wait for time delay - saves up to 70mW |
abraha2d | 0:d6455f342aef | 58 | // Sleep halts and waits for an interrupt instead of executing instructions |
abraha2d | 0:d6455f342aef | 59 | // power is saved by not constantly fetching and decoding instructions |
abraha2d | 0:d6455f342aef | 60 | // Exact power level reduction depends on the amount of time spent in Sleep mode |
abraha2d | 0:d6455f342aef | 61 | blinker.attach(&blink, 0.0625); |
abraha2d | 0:d6455f342aef | 62 | while (1) { |
abraha2d | 0:d6455f342aef | 63 | Sleep(); |
abraha2d | 0:d6455f342aef | 64 | } |
abraha2d | 0:d6455f342aef | 65 | } |
abraha2d | 0:d6455f342aef | 66 |