Using DHT11 sensor, sdWrite, wdt. Need to sleep more then this.

Dependencies:   DHT GPRSInterface HTTPClient_GPRS SDFileSystem USBDevice mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ARCH_GPRS_Sleep.cpp Source File

ARCH_GPRS_Sleep.cpp

00001 #include "mbed.h"
00002 #include "ARCH_GPRS_Sleep.h"
00003 #include "ARCH_GPRS_HW.h"
00004 
00005 void Stalker3_0_sleep::gotoSleep()               // goto sleep mode, untill wdt interrupt
00006 {
00007     LPC_PMU->PCON          |= 0x01;                                     /* ?????????           */
00008     LPC_SYSCON->PDSLEEPCFG |= (1UL << 3);                               /* ??BOD???????        */
00009     SCB->SCR &= ~(1UL << 2);                                            /* ??????                 */
00010     __wfi();
00011 }
00012 
00013 void Stalker3_0_sleep::wdtClkSetup(unsigned long clksrc)
00014 {
00015   /* Freq = 0.5Mhz, div_sel is 0x1F, divided by 64. WDT_OSC should be 7.8125khz */
00016     LPC_SYSCON->WDTOSCCTRL = (0x1<<5)|0x1F;
00017     LPC_SYSCON->PDRUNCFG &= ~(0x1<<6);    /* Let WDT clock run */
00018 
00019   /* Enables clock for WDT */
00020     LPC_SYSCON->SYSAHBCLKCTRL |= (1<<15);
00021     LPC_WWDT->CLKSEL = clksrc;        /* Select clock source */
00022 
00023 }
00024 
00025 void Stalker3_0_sleep::wdtInit(long tc)          // init wdt
00026 {
00027     uint32_t regVal;
00028 
00029     LPC_WWDT->TC = tc;
00030 
00031     regVal = WDEN;
00032     LPC_WWDT->MOD = regVal;
00033 
00034     LPC_WWDT->FEED = 0xAA;        /* Feeding sequence */
00035     LPC_WWDT->FEED = 0x55;
00036 
00037     NVIC_EnableIRQ(WDT_IRQn);
00038     NVIC_SetPriority(WDT_IRQn, 2);
00039     return;
00040 
00041 }
00042 
00043 void Stalker3_0_sleep::init()
00044 {
00045 
00046 }
00047 
00048 void Stalker3_0_sleep::sleep(long ts)            // sleep for ts (s)
00049 {
00050 
00051     workMode = MODE_SLEEP;
00052     wdtInit(0x2dc6c0);
00053 
00054     for(int i=0; i<ts; i++)
00055     {
00056         gotoSleep();
00057     }
00058 
00059     workMode = MODE_WORKING;
00060     feed();
00061 }
00062 
00063 void Stalker3_0_sleep::wakeUp()                  // wake up from sleep
00064 {
00065 
00066 }
00067 
00068 void Stalker3_0_sleep::feed()                    // watch dog feed
00069 {
00070     LPC_WWDT->FEED = 0xAA;        /* Feeding sequence */
00071     LPC_WWDT->FEED = 0x55;
00072     return;
00073 }
00074 
00075 Stalker3_0_sleep wdt_sleep;
00076 
00077 extern "C"{
00078 
00079     void WDT_IRQHandler(void)
00080     {
00081 
00082         if(wdt_sleep.workMode == MODE_WORKING)      // WORKING MODE, AND NO FEET WDT, RESET!!!
00083         {
00084             NVIC_SystemReset();
00085         }
00086         LPC_WWDT->MOD &= ~WDTOF;        /* clear the time-out flag and interrupt flag */
00087         LPC_WWDT->MOD &= ~WDINT;        /* clear the time-out flag and interrupt flag */
00088         wdt_sleep.wdtInit(0x2dc6c0);
00089     }
00090 }