NRF54L10 takes too much current

Hi everyone,

I'm working on a project using the nRF54 and Zephyr RTOS. Previously, I implemented almost identical functionality on an nRF52, where the device consumed around 3.5 µA while waiting for an input change (GPIO_INT_LEVEL_ACTIVE). I changed to nrf54, and I hopped current will be less. 

Now, with mostly the same code base and doing nothing more, the current consumption sits at magical 150 µA

CONFIG_PM_DEVICE=y
CONFIG_PM_POLICY_DEFAULT=y
CONFIG_PM=y
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y

Here is what I've tried so far to debug this:

  • I've experimented with various configuration options (prj.conf).

  • I even tried blocking the execution right at the beginning of main() using a semaphore to ensure no application logic is running.

Despite this, the power consumption is always ....150 µA.

Has anyone encountered similar power management issues on the nRF54 with Zephyr, or are there specific Kconfig options/peripherals I should look into to debug this leak?

Thanks in advance!

Parents
  • Hi

    1. A GPIO that is not mentioned in the .dts or overlay files of your project will be left floating, which means it will not necessarily be in a low power state and can indeed leak.

    2. Please check out this part of the documentation on how to verify idle current and how to disable unused pins/peripherals: https://nrfconnectdocs.nordicsemi.com/ncs/3.1.0/nrf/test_and_optimize/optimizing/power_general.html#verify-idle-current-due-to-other-peripherals 

    In general, in the Zephyr RTOS when no threads are called by the main thread, the RTOS will make sure the device/application goes into the lowest possible power mode.

    Best regards,

    Simon

  • Questions:

    1. This in not clear for me:

    I have created own board for my design that includes  <nordic/nrf54l10_partition.dtsi>.

    Should I use  "status = "disabled" for all peripherial that are available in nrf54L10I, but I dont use them?

    Or maybe only some unused perihperials  should by manually disabled ?

    2. And second question - releasing RAM that is not used. It is recomended to call  power_down_unused_ram() 

    My device has 192KB RAM but I have configured like this in overlay file:

    &cpuapp_sram {
        reg = <0x20000000 DT_SIZE_K(64)>;
        ranges = <0x0 0x20000000 DT_SIZE_K(64)>;
    };

    because 64kb is enough for me. 

    Calling power_down_unused_ram() will work ok, and all RAM above 64K will be powered down ? 

    3. 

  • /dts-v1/;
    #include <nordic/nrf54l10_cpuapp.dtsi>
    #include <zephyr/dt-bindings/adc/adc.h>
    #include <zephyr/dt-bindings/adc/nrf-saadc.h>
    #include <zephyr/dt-bindings/gpio/gpio.h>

    / {
    model = " nRF54L10";
    compatible = "tech,beacon-nrf54l10";

    chosen {
    zephyr,sram = &cpuapp_sram;
    zephyr,flash = &rram0;
    };
    aliases {
    buzzer-p = &buzzer_ch0;
    buzzer-m = &buzzer_ch1;
    sw0 = &mag_button;
    sw1 = &service_button;
    sw2 = &secret_button;
    led0 = &my_led0;
    led1 = &my_led1;
    led2 = &my_led2;
    ledred = &my_led0;
    ledgreen = &my_led1;
    ledblue = &my_led2;
    };
    buzzers {
    compatible = "pwm-leds";
    buzzer_ch0: buzzer_node_0 {
    pwms = <&pwm20 0 PWM_HZ(3800) PWM_POLARITY_NORMAL>;
    };
    buzzer_ch1: buzzer_node_1 {
    pwms = <&pwm20 1 PWM_HZ(3800) PWM_POLARITY_INVERTED>;
    };
    };

    my_buttons: my_buttons {
    compatible = "gpio-keys";
    mag_button: button_0 {
    gpios = <&gpio1 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
    };
    service_button: button_s {
    gpios = <&gpio1 5 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
    };
    secret_button: button_f {
    gpios = <&gpio1 7 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
    };
    };

    my_leds: my_leds {
    compatible = "gpio-leds";
    my_led0: led_0 {
    gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>;
    };
    my_led1: led_1 {
    gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
    };
    my_led2: led_2 {
    gpios = <&gpio2 4 GPIO_ACTIVE_HIGH>;
    };
    };
    };

    &clock {
    status = "okay";
    hfclksrc = "HFXO"; 
    lfclksrc = "LFXO"; 

    &gpio1 { status = "okay"; };
    &gpio2 { status = "okay"; };

    &pinctrl {
    pwm20_default: pwm20_default {
    group1 {
    psels = <NRF_PSEL(PWM_OUT0, 1, 11)>,
    <NRF_PSEL(PWM_OUT1, 1, 13)>;
    nordic,drive-mode = <NRF_DRIVE_H0H1>;
    };
    };

    pwm20_sleep: pwm20_sleep {
    group1 {
    psels = <NRF_PSEL(PWM_OUT0, 1, 11)>,
    <NRF_PSEL(PWM_OUT1, 1, 13)>;
    low-power-enable;
    bias-disable;
    };
    };
    };

    &pwm20 {
    status = "okay";
    pinctrl-0 = <&pwm20_default>;
    pinctrl-1 = <&pwm20_sleep>;
    pinctrl-names = "default", "sleep";
    };

  • and overlay:

    #include <zephyr/dt-bindings/adc/adc.h>
    #include <zephyr/dt-bindings/adc/nrf-saadc.h>
    #include <zephyr/dt-bindings/gpio/gpio.h>

    &cpuapp_sram {
    reg = <0x20000000 DT_SIZE_K(64)>;
    ranges = <0x0 0x20000000 DT_SIZE_K(64)>;
    };

    / {
    chosen {
    /delete-property/ zephyr,console;
    /delete-property/ zephyr,shell-uart;
    /delete-property/ zephyr,uart-mcumgr;

    zephyr,code-partition = &slot0_partition;
    zephyr,slot0-partition = &slot0_partition;
    zephyr,slot1-partition = &slot1_partition;
    };
    };

    &{/soc/rram-controller@5004b000/rram@0/} {
    /delete-node/ partitions;
    };

    &{/soc/rram-controller@5004b000/rram@0/} {
    partitions {
    compatible = "fixed-partitions";
    #address-cells = <1>;
    #size-cells = <1>;

    slot0_partition: partition@0 {
    label = "image-0";
    reg = <0x00000000 0x00046C00>; /* 283 KB */
    };

    slot1_partition: partition@46C00 {
    label = "image-1";
    reg = <0x00046C00 0x00046C00>; /* 283 KB */
    };
    };
    };

    &wdt30 {
    status = "okay";
    };

    &adc {
    #address-cells = <1>;
    #size-cells = <0>;
    status = "okay";

    channel@0 {
    reg = <0>;
    zephyr,gain = "ADC_GAIN_1_4";
    zephyr,reference = "ADC_REF_INTERNAL";
    zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
    zephyr,input-positive = <NRF_SAADC_VDD>;
    zephyr,resolution = <14>;
    };
    };
    / {
    zephyr,user {
    io-channels = <&adc 0>;
    };
    };

    / {
    aliases {
    magbutton = &sw0;
    servicebutton = &sw1;
    secretbutton = &sw2;

    led0 = &my_led0;
    led1 = &my_led1;
    led2 = &my_led2;

    ledred = &my_led0;
    ledgreen = &my_led1;
    ledblue = &my_led2;

    buzzer-p = &buzzer_ch0;
    buzzer-m = &buzzer_ch1;

    watchdog0 = &wdt30;
    };
    };

    &gpio0 {
    status = "okay";
    };
    &gpio1 {
    status = "okay";
    };
    &gpio2 {
    status = "okay";
    };
    &gpiote20 {
    status = "okay";
    };
    &gpiote30 {
    status = "okay";
    };

  • And main part of prj.conf. I have tried many setting to achive minimal current.

    I use Zephyr  and 3.2.4 toolchain

    CONFIG_PRINTK=y
    CONFIG_CONSOLE=n
    CONFIG_DEBUG=n
    CONFIG_USE_SEGGER_RTT=n
    CONFIG_RTT_CONSOLE=n
    CONFIG_SERIAL=n
    CONFIG_UART_CONSOLE=n
    CONFIG_LOG=n
    CONFIG_SHELL=n
    CONFIG_DK_LIBRARY=n
    CONFIG_CLOCK_CONTROL=y

    CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y
    CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=n
    CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH=n

    CONFIG_GPIO=y
    CONFIG_ADC=y
    CONFIG_NRFX_GRTC=y
    CONFIG_PWM=y
    CONFIG_PM_DEVICE=y
    CONFIG_PM_DEVICE_RUNTIME=y
    CONFIG_PM_POLICY_DEFAULT=n
    CONFIG_PM=n

    CONFIG_HEAP_MEM_POOL_SIZE=0
    CONFIG_CRC=y
    CONFIG_WATCHDOG=y

  • .. and 92uA current with all external components not mounted. And:

    int main(void)
    {

        while(1) k_sem_take(&main_sem, K_FOREVER);
    ....
    .}
    On DK the current was similar..
     I have changed: to:
    CONFIG_PM_POLICY_DEFAULT=y
    CONFIG_PM=y
     
    but current is the same...
  • maybe it is a problem but in zepghyr.dts

    /* node '/soc/peripheral@50000000/regulator@120000' defined in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:710 */
    regulators: regulator@120000 {
    compatible = "nordic,nrf54l-regulators"; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:711 */
    reg = < 0x120000 0x1000 >; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:712 */
    status = "disabled"; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:713 */
    #address-cells = < 0x1 >; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:714 */
    #size-cells = < 0x1 >; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:715 */

    /* node '/soc/peripheral@50000000/regulator@120000/regulator@120600' defined in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:717 */
    vregmain: regulator@120600 {
    compatible = "nordic,nrf5x-regulator"; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:718 */
    reg = < 0x120600 0x1 >; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:719 */
    status = "disabled"; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:720 */
    regulator-name = "VREGMAIN"; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:721 */
    regulator-initial-mode = < 0x0 >; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:722 */
    };
    };

    looks like regulator DC DC is off

Reply
  • maybe it is a problem but in zepghyr.dts

    /* node '/soc/peripheral@50000000/regulator@120000' defined in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:710 */
    regulators: regulator@120000 {
    compatible = "nordic,nrf54l-regulators"; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:711 */
    reg = < 0x120000 0x1000 >; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:712 */
    status = "disabled"; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:713 */
    #address-cells = < 0x1 >; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:714 */
    #size-cells = < 0x1 >; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:715 */

    /* node '/soc/peripheral@50000000/regulator@120000/regulator@120600' defined in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:717 */
    vregmain: regulator@120600 {
    compatible = "nordic,nrf5x-regulator"; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:718 */
    reg = < 0x120600 0x1 >; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:719 */
    status = "disabled"; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:720 */
    regulator-name = "VREGMAIN"; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:721 */
    regulator-initial-mode = < 0x0 >; /* in zephyr\dts\vendor\nordic\nrf54l_05_10_15.dtsi:722 */
    };
    };

    looks like regulator DC DC is off

Children
No Data
Related