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.
Diff: ARCH_GPRS_Sleep.cpp
- Revision:
- 0:877664c39acd
diff -r 000000000000 -r 877664c39acd ARCH_GPRS_Sleep.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ARCH_GPRS_Sleep.cpp Thu Mar 19 18:25:03 2015 +0000
@@ -0,0 +1,90 @@
+#include "mbed.h"
+#include "ARCH_GPRS_Sleep.h"
+#include "ARCH_GPRS_HW.h"
+
+void Stalker3_0_sleep::gotoSleep() // goto sleep mode, untill wdt interrupt
+{
+ LPC_PMU->PCON |= 0x01; /* ????????? */
+ LPC_SYSCON->PDSLEEPCFG |= (1UL << 3); /* ??BOD??????? */
+ SCB->SCR &= ~(1UL << 2); /* ?????? */
+ __wfi();
+}
+
+void Stalker3_0_sleep::wdtClkSetup(unsigned long clksrc)
+{
+ /* Freq = 0.5Mhz, div_sel is 0x1F, divided by 64. WDT_OSC should be 7.8125khz */
+ LPC_SYSCON->WDTOSCCTRL = (0x1<<5)|0x1F;
+ LPC_SYSCON->PDRUNCFG &= ~(0x1<<6); /* Let WDT clock run */
+
+ /* Enables clock for WDT */
+ LPC_SYSCON->SYSAHBCLKCTRL |= (1<<15);
+ LPC_WWDT->CLKSEL = clksrc; /* Select clock source */
+
+}
+
+void Stalker3_0_sleep::wdtInit(long tc) // init wdt
+{
+ uint32_t regVal;
+
+ LPC_WWDT->TC = tc;
+
+ regVal = WDEN;
+ LPC_WWDT->MOD = regVal;
+
+ LPC_WWDT->FEED = 0xAA; /* Feeding sequence */
+ LPC_WWDT->FEED = 0x55;
+
+ NVIC_EnableIRQ(WDT_IRQn);
+ NVIC_SetPriority(WDT_IRQn, 2);
+ return;
+
+}
+
+void Stalker3_0_sleep::init()
+{
+
+}
+
+void Stalker3_0_sleep::sleep(long ts) // sleep for ts (s)
+{
+
+ workMode = MODE_SLEEP;
+ wdtInit(0x2dc6c0);
+
+ for(int i=0; i<ts; i++)
+ {
+ gotoSleep();
+ }
+
+ workMode = MODE_WORKING;
+ feed();
+}
+
+void Stalker3_0_sleep::wakeUp() // wake up from sleep
+{
+
+}
+
+void Stalker3_0_sleep::feed() // watch dog feed
+{
+ LPC_WWDT->FEED = 0xAA; /* Feeding sequence */
+ LPC_WWDT->FEED = 0x55;
+ return;
+}
+
+Stalker3_0_sleep wdt_sleep;
+
+extern "C"{
+
+ void WDT_IRQHandler(void)
+ {
+
+ if(wdt_sleep.workMode == MODE_WORKING) // WORKING MODE, AND NO FEET WDT, RESET!!!
+ {
+ NVIC_SystemReset();
+ }
+ LPC_WWDT->MOD &= ~WDTOF; /* clear the time-out flag and interrupt flag */
+ LPC_WWDT->MOD &= ~WDINT; /* clear the time-out flag and interrupt flag */
+ wdt_sleep.wdtInit(0x2dc6c0);
+ }
+}