This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Rigado BMD-340 - NRF52840 sleep current

Hi,

I'm trying to get my NRF52840 to minimum current in sleep, but got stuck around 440 uA. Reading through the various posts about sleep current for this type of device, the sleep current should be around 120 uA, which is 4x lower than what I obtain.

I already tried to turn of modules in the config file, without result.

Is there something I can change in the config file in order to go to a lower current?

The main loop just has

__WFE();
NRF_POWER->SYSTEMOFF = 1;

Here my config file:

sdk_config.h

  • Hi

    I asked one of our Thread experts if there were any issues like this, and he says that in sleep with no TX/RX peaks, the current will stay below 5uA, so there should not be any issues with OpenThread in the 3.0.0 version of the Zigbee and Thread SDK.

    How are you measuring the current of your device? You can check out this guide for just about any way to reduce current consumption as well. Could you also show me what you do to disable/enable OpenThread?

    Best regards,

    Simon

  • The first thing you need to do before trying to optimize your firmware for power is to actually validate your hardware leakage.  This is done with an empty firmware running a __WFE() in a while loop.  It must run without a debugger connect to it.  If this is more than 5uA, you have hardware leaking some where.  Next step after is to find out which by turn off io devices one by one.  There is no point trying to optimize the firmware code if you don't know your hardware power profile.

  • Hi

    I ran our board with an empty firmware running for(;;){__WFE();}

    The power consumption shows 450mA, which should be a hardware leak. The plan is to further reduce the number of components and check if there is some further drop possible

  • Hi Simon,

    I checked the guide already, without major improvements

    In the mainloop, we have:

    // Enter main loop.
        while (true)
        {
          thread_instance_init();
    
          initUdpListenSocket();
          open_udp_socket();
          
          while(1)
          {
            nrf_drv_wdt_channel_feed(wdt_chan);
      
            if ( nus_sent == 1 )
            {
              NRF_LOG_INFO("Sending nus data" );
              nus_data_send(msgbuff+8, (uint16_t )datalength);
              nus_sent = 0;
            }
      
            if (NRF_LOG_PROCESS() == false  && !otTaskletsArePending(thread_ot_instance_get()))
            {
              thread_sleep();
            }
    
            thread_process();
            
            app_sched_execute();
            power_manage(); 
            
          }
    
          thread_instance_finalize();
        
      }

    To disable thread, I comment out call to thread init and process.

    Is there anything else that we can do?

  • Hi

    Do you have a DK available? You could flash the application to the DK and measure the current to see if it yields a similar result to what your custom chip is, to see if this is hardware or software-related. You can see how to measure current consumption on a DK in the DK user guide (chapter 9).

    Also, how are you measuring the current on your device? Are you using the PPK, a power analyzer, or something else?

    Best regards,

    Simon

Related