Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of WakeUp by
Revision 11:72db657fc572, committed 2014-07-30
- Comitter:
- Sissors
- Date:
- Wed Jul 30 09:53:58 2014 +0000
- Parent:
- 10:c41bc9154a7c
- Child:
- 12:779d866b8a2d
- Commit message:
- Rewritten pin selection for LPC1114, now can be changed without modifying WakeUp code
Changed in this revision
| Device/WakeUp_LPC11XX.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/Device/WakeUp_LPC11XX.cpp Mon Jul 28 19:46:03 2014 +0000
+++ b/Device/WakeUp_LPC11XX.cpp Wed Jul 30 09:53:58 2014 +0000
@@ -4,23 +4,16 @@
#ifdef TARGET_LPC11XX_11CXX
-//dp1 or dp2 can be chosen
-#define WAKEUP_PIN dp1
-//#define WAKEUP_PIN dp2
-
-#define WAKEUP_MATCH (((WAKEUP_PIN >> PIN_SHIFT) & 0xF) - 8)
-#define WAKEUP_CHANNEL ((WAKEUP_PIN >> PIN_SHIFT) & 0xF)
-
-#define WAKEUP_TIMER LPC_TMR16B0
-#define WAKEUP_TIMER_EN 7
-
-#define SYSAHBCLKCTRL_SLEEP (0x15 | (1<<WAKEUP_TIMER_EN))
-
#include "WakeUp.h"
#include "WakeInterruptIn.h"
-WakeInterruptIn IRQ_in(WAKEUP_PIN);
-PwmOut pulse_out(WAKEUP_PIN);
+//Pin used, allowed pins = P0_1 (dp24, default), P0_8 (dp1) and P0_9 (dp2)
+//By defining WakeUpPin in for example your main.cpp this can be overridden
+WEAK PinName WakeUpPin = dp24;
+extern PinName WakeUpPin;
+
+WakeInterruptIn IRQ_in(WakeUpPin);
+PwmOut pulse_out(WakeUpPin);
FunctionPointer WakeUp::callback;
float WakeUp::cycles_per_ms = 20.0;
@@ -28,19 +21,42 @@
static uint32_t old_clk_sel = ~0;
static uint32_t SYSAHBCLKCTRL;
static uint32_t TCR, PR, MR3;
+static LPC_TMR_TypeDef *WakeUpTimer;
+static uint32_t SYSAHBCLKCTRL_Sleep;
+static uint8_t WakeUpTimer_Match;
static inline void restore(void);
void WakeUp::set_ms(uint32_t ms)
{
- if (ms != 0) {
- if (old_clk_sel == ~0) { //Only during first run
- old_clk_sel = LPC_SYSCON->MAINCLKSEL;
- SYSAHBCLKCTRL = LPC_SYSCON->SYSAHBCLKCTRL;
- }
+ if (old_clk_sel == ~0) { //Only during first run
+ old_clk_sel = LPC_SYSCON->MAINCLKSEL;
+ SYSAHBCLKCTRL = LPC_SYSCON->SYSAHBCLKCTRL;
- if (LPC_SYSCON->SYSAHBCLKCTRL != SYSAHBCLKCTRL_SLEEP) //Always when it is different from sleep settings
+ switch(WakeUpPin) {
+ case dp24:
+ WakeUpTimer = LPC_TMR32B0;
+ SYSAHBCLKCTRL_Sleep = 0x15 | (1<<9);
+ WakeUpTimer_Match = 2;
+ break;
+ case dp1:
+ WakeUpTimer = LPC_TMR16B0;
+ SYSAHBCLKCTRL_Sleep = 0x15 | (1<<7);
+ WakeUpTimer_Match = 0;
+ break;
+ case dp2:
+ WakeUpTimer = LPC_TMR16B0;
+ SYSAHBCLKCTRL_Sleep = 0x15 | (1<<7);
+ WakeUpTimer_Match = 1;
+ break;
+ default:
+ error("Invalid WakeUp pin, choose dp1, dp2 or dp24");
+ }
+ }
+
+ if (ms != 0) {
+ if (LPC_SYSCON->SYSAHBCLKCTRL != SYSAHBCLKCTRL_Sleep) //Always when it is different from sleep settings
SYSAHBCLKCTRL = LPC_SYSCON->SYSAHBCLKCTRL;
LPC_SYSCON->PDRUNCFG &= ~PDRUNCFG_WDTOSC_PD;
@@ -50,23 +66,23 @@
LPC_SYSCON->WDTOSCCTRL = 14 | (1<<5);
//Store old PWM
- TCR = WAKEUP_TIMER->TCR;
- PR = WAKEUP_TIMER->PR;
- MR3 = WAKEUP_TIMER->MR3;
+ TCR = WakeUpTimer->TCR;
+ PR = WakeUpTimer->PR;
+ MR3 = WakeUpTimer->MR3;
//Setup PWM
- WAKEUP_TIMER->TCR = TMR16B0TCR_CRST;
+ WakeUpTimer->TCR = TMR16B0TCR_CRST;
uint32_t ticks = (float)ms * cycles_per_ms;
//whatever timer it is, we treat it as 16-bit (with PR that is 32-bit still, do the math, it is enough for this)
- WAKEUP_TIMER->PR = ticks >> 16;
- WAKEUP_TIMER->MR[WAKEUP_MATCH] = ticks / ((ticks >> 16) + 1);
- WAKEUP_TIMER->MR3 = 0xFFFF;
+ WakeUpTimer->PR = ticks >> 16;
+ WakeUpTimer->MR[WakeUpTimer_Match] = ticks / ((ticks >> 16) + 1);
+ WakeUpTimer->MR3 = 0xFFFF;
IRQ_in.rise(irq_handler);
//Disable most peripherals
- LPC_SYSCON->SYSAHBCLKCTRL = SYSAHBCLKCTRL_SLEEP;
+ LPC_SYSCON->SYSAHBCLKCTRL = SYSAHBCLKCTRL_Sleep;
//Switch clock to WD OSC
LPC_SYSCON->MAINCLKSEL = 0x2;
@@ -74,7 +90,7 @@
LPC_SYSCON->MAINCLKUEN = MAINCLKUEN_ENA;
//Enable PWM:
- WAKEUP_TIMER->TCR = TMR16B0TCR_CEN;
+ WakeUpTimer->TCR = TMR16B0TCR_CEN;
} else {
//Else restore normal settings
restore();
@@ -94,7 +110,7 @@
static inline void restore(void) {
- WAKEUP_TIMER->MR[WAKEUP_MATCH] = 0xFFFF;
+ WakeUpTimer->MR[WakeUpTimer_Match] = 0xFFFFFFFF;
if (old_clk_sel == 3) //Was running on PLL
while(LPC_SYSCON->SYSPLLSTAT != SYSPLLSTAT_LOCK);
@@ -109,9 +125,9 @@
LPC_SYSCON->SYSAHBCLKCTRL = SYSAHBCLKCTRL;
- WAKEUP_TIMER->MR3 = MR3;
- WAKEUP_TIMER->PR = PR;
- WAKEUP_TIMER->TCR = TCR;
+ WakeUpTimer->MR3 = MR3;
+ WakeUpTimer->PR = PR;
+ WakeUpTimer->TCR = TCR;
}
#endif
