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 Paul Staron

Committer:
madelectroneng
Date:
Tue Dec 26 21:30:09 2017 +0000
Revision:
2:0c49a8f32f6e
Inital setup

Who changed what in which revision?

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