The current is about 500uA when nrf52840 in idle mode

Hi,

SDK version : NCS 2.1.0

Hardware : nRF52840 DK (External supply)

I am trying to put the nrf52840 to idle mode based on the system_off example. 

D:\NCS_2.1.0\v2.1.0\zephyr\samples\boards\nrf\system_off

prj,config setting

CONFIG_PM=y
# Required to disable default behavior of deep sleep on timeout
CONFIG_PM_DEVICE=y
CONFIG_GPIO=y
# Optional select RAM retention (nRF52 only)
#CONFIG_APP_RETENTION=y
CONFIG_THREAD_NAME=y

# enable DC.DC
CONFIG_BOARD_ENABLE_DCDC=y

I use pm_state_force(0u, &(struct pm_state_info){PM_STATE_STANDBY, 0, 0}); to put system to idle mode and find the idle current is stuck at 500uA .

void main(void)
{
    int rc;
    const struct device *cons = DEVICE_DT_GET(DT_CHOSEN(zephyr_console));

    if (!device_is_ready(cons)) {
        printk("%s: device not ready.\n", cons->name);
        return;
    }

    printk("\n%s system off demo\n", CONFIG_BOARD);

    if (IS_ENABLED(CONFIG_APP_RETENTION)) {
        bool retained_ok = retained_validate();

        /* Increment for this boot attempt and update. */
        retained.boots += 1;
        retained_update();

        printk("Retained data: %s\n", retained_ok ? "valid" : "INVALID");
        printk("Boot count: %u\n", retained.boots);
        printk("Off count: %u\n", retained.off_count);
        printk("Active Ticks: %" PRIu64 "\n", retained.uptime_sum);
    } else {
        printk("Retained data not supported\n");
    }

    /* Configure to generate PORT event (wakeup) on button 1 press. */
    nrf_gpio_cfg_input(NRF_DT_GPIOS_TO_PSEL(DT_ALIAS(sw0), gpios),
               NRF_GPIO_PIN_PULLUP);
    nrf_gpio_cfg_sense_set(NRF_DT_GPIOS_TO_PSEL(DT_ALIAS(sw0), gpios),
                   NRF_GPIO_PIN_SENSE_LOW);

    printk("Busy-wait %u s\n", BUSY_WAIT_S);
    k_busy_wait(BUSY_WAIT_S * USEC_PER_SEC);

    printk("Busy-wait %u s with UART off\n", BUSY_WAIT_S);
    rc = pm_device_action_run(cons, PM_DEVICE_ACTION_SUSPEND);
    k_busy_wait(BUSY_WAIT_S * USEC_PER_SEC);
    rc = pm_device_action_run(cons, PM_DEVICE_ACTION_RESUME);

    printk("Sleep %u s\n", SLEEP_S);
    k_sleep(K_SECONDS(SLEEP_S));

    printk("Sleep %u s with UART off\n", SLEEP_S);
    rc = pm_device_action_run(cons, PM_DEVICE_ACTION_SUSPEND);
    k_sleep(K_SECONDS(SLEEP_S));
    rc = pm_device_action_run(cons, PM_DEVICE_ACTION_RESUME);

    printk("Entering system off; press BUTTON1 to restart\n");

    if (IS_ENABLED(CONFIG_APP_RETENTION)) {
        /* Update the retained state */
        retained.off_count += 1;
        retained_update();
    }

    /* Above we disabled entry to deep sleep based on duration of
     * controlled delay.  Here we need to override that, then
     * force entry to deep sleep on any delay.
     */
    pm_state_force(0u, &(struct pm_state_info){PM_STATE_STANDBY, 0, 0});


    /* Now we need to go sleep. This will let the idle thread runs and
     * the pm subsystem will use the forced state. To confirm that the
     * forced state is used, lets set the same timeout used previously.
     */
    k_sleep(K_SECONDS(SLEEP_S));

    printk("ERROR: System off failed\n");
    while (true) {
        return;
    }
}

As my understanding, once there is no other thread running, system will enter the idle thread. 

I also use thread analyzer to make sure there is no any other thread alive.

About the high current condition, do you have any advice on it?

Parents
  • Hi

    Update:

    After I add the CONFIG_SERIAL = n to my prj.conf file, the current can drop to 5 uA.

    But, if I set the CONFIG_SERIAL=n, all uart will be disabled. (uart0/uart1)

    Is there any way to let the current drop under 10uA and keep CONFIG_SERIAL=y simultaneously?

    Because uart is a mandatory interface on our device.

    #Note : I also try the pm_device_action_run(cons, PM_DEVICE_ACTION_SUSPEND) and it didn't improve the power consumption.

Reply
  • Hi

    Update:

    After I add the CONFIG_SERIAL = n to my prj.conf file, the current can drop to 5 uA.

    But, if I set the CONFIG_SERIAL=n, all uart will be disabled. (uart0/uart1)

    Is there any way to let the current drop under 10uA and keep CONFIG_SERIAL=y simultaneously?

    Because uart is a mandatory interface on our device.

    #Note : I also try the pm_device_action_run(cons, PM_DEVICE_ACTION_SUSPEND) and it didn't improve the power consumption.

Children
No Data
Related