nRF9160 - low consumpiont modes

Hi,

I would like to clarify a few points related to the power saving modes of the nRF9160 and how it behaves in low-power states.

1. PSM Current Consumption — What Does the 2.7 µA Refer To?

According to the documentation, Power Saving Mode (PSM) is an LTE feature that allows the device to enter a deep sleep mode while remaining registered to the network, with a typical current consumption of around 2.7 µA.

Question:
Does this 2.7 µA value refer to the entire nRF9160 SiP (including both the application processor and the LTE modem), or only to the LTE modem?

2. Waking Up from PSM via GPIO Event

I understand that PSM is a modem-specific feature, but in my application I would like the device to remain registered to the LTE network while allowing the system to "wake up" on a GPIO event in order to send data.

Question:
Is it possible to wake up the application core from sleep via a GPIO interrupt while the modem is in PSM, without losing the network registration or having to re-establish the LTE connection?

3. System OFF and Wake-up Without Reset

I know that System OFF mode achieves extremely low power consumption and can be exited via a GPIO event. However, waking up from System OFF results in a full system reset.

Question:
Is there a low-power mode (similar to System OFF or with very low current consumption) that allows the application to wake up on a GPIO event without triggering a reset?


Intended Behavior in My Application

Here’s the behavior I want to achieve in my application:

  • The nRF9160 should stay in an ultra-low power state (a few µA).

  • The LTE modem must remain registered to the network (so PSM seems appropriate).

  • When a specific GPIO event occurs:

    • The application core should wake up,

    • Be able to immediately send data via LTE (without re-registration),

    • And then return to low-power mode again.

Parents
  • Hello,

    Question:
    Does this 2.7 µA value refer to the entire nRF9160 SiP (including both the application processor and the LTE modem), or only to the LTE modem?

    Yes, this is for the entire SiP including the modem.

    Question:
    Is it possible to wake up the application core from sleep via a GPIO interrupt while the modem is in PSM, without losing the network registration or having to re-establish the LTE connection?

    I'm not sure what you mean by this. PSM has nothing to do with the application core, so whatever you want to do will work the same whether the modem is in PSM or not.

    Is there a low-power mode (similar to System OFF or with very low current consumption) that allows the application to wake up on a GPIO event without triggering a reset?

    No, system off is the lowest possible power mode.

  • I'm using nRF Connect SDK Toolchain v3.0.0

    device: nRF9160DK

    I create a simple application to activate PSM:

    Before I put CONFIG_SERIAL=n, the consumption was about 460 uA.

    From the documentation in the power optimisation chapter reccomandation states that consumption is affected by serial logging and to deactivate CONFIG_SERIAL.

    docs.nordicsemi.com/.../power_general.html

    Consumption drops to less than 10 uA.
    It is indicated that in order to have the lowest consumption, unused pins and peripherals must be disabled.

    Is there any way to see which peripherals are active? I don't know which pheripherical are already active with nRF9160DK.

    prj.conf

    # Logging
    CONFIG_LOG=y
    
    # Button and LED support
    CONFIG_DK_LIBRARY=y
    
    # Network
    CONFIG_NETWORKING=y
    CONFIG_NET_NATIVE=n
    CONFIG_NET_SOCKETS=y
    CONFIG_NET_SOCKETS_OFFLOAD=y
    CONFIG_POSIX_API=y
    
    # Memory
    CONFIG_HEAP_MEM_POOL_SIZE=4096
    CONFIG_MAIN_STACK_SIZE=4096
    
    # Modem library
    # STEP 2 - Enable the nRF Modem library
    CONFIG_NRF_MODEM_LIB=y
    
    # LTE link control
    # STEP 3 - Enable the LTE link controller library
    CONFIG_LTE_LINK_CONTROL=y
    
    CONFIG_LTE_LC_PSM_MODULE=y
    CONFIG_LTE_PSM_REQ=y
    CONFIG_LTE_PSM_REQ_RPTAU="00101000"   # Esempio: TAU di 8 ore
    CONFIG_LTE_PSM_REQ_RAT="00001000"     # Esempio: Active Time di 16 secondi
    CONFIG_SERIAL=n

    main.c

    /*
     * Copyright (c) 2020 Nordic Semiconductor ASA
     *
     * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
     */
    
    #include <stdio.h>
    #include <ncs_version.h>
    #include <zephyr/kernel.h>
    #include <zephyr/logging/log.h>
    #include <dk_buttons_and_leds.h>
    
    /* STEP 4 - Include the header file of the nRF Modem library and the LTE link controller library */
    #include <modem/nrf_modem_lib.h>
    #include <modem/lte_lc.h>
    
    /* STEP 5 - Define the semaphore lte_connected */
    static K_SEM_DEFINE(lte_connected, 0, 1);
    
    LOG_MODULE_REGISTER(Lesson2_Exercise2, LOG_LEVEL_INF);
    
    /* STEP 7 - Define the event handler for LTE link control */
    static void lte_handler(const struct lte_lc_evt *const evt)
    {
    	switch (evt->type)
    	{
    	/* STEP 7.1 - On changed registration status, print status */
    	case LTE_LC_EVT_NW_REG_STATUS:
    		if ((evt->nw_reg_status != LTE_LC_NW_REG_REGISTERED_HOME) &&
    			 (evt->nw_reg_status != LTE_LC_NW_REG_REGISTERED_ROAMING))
    		{
    			break;
    		}
    		LOG_INF("Network registration status: %s",
    				  evt->nw_reg_status == LTE_LC_NW_REG_REGISTERED_HOME ? "Connected - home network" : "Connected - roaming");
    		k_sem_give(&lte_connected);
    
    		/* STEP 10 - Turn on the LED status LED */
    		dk_set_led_on(DK_LED2);
    
    		break;
    	/* STEP 7.2 - On event RRC update, print RRC mode */
    	case LTE_LC_EVT_RRC_UPDATE:
    		LOG_INF("RRC mode: %s", evt->rrc_mode == LTE_LC_RRC_MODE_CONNECTED ? "Connected" : "Idle");
    		break;
    
    	case LTE_LC_EVT_PSM_UPDATE:
    		LOG_INF("PSM parameter update: Periodic TAU: %d s, Active time: %d s",
    				  evt->psm_cfg.tau, evt->psm_cfg.active_time);
    		if (evt->psm_cfg.active_time == -1)
    		{
    			LOG_ERR("Network rejected PSM parameters. Failed to enable PSM");
    		}
    		break;
    	default:
    		break;
    	}
    }
    
    /* STEP 6 - Define the function modem_configure() to initialize an LTE connection */
    static int modem_configure(void)
    {
    	int err;
    
    	LOG_INF("Initializing modem library");
    	err = nrf_modem_lib_init();
    	if (err)
    	{
    		LOG_ERR("Failed to initialize the modem library, error: %d", err);
    		return err;
    	}
    
    	err = lte_lc_psm_req(true);
    	if (err)
    	{
    		printk("lte_lc_psm_req, error: %d\n", err);
    		return;
    	}
    
    	LOG_INF("Connecting to LTE network");
    	err = lte_lc_connect_async(lte_handler);
    	if (err)
    	{
    		LOG_ERR("Error in lte_lc_connect_async, error: %d", err);
    		return err;
    	}
    	return 0;
    }
    
    int main(void)
    {
    	int err;
    
    	if (dk_leds_init() != 0)
    	{
    		LOG_ERR("Failed to initialize the LEDs Library");
    	}
    
    	/* STEP 8 - Call modem_configure() to initiate the LTE connection */
    	err = modem_configure();
    	if (err)
    	{
    		LOG_ERR("Failed to configure the modem");
    		return 0;
    	}
    
    	/* STEP 9 - Take the semaphore lte_connected */
    	k_sem_take(&lte_connected, K_FOREVER);
    
    	LOG_INF("Connected to LTE network");
    
    	return 0;
    }
    

Reply
  • I'm using nRF Connect SDK Toolchain v3.0.0

    device: nRF9160DK

    I create a simple application to activate PSM:

    Before I put CONFIG_SERIAL=n, the consumption was about 460 uA.

    From the documentation in the power optimisation chapter reccomandation states that consumption is affected by serial logging and to deactivate CONFIG_SERIAL.

    docs.nordicsemi.com/.../power_general.html

    Consumption drops to less than 10 uA.
    It is indicated that in order to have the lowest consumption, unused pins and peripherals must be disabled.

    Is there any way to see which peripherals are active? I don't know which pheripherical are already active with nRF9160DK.

    prj.conf

    # Logging
    CONFIG_LOG=y
    
    # Button and LED support
    CONFIG_DK_LIBRARY=y
    
    # Network
    CONFIG_NETWORKING=y
    CONFIG_NET_NATIVE=n
    CONFIG_NET_SOCKETS=y
    CONFIG_NET_SOCKETS_OFFLOAD=y
    CONFIG_POSIX_API=y
    
    # Memory
    CONFIG_HEAP_MEM_POOL_SIZE=4096
    CONFIG_MAIN_STACK_SIZE=4096
    
    # Modem library
    # STEP 2 - Enable the nRF Modem library
    CONFIG_NRF_MODEM_LIB=y
    
    # LTE link control
    # STEP 3 - Enable the LTE link controller library
    CONFIG_LTE_LINK_CONTROL=y
    
    CONFIG_LTE_LC_PSM_MODULE=y
    CONFIG_LTE_PSM_REQ=y
    CONFIG_LTE_PSM_REQ_RPTAU="00101000"   # Esempio: TAU di 8 ore
    CONFIG_LTE_PSM_REQ_RAT="00001000"     # Esempio: Active Time di 16 secondi
    CONFIG_SERIAL=n

    main.c

    /*
     * Copyright (c) 2020 Nordic Semiconductor ASA
     *
     * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
     */
    
    #include <stdio.h>
    #include <ncs_version.h>
    #include <zephyr/kernel.h>
    #include <zephyr/logging/log.h>
    #include <dk_buttons_and_leds.h>
    
    /* STEP 4 - Include the header file of the nRF Modem library and the LTE link controller library */
    #include <modem/nrf_modem_lib.h>
    #include <modem/lte_lc.h>
    
    /* STEP 5 - Define the semaphore lte_connected */
    static K_SEM_DEFINE(lte_connected, 0, 1);
    
    LOG_MODULE_REGISTER(Lesson2_Exercise2, LOG_LEVEL_INF);
    
    /* STEP 7 - Define the event handler for LTE link control */
    static void lte_handler(const struct lte_lc_evt *const evt)
    {
    	switch (evt->type)
    	{
    	/* STEP 7.1 - On changed registration status, print status */
    	case LTE_LC_EVT_NW_REG_STATUS:
    		if ((evt->nw_reg_status != LTE_LC_NW_REG_REGISTERED_HOME) &&
    			 (evt->nw_reg_status != LTE_LC_NW_REG_REGISTERED_ROAMING))
    		{
    			break;
    		}
    		LOG_INF("Network registration status: %s",
    				  evt->nw_reg_status == LTE_LC_NW_REG_REGISTERED_HOME ? "Connected - home network" : "Connected - roaming");
    		k_sem_give(&lte_connected);
    
    		/* STEP 10 - Turn on the LED status LED */
    		dk_set_led_on(DK_LED2);
    
    		break;
    	/* STEP 7.2 - On event RRC update, print RRC mode */
    	case LTE_LC_EVT_RRC_UPDATE:
    		LOG_INF("RRC mode: %s", evt->rrc_mode == LTE_LC_RRC_MODE_CONNECTED ? "Connected" : "Idle");
    		break;
    
    	case LTE_LC_EVT_PSM_UPDATE:
    		LOG_INF("PSM parameter update: Periodic TAU: %d s, Active time: %d s",
    				  evt->psm_cfg.tau, evt->psm_cfg.active_time);
    		if (evt->psm_cfg.active_time == -1)
    		{
    			LOG_ERR("Network rejected PSM parameters. Failed to enable PSM");
    		}
    		break;
    	default:
    		break;
    	}
    }
    
    /* STEP 6 - Define the function modem_configure() to initialize an LTE connection */
    static int modem_configure(void)
    {
    	int err;
    
    	LOG_INF("Initializing modem library");
    	err = nrf_modem_lib_init();
    	if (err)
    	{
    		LOG_ERR("Failed to initialize the modem library, error: %d", err);
    		return err;
    	}
    
    	err = lte_lc_psm_req(true);
    	if (err)
    	{
    		printk("lte_lc_psm_req, error: %d\n", err);
    		return;
    	}
    
    	LOG_INF("Connecting to LTE network");
    	err = lte_lc_connect_async(lte_handler);
    	if (err)
    	{
    		LOG_ERR("Error in lte_lc_connect_async, error: %d", err);
    		return err;
    	}
    	return 0;
    }
    
    int main(void)
    {
    	int err;
    
    	if (dk_leds_init() != 0)
    	{
    		LOG_ERR("Failed to initialize the LEDs Library");
    	}
    
    	/* STEP 8 - Call modem_configure() to initiate the LTE connection */
    	err = modem_configure();
    	if (err)
    	{
    		LOG_ERR("Failed to configure the modem");
    		return 0;
    	}
    
    	/* STEP 9 - Take the semaphore lte_connected */
    	k_sem_take(&lte_connected, K_FOREVER);
    
    	LOG_INF("Connected to LTE network");
    
    	return 0;
    }
    

Children
No Data
Related