sleep

ARCH_GPRS_Sleep.cpp

Committer:
mbotkinl
Date:
2015-03-19
Revision:
0:877664c39acd

File content as of revision 0:877664c39acd:

#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);
    }
}