Class similar to InterruptIn which allows the LPC1114 to wake from deepsleep. (For other targets you can use InterruptIn).
Dependents: WakeUp WakeUp WakeUp WakeUp ... more
Diff: WakeInterruptIn.h
- Revision:
- 0:d726461bd0af
- Child:
- 1:128f3fe79240
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WakeInterruptIn.h Sat Jul 26 15:02:43 2014 +0000 @@ -0,0 +1,116 @@ +/* +Most mbed targets can be woken up from deepsleep by regular InterruptIn. +On the LPC1114 this has to be done by different interrupts. This +simple library helps with that +*/ + +#include "mbed.h" +#define NUM_CHANNEL 13 + +/** Class to wake LPC1114 from deepsleep +* +* Use like regular InterruptIn, it works not only +* to wake up from sleep but also just like InterruptIn. +* Only you can NOT attach both rising and falling edge interrupts. +*/ +class WakeInterruptIn : DigitalIn { + public: + + /** Constructor + * + * Pins which are allowed are all pins from Port 0 and P1_0 + * + * @param pin Pin to use as WakeInterruptIn pin + */ + WakeInterruptIn(PinName pin); + + ~WakeInterruptIn() { + disable(); + objects[channel] = NULL; + } + + /* Attach rising edge interrupt + * + * Attaching a member function can be done the regular way too + * + * @argument fptr Pointer to function to call, NULL to disable interrupt + */ + void rise(void (*fptr)(void)) { + fpointer.attach(fptr); + LPC_SYSCON->STARTAPRP0 |= (1 << channel); + if (fptr == NULL) + disable(); + else + enable(); + } + template<typename T> + void rise(T* tptr, void (T::*mptr)(void)) { + fpointer.attach(tptr, mptr); + LPC_SYSCON->STARTAPRP0 |= (1 << channel); + if (fptr == NULL) + disable(); + else + enable(); + } + + /* Attach falling edge interrupt + * + * Attaching a member function can be done the regular way too + * + * @argument fptr Pointer to function to call, NULL to disable interrupt + */ + void fall(void (*fptr)(void)) { + fpointer.attach(fptr); + LPC_SYSCON->STARTAPRP0 &= ~(1 << channel); + if (fptr == NULL) + disable(); + else + enable(); + } + template<typename T> + void fall(T* tptr, void (T::*mptr)(void)) { + fpointer.attach(tptr, mptr); + LPC_SYSCON->STARTAPRP0 &= ~(1 << channel); + if (fptr == NULL) + disable(); + else + enable(); + } + + + + private: + uint8_t channel; + FunctionPointer fpointer; + + void enable(void) { + LPC_SYSCON->STARTERP0 |= (1 << channel); + NVIC_EnableIRQ((IRQn_Type)channel); + } + + void disable(void) { + LPC_SYSCON->STARTERP0 &= ~(1 << channel); + NVIC_DisableIRQ((IRQn_Type)channel); + } + + void handle( void ) { + LPC_SYSCON->STARTRSRP0CLR = 1 << channel; + fpointer.call(); + } + + static WakeInterruptIn* objects[NUM_CHANNEL]; + static void handler0(void) { objects[0]->handle(); } + static void handler1(void) { objects[1]->handle(); } + static void handler2(void) { objects[2]->handle(); } + static void handler3(void) { objects[3]->handle(); } + static void handler4(void) { objects[4]->handle(); } + static void handler5(void) { objects[5]->handle(); } + static void handler6(void) { objects[6]->handle(); } + static void handler7(void) { objects[7]->handle(); } + static void handler8(void) { objects[8]->handle(); } + static void handler9(void) { objects[9]->handle(); } + static void handler10(void) { objects[10]->handle(); } + static void handler11(void) { objects[11]->handle(); } + static void handler12(void) { objects[12]->handle(); } + +}; \ No newline at end of file