From 585e05ca6aafef549aafa338d626ed35ae2c9473 Mon Sep 17 00:00:00 2001 From: Sissors Date: Thu, 21 Nov 2013 08:19:44 +0100 Subject: [PATCH] Added sleep to LPC81x http://mbed.org/users/mbed_official/code/mbed-src/pull-request/6 --- .../hal/TARGET_NXP/TARGET_LPC81X/device.h | 2 +- .../hal/TARGET_NXP/TARGET_LPC81X/sleep.c | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/sleep.c diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/device.h b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/device.h index f8699b54261..88e5cf66b36 100644 --- a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/device.h +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/device.h @@ -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 diff --git a/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/sleep.c b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/sleep.c new file mode 100644 index 00000000000..4d2232a86d9 --- /dev/null +++ b/libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC81X/sleep.c @@ -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