This is the code used on my video series "Hybrid Supercapacitor Car Battery" for my own hardware monitoring system. THe videos can be found on madelectronengineering.com
Dependencies: BurstSPI Fonts INA219 mbed LPC1114_WakeInterruptIn
Fork of SharpMemoryLCD by
WakeUp.h@2:0c49a8f32f6e, 2017-12-26 (annotated)
- Committer:
- madelectroneng
- Date:
- Tue Dec 26 21:30:09 2017 +0000
- Revision:
- 2:0c49a8f32f6e
Inital setup
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
madelectroneng | 2:0c49a8f32f6e | 1 | #include "mbed.h" |
madelectroneng | 2:0c49a8f32f6e | 2 | |
madelectroneng | 2:0c49a8f32f6e | 3 | /** |
madelectroneng | 2:0c49a8f32f6e | 4 | * Class to make wake up a microcontroller from deepsleep using a low-power timer. |
madelectroneng | 2:0c49a8f32f6e | 5 | * |
madelectroneng | 2:0c49a8f32f6e | 6 | * @code |
madelectroneng | 2:0c49a8f32f6e | 7 | * // Depending on the LED connections either the LED is off the 2 seconds |
madelectroneng | 2:0c49a8f32f6e | 8 | * // the target spends in deepsleep(), and on for the other second. Or it is inverted |
madelectroneng | 2:0c49a8f32f6e | 9 | * |
madelectroneng | 2:0c49a8f32f6e | 10 | * #include "mbed.h" |
madelectroneng | 2:0c49a8f32f6e | 11 | * #include "WakeUp.h" |
madelectroneng | 2:0c49a8f32f6e | 12 | * |
madelectroneng | 2:0c49a8f32f6e | 13 | * DigitalOut myled(LED1); |
madelectroneng | 2:0c49a8f32f6e | 14 | * |
madelectroneng | 2:0c49a8f32f6e | 15 | * int main() { |
madelectroneng | 2:0c49a8f32f6e | 16 | * wait(5); |
madelectroneng | 2:0c49a8f32f6e | 17 | * |
madelectroneng | 2:0c49a8f32f6e | 18 | * //The low-power oscillator can be quite inaccurate on some targets |
madelectroneng | 2:0c49a8f32f6e | 19 | * //this function calibrates it against the main clock |
madelectroneng | 2:0c49a8f32f6e | 20 | * WakeUp::calibrate(); |
madelectroneng | 2:0c49a8f32f6e | 21 | * |
madelectroneng | 2:0c49a8f32f6e | 22 | * while(1) { |
madelectroneng | 2:0c49a8f32f6e | 23 | * //Set LED to zero |
madelectroneng | 2:0c49a8f32f6e | 24 | * myled = 0; |
madelectroneng | 2:0c49a8f32f6e | 25 | * |
madelectroneng | 2:0c49a8f32f6e | 26 | * //Set wakeup time for 2 seconds |
madelectroneng | 2:0c49a8f32f6e | 27 | * WakeUp::set_ms(2000); |
madelectroneng | 2:0c49a8f32f6e | 28 | * |
madelectroneng | 2:0c49a8f32f6e | 29 | * //Enter deepsleep, the program won't go beyond this point until it is woken up |
madelectroneng | 2:0c49a8f32f6e | 30 | * deepsleep(); |
madelectroneng | 2:0c49a8f32f6e | 31 | * |
madelectroneng | 2:0c49a8f32f6e | 32 | * //Set LED for 1 second to one |
madelectroneng | 2:0c49a8f32f6e | 33 | * myled = 1; |
madelectroneng | 2:0c49a8f32f6e | 34 | * wait(1); |
madelectroneng | 2:0c49a8f32f6e | 35 | * } |
madelectroneng | 2:0c49a8f32f6e | 36 | * } |
madelectroneng | 2:0c49a8f32f6e | 37 | * @endcode |
madelectroneng | 2:0c49a8f32f6e | 38 | */ |
madelectroneng | 2:0c49a8f32f6e | 39 | class WakeUp |
madelectroneng | 2:0c49a8f32f6e | 40 | { |
madelectroneng | 2:0c49a8f32f6e | 41 | public: |
madelectroneng | 2:0c49a8f32f6e | 42 | /** |
madelectroneng | 2:0c49a8f32f6e | 43 | * Set the timeout |
madelectroneng | 2:0c49a8f32f6e | 44 | * |
madelectroneng | 2:0c49a8f32f6e | 45 | * @param s required time in seconds |
madelectroneng | 2:0c49a8f32f6e | 46 | */ |
madelectroneng | 2:0c49a8f32f6e | 47 | static void set(uint32_t s) { |
madelectroneng | 2:0c49a8f32f6e | 48 | set_ms(1000 * s); |
madelectroneng | 2:0c49a8f32f6e | 49 | } |
madelectroneng | 2:0c49a8f32f6e | 50 | |
madelectroneng | 2:0c49a8f32f6e | 51 | /** |
madelectroneng | 2:0c49a8f32f6e | 52 | * Set the timeout |
madelectroneng | 2:0c49a8f32f6e | 53 | * |
madelectroneng | 2:0c49a8f32f6e | 54 | * @param ms required time in milliseconds |
madelectroneng | 2:0c49a8f32f6e | 55 | */ |
madelectroneng | 2:0c49a8f32f6e | 56 | static void set_ms(uint32_t ms); |
madelectroneng | 2:0c49a8f32f6e | 57 | |
madelectroneng | 2:0c49a8f32f6e | 58 | /** |
madelectroneng | 2:0c49a8f32f6e | 59 | * Attach a function to be called after timeout |
madelectroneng | 2:0c49a8f32f6e | 60 | * |
madelectroneng | 2:0c49a8f32f6e | 61 | * This is optional, if you just want to wake up you |
madelectroneng | 2:0c49a8f32f6e | 62 | * do not need to attach a function. |
madelectroneng | 2:0c49a8f32f6e | 63 | * |
madelectroneng | 2:0c49a8f32f6e | 64 | * Important: Many targets will run the wake-up routine |
madelectroneng | 2:0c49a8f32f6e | 65 | * at reduced clock speed, afterwards clock speed is restored. |
madelectroneng | 2:0c49a8f32f6e | 66 | * This means that clock speed dependent functions, such as printf |
madelectroneng | 2:0c49a8f32f6e | 67 | * might end up distorted. |
madelectroneng | 2:0c49a8f32f6e | 68 | * |
madelectroneng | 2:0c49a8f32f6e | 69 | * @code |
madelectroneng | 2:0c49a8f32f6e | 70 | * // Attaching regular function |
madelectroneng | 2:0c49a8f32f6e | 71 | * WakeUp::attach(&yourFunc); |
madelectroneng | 2:0c49a8f32f6e | 72 | * // Attaching member function inside another library |
madelectroneng | 2:0c49a8f32f6e | 73 | * WakeUp::attach(callback(this, &YourLib::yourLibFunction)); |
madelectroneng | 2:0c49a8f32f6e | 74 | * @endcode |
madelectroneng | 2:0c49a8f32f6e | 75 | * |
madelectroneng | 2:0c49a8f32f6e | 76 | * It uses the new Callback system to attach functions. |
madelectroneng | 2:0c49a8f32f6e | 77 | * |
madelectroneng | 2:0c49a8f32f6e | 78 | * @param *function function to call |
madelectroneng | 2:0c49a8f32f6e | 79 | */ |
madelectroneng | 2:0c49a8f32f6e | 80 | static void attach(Callback<void()> function) { |
madelectroneng | 2:0c49a8f32f6e | 81 | callback = function; |
madelectroneng | 2:0c49a8f32f6e | 82 | } |
madelectroneng | 2:0c49a8f32f6e | 83 | |
madelectroneng | 2:0c49a8f32f6e | 84 | /** |
madelectroneng | 2:0c49a8f32f6e | 85 | * Calibrate the timer |
madelectroneng | 2:0c49a8f32f6e | 86 | * |
madelectroneng | 2:0c49a8f32f6e | 87 | * Some of the low-power timers have very bad accuracy. |
madelectroneng | 2:0c49a8f32f6e | 88 | * This function calibrates it against the main timer. |
madelectroneng | 2:0c49a8f32f6e | 89 | * |
madelectroneng | 2:0c49a8f32f6e | 90 | * Warning: Blocks for 100ms! |
madelectroneng | 2:0c49a8f32f6e | 91 | */ |
madelectroneng | 2:0c49a8f32f6e | 92 | static void calibrate(void); |
madelectroneng | 2:0c49a8f32f6e | 93 | |
madelectroneng | 2:0c49a8f32f6e | 94 | /** |
madelectroneng | 2:0c49a8f32f6e | 95 | * Enter Standby mode then Reset |
madelectroneng | 2:0c49a8f32f6e | 96 | * (available only for confirmed Nucleo boards) |
madelectroneng | 2:0c49a8f32f6e | 97 | * |
madelectroneng | 2:0c49a8f32f6e | 98 | * @param ms required time in milliseconds |
madelectroneng | 2:0c49a8f32f6e | 99 | */ |
madelectroneng | 2:0c49a8f32f6e | 100 | #if defined(TARGET_NUCLEO_F446RE) || defined(TARGET_NUCLEO_F411RE)\ |
madelectroneng | 2:0c49a8f32f6e | 101 | || defined(TARGET_NUCLEO_F401RE)\ |
madelectroneng | 2:0c49a8f32f6e | 102 | || defined(TARGET_NUCLEO_L152RE) || defined(TARGET_NUCLEO_L073RZ)\ |
madelectroneng | 2:0c49a8f32f6e | 103 | || defined(TARGET_NUCLEO_L053R8) |
madelectroneng | 2:0c49a8f32f6e | 104 | // added by JH1PJL 2017-9-21 |
madelectroneng | 2:0c49a8f32f6e | 105 | static void standby_then_reset(uint32_t ms); |
madelectroneng | 2:0c49a8f32f6e | 106 | |
madelectroneng | 2:0c49a8f32f6e | 107 | #endif |
madelectroneng | 2:0c49a8f32f6e | 108 | |
madelectroneng | 2:0c49a8f32f6e | 109 | private: |
madelectroneng | 2:0c49a8f32f6e | 110 | static Callback<void()> callback; |
madelectroneng | 2:0c49a8f32f6e | 111 | static void irq_handler(void); |
madelectroneng | 2:0c49a8f32f6e | 112 | static float cycles_per_ms; |
madelectroneng | 2:0c49a8f32f6e | 113 | static bool use_reset; // added by JH1PJL 2017-9-21 |
madelectroneng | 2:0c49a8f32f6e | 114 | }; |