ok

Dependencies:   LPC1114_WakeInterruptIn

Fork of WakeUp by Erik -

Committer:
wataloh
Date:
Tue Jan 24 08:59:30 2017 +0000
Revision:
23:3f73219d6a4e
Parent:
10:c41bc9154a7c
ok

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wataloh 23:3f73219d6a4e 1 #ifndef _HARDWARE_WAKE_UP_H_
wataloh 23:3f73219d6a4e 2 #define _HARDWARE_WAKE_UP_H_
wataloh 23:3f73219d6a4e 3
Sissors 0:fc439458a359 4 #include "mbed.h"
Sissors 0:fc439458a359 5
Sissors 0:fc439458a359 6 /**
Sissors 8:8d9a6ac0fba8 7 * Class to make wake up a microcontroller from deepsleep using a low-power timer.
Sissors 8:8d9a6ac0fba8 8 *
Sissors 8:8d9a6ac0fba8 9 * @code
Sissors 8:8d9a6ac0fba8 10 * // Depending on the LED connections either the LED is off the 2 seconds
Sissors 8:8d9a6ac0fba8 11 * // the target spends in deepsleep(), and on for the other second. Or it is inverted
Sissors 8:8d9a6ac0fba8 12 *
Sissors 8:8d9a6ac0fba8 13 * #include "mbed.h"
Sissors 8:8d9a6ac0fba8 14 * #include "WakeUp.h"
Sissors 8:8d9a6ac0fba8 15 *
Sissors 8:8d9a6ac0fba8 16 * DigitalOut myled(LED1);
Sissors 8:8d9a6ac0fba8 17 *
Sissors 8:8d9a6ac0fba8 18 * int main() {
Sissors 10:c41bc9154a7c 19 * wait(5);
Sissors 10:c41bc9154a7c 20 *
Sissors 8:8d9a6ac0fba8 21 * //The low-power oscillator can be quite inaccurate on some targets
Sissors 8:8d9a6ac0fba8 22 * //this function calibrates it against the main clock
Sissors 8:8d9a6ac0fba8 23 * WakeUp::calibrate();
Sissors 8:8d9a6ac0fba8 24 *
Sissors 8:8d9a6ac0fba8 25 * while(1) {
Sissors 8:8d9a6ac0fba8 26 * //Set LED to zero
Sissors 8:8d9a6ac0fba8 27 * myled = 0;
Sissors 8:8d9a6ac0fba8 28 *
Sissors 8:8d9a6ac0fba8 29 * //Set wakeup time for 2 seconds
Sissors 8:8d9a6ac0fba8 30 * WakeUp::set_ms(2000);
Sissors 8:8d9a6ac0fba8 31 *
Sissors 8:8d9a6ac0fba8 32 * //Enter deepsleep, the program won't go beyond this point until it is woken up
Sissors 8:8d9a6ac0fba8 33 * deepsleep();
Sissors 8:8d9a6ac0fba8 34 *
Sissors 8:8d9a6ac0fba8 35 * //Set LED for 1 second to one
Sissors 8:8d9a6ac0fba8 36 * myled = 1;
Sissors 8:8d9a6ac0fba8 37 * wait(1);
Sissors 8:8d9a6ac0fba8 38 * }
Sissors 8:8d9a6ac0fba8 39 * }
Sissors 8:8d9a6ac0fba8 40 * @endcode
Sissors 8:8d9a6ac0fba8 41 */
Sissors 0:fc439458a359 42 class WakeUp
Sissors 0:fc439458a359 43 {
Sissors 0:fc439458a359 44 public:
Sissors 0:fc439458a359 45 /**
Sissors 0:fc439458a359 46 * Set the timeout
Sissors 0:fc439458a359 47 *
Sissors 8:8d9a6ac0fba8 48 * @param s required time in seconds
Sissors 0:fc439458a359 49 */
Sissors 0:fc439458a359 50 static void set(uint32_t s) {
Sissors 0:fc439458a359 51 set_ms(1000 * s);
Sissors 0:fc439458a359 52 }
Sissors 0:fc439458a359 53
Sissors 0:fc439458a359 54 /**
Sissors 0:fc439458a359 55 * Set the timeout
Sissors 0:fc439458a359 56 *
Sissors 8:8d9a6ac0fba8 57 * @param ms required time in milliseconds
Sissors 0:fc439458a359 58 */
Sissors 0:fc439458a359 59 static void set_ms(uint32_t ms);
Sissors 0:fc439458a359 60
Sissors 0:fc439458a359 61 /**
Sissors 0:fc439458a359 62 * Attach a function to be called after timeout
Sissors 0:fc439458a359 63 *
Sissors 0:fc439458a359 64 * This is optional, if you just want to wake up you
Sissors 0:fc439458a359 65 * do not need to attach a function.
Sissors 0:fc439458a359 66 *
Sissors 8:8d9a6ac0fba8 67 * Important: Many targets will run the wake-up routine
Sissors 8:8d9a6ac0fba8 68 * at reduced clock speed, afterwards clock speed is restored.
Sissors 8:8d9a6ac0fba8 69 * This means that clock speed dependent functions, such as printf
Sissors 8:8d9a6ac0fba8 70 * might end up distorted.
Sissors 8:8d9a6ac0fba8 71 *
Sissors 0:fc439458a359 72 * Also supports normal way to attach member functions
Sissors 0:fc439458a359 73 * (not documented for simplicity)
Sissors 0:fc439458a359 74 *
Sissors 8:8d9a6ac0fba8 75 * @param *function function to call
Sissors 0:fc439458a359 76 */
Sissors 0:fc439458a359 77 static void attach(void (*function)(void)) {
Sissors 0:fc439458a359 78 callback.attach(function);
Sissors 0:fc439458a359 79 }
Sissors 0:fc439458a359 80
Sissors 0:fc439458a359 81 template<typename T>
Sissors 0:fc439458a359 82 static void attach(T *object, void (T::*member)(void)) {
Sissors 0:fc439458a359 83 callback.attach(object, member);
Sissors 0:fc439458a359 84 }
Sissors 0:fc439458a359 85
Sissors 0:fc439458a359 86 /**
Sissors 0:fc439458a359 87 * Calibrate the timer
Sissors 0:fc439458a359 88 *
Sissors 8:8d9a6ac0fba8 89 * Some of the low-power timers have very bad accuracy.
Sissors 8:8d9a6ac0fba8 90 * This function calibrates it against the main timer.
Sissors 0:fc439458a359 91 *
Sissors 0:fc439458a359 92 * Warning: Blocks for 100ms!
Sissors 0:fc439458a359 93 */
Sissors 0:fc439458a359 94 static void calibrate(void);
Sissors 0:fc439458a359 95
Sissors 0:fc439458a359 96
Sissors 0:fc439458a359 97 private:
Sissors 0:fc439458a359 98 static FunctionPointer callback;
Sissors 0:fc439458a359 99 static void irq_handler(void);
Sissors 0:fc439458a359 100 static float cycles_per_ms;
wataloh 23:3f73219d6a4e 101 };
wataloh 23:3f73219d6a4e 102
wataloh 23:3f73219d6a4e 103 #endif //_HARDWARE_WAKE_UP_H_