How to get sleep mode power draw down to ~3uA

As is noted in a few threads below the default mbed libraries have some issues with CPU sleep. They also only support deepsleep not power down mode. Power down mode will take longer to wake up but assuming a few ms delay isn’t an issue it offers a significant power saving (about 1/100th of the current) over deep sleep.

However even when you do get the board into power down mode the current draw is around 120uA rather than the 2-3uA it should be.

This is caused by the CPU reset state being a weak pull up on all GPIO and the board having a pull pown on P0_3 (the program mode pin). If you disable the internal pullup the power draw drops to where it should be.

So to get the system into power down with a current draw of ~3uA the code is:


 #include "mbed.h"

DigitalIn progMode(P0_3);

void enterPowerDown() {
    LPC_PMU->PCON = 0x2;
    SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
    LPC_SYSCON->PDAWAKECFG &= 0xFFFFF800;
    __WFI();
}

int main () {
progMode.mode(PullNone);

enterPowerDown();
}

9 Likes

Great info, thanks