LPC11E68 IRC not stopped during power down

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

LPC11E68 IRC not stopped during power down

959 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by LpcWare159 on Thu Dec 11 03:21:18 MST 2014
Hi.

I have a board with the LPC11E68. The firmware makes the MCU sleep for 4 seconds, wakes up via RTC interrupt, blinks a LED and goes to sleep again. All IOs as output and driven low, pullup/down disabled. The power consumption in deep power down is about 10uA (LDO quiescence + MCU). But when I put the part in power down it won't get below 400uA. I configured the CLKOUT to output the main clock. to During the wake up period, the CLKOUT shows the 12MHz IRC clock coming out. When it enters power down, I see every 100us a burst of thirteen 12MHz cycles (burst appr 1.1us long) coming out of CLKOUT? Isn't the IRC shutdown automatically when entering power down?

Does anyone have this part with power down consumption around datasheet level (22uA)?

Thanks for feedback
Labels (1)
0 Kudos
Reply
7 Replies

863 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by LpcWare159 on Wed Dec 17 19:12:50 MST 2014
Thanks! I got the measurements correct in no time.

The SYSCTL_WAKEUP_RTCINT bit was incorrect in my framework. The example code has the correct value (1<<12).
0 Kudos
Reply

863 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by mc on Tue Dec 16 12:09:08 MST 2014
Hi lpcware159
Could you please look below app note
AN11612: Using the LPC11U6x_LPC11E6x Low Power Modes
at
http://www.lpcware.com/content/nxpfile/an11612-using-lpc11u6xlpc11e6x-low-power-modes

0 Kudos
Reply

863 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by Lpc_Ware159 on Sat Dec 13 11:04:11 MST 2014
I found out that the SW/JTAG lines require a IOCON_FUNC1 setting for GPIO configuration.

void rtc_init(void) {
    uint32_t timestamp = 0;
    SystemCoreClockUpdate();

    Chip_Clock_EnableRTCOsc();
    Chip_RTC_Init(LPC_RTC);

    timestamp = Chip_RTC_GetCount(LPC_RTC);

    Chip_RTC_Reset(LPC_RTC);

    Chip_RTC_SetCount(LPC_RTC, timestamp);

    Chip_RTC_SetAlarm(LPC_RTC, 3);

    /* Clear latched RTC interrupt statuses */
    Chip_RTC_ClearStatus(LPC_RTC, (RTC_CTRL_OFD | RTC_CTRL_ALARM1HZ | RTC_CTRL_WAKE1KHZ));

    /* Enable RTC as a peripheral wakeup event */
    Chip_SYSCTL_EnablePeriphWakeup(SYSCTL_WAKEUP_RTCINT);

    /* Enable RTC interrupt in NVIC */
    NVIC_EnableIRQ((IRQn_Type) RTC_IRQn);

    Chip_RTC_Enable(LPC_RTC);
}

int main(void) {
    static uint32_t delay = 0;
    uint32_t i, j = 0;

    SystemCoreClockUpdate();

    for (delay = 0; delay < 0x5FFFFF; delay++) {
        // safety delay
    }

    rtc_init();

    for (i = 0; i < 3; i++) {
        switch (i) {
            case 0:
                for (j = 0; j < 32; j++) {
                    switch (j) {
                        case 1: // boot has pull up
                        case 4: // i2c0-scl has pull up
                        case 5: // i2c0-sda has pull up
                            Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC0);
                            Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
                            Chip_GPIO_WritePortBit(LPC_GPIO, i, j, true);
                            break;
                        case 0: // reset has pull up
                        case 10: // swclk has pull up
                        case 15: // swdio line
                            Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC1);
                            Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
                            Chip_GPIO_WritePortBit(LPC_GPIO, i, j, true);
                            break;
                        case 11: // JTAG lines
                        case 12:
                        case 13:
                        case 14:
                            Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC1);
                            Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
                            Chip_GPIO_WritePortBit(LPC_GPIO, i, j, false);
                            break;
                        default:
                            Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC0);
                            Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
                            Chip_GPIO_WritePortBit(LPC_GPIO, i, j, false);
                            break;
                    }
                }
                break;
            case 1:
            case 2:
                for (j = 0; j < 32; j++) {
                    Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC0);
                    Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
                    Chip_GPIO_WritePortBit(LPC_GPIO, i, j, false);
                }
                break;
        }
    }

    Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_WDT);
    Chip_WWDT_SelClockSource(LPC_WWDT, WWDT_CLKSRC_WATCHDOG_WDOSC);
    Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_WDT);

    LPC_SYSCON->SSP0CLKDIV = 0;
    LPC_SYSCON->SSP1CLKDIV = 0;
    LPC_SYSCON->USBCLKDIV = 0;
    LPC_SYSCON->USBCLKDIV = 0;
    LPC_SYSCON->UARTFRGDIV = 0;
    LPC_SYSCON->USART0CLKDIV = 0;
    LPC_SYSCON->CLKOUTDIV = 0;
    LPC_SYSCON->SYSAHBCLKDIV = 1;

    LPC_PMU->GPREG[4] |= (1<<11);   // disable wakeup path for power-down mode

    Chip_SYSCTL_PowerDown(SYSCTL_POWERDOWN_BOD_PD | SYSCTL_POWERDOWN_ADC_PD | SYSCTL_POWERDOWN_SYSOSC_PD | SYSCTL_POWERDOWN_SYSPLL_PD
            | SYSCTL_POWERDOWN_USBPLL_PD | SYSCTL_POWERDOWN_USBPAD_PD | SYSCTL_POWERDOWN_TS_PD | SYSCTL_SLPWAKE_WDTOSC_PD);
    Chip_SYSCTL_SetDeepSleepPD(SYSCTL_DEEPSLP_BOD_PD | SYSCTL_SLPWAKE_WDTOSC_PD);
    Chip_SYSCTL_SetWakeup(~(SYSCTL_SLPWAKE_IRCOUT_PD | SYSCTL_SLPWAKE_IRC_PD | SYSCTL_SLPWAKE_FLASH_PD));

    while (true) {
        // blink led
        Chip_GPIO_WritePortBit(LPC_GPIO, 2, 7, true);
        for(i = 0; i < 0xFFF; i++);
        Chip_GPIO_WritePortBit(LPC_GPIO, 2, 7, false);

        Chip_RTC_SetAlarm(LPC_RTC, Chip_RTC_GetCount(LPC_RTC) + 4);
        Chip_RTC_EnableWakeup(LPC_RTC, (RTC_CTRL_ALARMDPD_EN | RTC_CTRL_WAKEDPD_EN));

        Chip_PMU_PowerDownState(LPC_PMU);
    }

    return 0;
}

int main2(void) {
    uint8_t main_state_rc;

    Reset_CaptureResetSource();

#if defined (__USE_LPCOPEN)
#if !defined(NO_BOARD_LIB)
    // Read clock settings and update SystemCoreClock variable
    SystemCoreClockUpdate();

    // Set up and initialize all required blocks and
    // functions related to the board hardware
    Board_Init();

    Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 1, IOCON_MODE_INACT | IOCON_FUNC1);
    Chip_GPIO_WriteDirBit(LPC_GPIO, 0, 1, false);
    LPC_SYSCON->CLKOUTDIV = 1;
    LPC_SYSCON->CLKOUTSEL = 2;
    LPC_SYSCON->CLKOUTUEN = 0;
    LPC_SYSCON->CLKOUTUEN = 1;

    Board_Power_Init();
    Board_Ignitor_Init();
    Board_LED_Init();
    Board_RTC_Init();
    Board_Debug_Init();
    SWT_Init();
    SysTick_Init();
//  if (Inputs_GetTestPinStatus() != 0) {
//      Watchdog_Init(30, false);
//  }
    Watchdog_Init(30, false);
    DATAFLASH_Init();
    Config_Init();
#endif
#endif

    Board_Init();

    Board_PowerProfile_EnablePeripheral(PROFILE_FLAG_UART | PROFILE_FLAG_SYSTICK);
    Board_PowerProfile_EnablePeripheral(PROFILE_FLAG_UART);
    Board_PowerProfile_ApplyProfile();

    LOG_ClearLog();
    LOG_Reset(Version_GetSvn());

    State_InitMachine();
    State_Add(STATE_RESET, Reset_State);
//  State_Add(STATE_DISABLED, Disabled_State);
    State_Add(STATE_DISARMED, Disarmed_State);
//  State_Add(STATE_SAFE, Safe_State);
//  State_Add(STATE_ARMED, Armed_State);
//  State_Add(STATE_FIRE, Fire_State);
    State_Add(STATE_SERVICE, Service_State);
    State_Set(1, (uint8_t) STATE_RESET);

    while (true) {
        Chip_WWDT_Feed(LPC_WWDT);

        main_state_rc = (*state_machine[state_current])(&state_init_flag);
        if (main_state_rc == 0) {

        }

        //IOTracer_LogPendingChanges();
    }

    return 0;
}
0 Kudos
Reply

863 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by Lpc_Ware159 on Sat Dec 13 11:03:44 MST 2014
However, the current consumption was not affected.
0 Kudos
Reply

863 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by LpcWare159 on Fri Dec 12 13:22:12 MST 2014
Thanks for your reply. Here it is.

#include "board.h"

void rtc_init(void) {
    uint32_t timestamp = 0;
    SystemCoreClockUpdate();

    Chip_Clock_EnableRTCOsc();
    Chip_RTC_Init(LPC_RTC);
    timestamp = Chip_RTC_GetCount(LPC_RTC);
    Chip_RTC_Reset(LPC_RTC);
    Chip_RTC_SetCount(LPC_RTC, timestamp);
    Chip_RTC_SetAlarm(LPC_RTC, 3);
    /* Clear latched RTC interrupt statuses */
    Chip_RTC_ClearStatus(LPC_RTC, (RTC_CTRL_OFD | RTC_CTRL_ALARM1HZ | RTC_CTRL_WAKE1KHZ));
    /* Enable RTC as a peripheral wakeup event */
    Chip_SYSCTL_EnablePeriphWakeup(SYSCTL_WAKEUP_RTCINT);
    /* Enable RTC interrupt in NVIC */
    NVIC_EnableIRQ((IRQn_Type) RTC_IRQn);
    Chip_RTC_Enable(LPC_RTC);
}

int main(void) {
    static uint32_t delay = 0;
    uint32_t i, j = 0;

    SystemCoreClockUpdate();

    for (delay = 0; delay < 0x5FFFFF; delay++) {
        // safety delay
    }

    rtc_init();

    for (i = 0; i < 3; i++) {
        switch (i) {
            case 0:
                for (j = 0; j < 32; j++) {
                    switch (j) {
                        case 0: // reset has pull up
                        case 1: // boot has pull up
                        case 4: // i2c0-scl has pull up
                        case 5: // i2c0-sda has pull up
                            Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC0);
                            Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
                            Chip_GPIO_WritePortBit(LPC_GPIO, i, j, true);
                            break;
                        case 15: // breaks debugger if set
                            break;
                        default:
                            Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC0);
                            Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
                            Chip_GPIO_WritePortBit(LPC_GPIO, i, j, false);
                            break;
                    }
                }
                break;
            case 1:
            case 2:
                for (j = 0; j < 32; j++) {
                    Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC0);
                    Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
                    Chip_GPIO_WritePortBit(LPC_GPIO, i, j, false);
                }
                break;
        }
    }

    Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_WDT);
    Chip_WWDT_SelClockSource(LPC_WWDT, WWDT_CLKSRC_WATCHDOG_WDOSC);
    Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_WDT);

    LPC_SYSCON->SSP0CLKDIV = 0;
    LPC_SYSCON->SSP1CLKDIV = 0;
    LPC_SYSCON->USBCLKDIV = 0;
    LPC_SYSCON->USBCLKDIV = 0;
    LPC_SYSCON->UARTFRGDIV = 0;
    LPC_SYSCON->USART0CLKDIV = 0;
    LPC_SYSCON->CLKOUTDIV = 0;
    LPC_SYSCON->SYSAHBCLKDIV = 1;

    LPC_PMU->GPREG[4] |= (1<<11);   // disable wakeup path for power-down mode

    Chip_SYSCTL_PowerDown(SYSCTL_POWERDOWN_BOD_PD | SYSCTL_POWERDOWN_ADC_PD | SYSCTL_POWERDOWN_SYSOSC_PD | SYSCTL_POWERDOWN_SYSPLL_PD
            | SYSCTL_POWERDOWN_USBPLL_PD | SYSCTL_POWERDOWN_USBPAD_PD | SYSCTL_POWERDOWN_TS_PD | SYSCTL_SLPWAKE_WDTOSC_PD);
    Chip_SYSCTL_SetDeepSleepPD(SYSCTL_DEEPSLP_BOD_PD | SYSCTL_SLPWAKE_WDTOSC_PD);
    Chip_SYSCTL_SetWakeup(~(SYSCTL_SLPWAKE_IRCOUT_PD | SYSCTL_SLPWAKE_IRC_PD | SYSCTL_SLPWAKE_FLASH_PD));

    while (true) {
        // blink led
        Chip_GPIO_WritePortBit(LPC_GPIO, 2, 7, true);
        for(i = 0; i < 0xFFF; i++);
        Chip_GPIO_WritePortBit(LPC_GPIO, 2, 7, false);

        Chip_RTC_SetAlarm(LPC_RTC, Chip_RTC_GetCount(LPC_RTC) + 4);
        Chip_RTC_EnableWakeup(LPC_RTC, (RTC_CTRL_ALARMDPD_EN | RTC_CTRL_WAKEDPD_EN));

        Chip_PMU_PowerDownState(LPC_PMU);
    }

    return 0;
}
0 Kudos
Reply

863 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by mc on Fri Dec 12 11:49:19 MST 2014
Hi LpcWare159,
Yes, you are seeing high power consumption. This issue could be related to register settings in S/W. Can you post your code here?
0 Kudos
Reply

863 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by LpcWare159 on Fri Dec 12 10:56:39 MST 2014
The current consumption of the board (only MCU, LDO and one LED off) is 375uA. 357uA in going into pin92 (Vdd), the remaining 18uA is going into the VddIO pins and LDOs. Can I assume it this over consumption is only related to the core?

If I change the mode from power down to deep sleep, I measure the burst pulses on CLKOUT at a 3.8us rate (in stead of every 100us rate in power down mode). The selected CLKOUT in both cases is the main clock. Shouldn't the CLKOUT output

The WWDT clock source is set to the watchdog oscillator, allowing the IRC to be shut down.
0 Kudos
Reply