Skip to content

Commit

Permalink
Merge pull request #112 from Sissors/master
Browse files Browse the repository at this point in the history
Added sleep to LPC81x
  • Loading branch information
emilmont committed Nov 21, 2013
2 parents 036f7be + 585e05c commit 6a5335a
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
#define DEVICE_SEMIHOST 0
#define DEVICE_LOCALFILESYSTEM 0

#define DEVICE_SLEEP 0
#define DEVICE_SLEEP 1

#define DEVICE_DEBUG_AWARENESS 0

Expand Down
82 changes: 82 additions & 0 deletions libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/sleep.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/* mbed Microcontroller Library
* Copyright (c) 2006-2013 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "sleep_api.h"
#include "cmsis.h"


//#define DEEPSLEEP
#define POWERDOWN

void sleep(void) {
//Normal sleep mode for PCON:
LPC_PMU->PCON &= ~0x03;

//Normal sleep mode for ARM core:
SCB->SCR = 0;

//And go to sleep
__WFI();
}



//Deepsleep/powerdown modes assume the device is configured to use its internal RC oscillator directly

#ifdef DEEPSLEEP
void deepsleep(void) {
//Deep sleep in PCON
LPC_PMU->PCON &= ~0x03;
LPC_PMU->PCON |= 0x01;

//If brownout detection and WDT are enabled, keep them enabled during sleep
LPC_SYSCON->PDSLEEPCFG = LPC_SYSCON->PDRUNCFG;

//After wakeup same stuff as currently enabled:
LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;

//All interrupts may wake up:
LPC_SYSCON->STARTERP0 = 0xFF;
LPC_SYSCON->STARTERP1 = 0xFFFF;

//Deep sleep for ARM core:
SCB->SCR = 1<<2;

__WFI();
}
#endif

#ifdef POWERDOWN
void deepsleep(void) {
//Powerdown in PCON
LPC_PMU->PCON &= ~0x03;
LPC_PMU->PCON |= 0x02;

//If brownout detection and WDT are enabled, keep them enabled during sleep
LPC_SYSCON->PDSLEEPCFG = LPC_SYSCON->PDRUNCFG;

//After wakeup same stuff as currently enabled:
LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;

//All interrupts may wake up:
LPC_SYSCON->STARTERP0 = 0xFF;
LPC_SYSCON->STARTERP1 = 0xFFFF;

//Deep sleep for ARM core:
SCB->SCR = 1<<2;

__WFI();
}
#endif

0 comments on commit 6a5335a

Please sign in to comment.