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!

  • 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

Related