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

Intermittent High current consumption in sleep

I have a custom board based on NRF52811. Salient features:-

Both HF and LF crystals are present on board.

Power supply is 3.3V.

MCU DC-DC is enabled.

I am using Apache Mynewt OS for the software and to test the low power capability in sleep, there is a basic app setup which doesnt do anything so the OS puts the CPU in sleep.

The nominal current consumption is ~3-4uA which is acceptable, however after a period of ~2mins the current jumps to ~300uA and stays that way for another 2mins, after which it returns back to ~3-4uA. And this cycle keeps repeating. I checked the software and there are no tasks which wake up at 2mins to cause this consumption.

After going through the errata and forum I saw that there are quite few issues regarding Higher Iq in sleep. I checked all the errata mentioned in the doc and that doesnt seem to be the case.

Please let me know if any more details are required.

Thanks

Navaneeth

  • Hi Navaneeth

    Does your application use the radio for BLE or similar at all? How exactly do you put the device to sleep? Do you use the functions from the SDK to go to sleep, I.E. the idle_state_handle() which is used in most of our example projects. It prepares devices for sleep mode before calling the nrf_pwr_mgmt_run() function.

    This doesn't sound like any of our errata, but it might be that a timer wakes up for some reason after 2 minutes in your application.

    Best regards,

    Simon

  • Hi Simon,

    Thank you for your quick response.

    No I do not use any radio/BLE functionality. Basically this is all that is there in my main code. None of the timers are enabled nor is any other peripheral. Still I am seeing this periodic increase in Iq.

    int
    main(void)
    {

    while (1) {
    __DSB();
    __WFI();
    }
    // Should never come here.
    return 0;
    }
  • Hi again

    That sounds very strange indeed. Is there any reason you're using __DSB(); and __WFI(); instead of the more "conventional" loop?

        {
            __SEV();
            __WFE();
            __WFE();
        }

    But I don't see why this would make a difference. I'm not familiar with the OS you're using, can you confirm that the current consumption is the same using an Ampere-meter for instance? As this is better for long term current consumption over time?

    Best regards,

    Simon

  • Hi Simon,

    I will try to replicate this using the nrf sdk as well. 
    The current measurements were done using an Ammeter only. I did not clearly understand what you are referring to regarding measure using Ampere meter.

  • Hi Simon,

    There is no particular reason why I used __DSB(); and __WFI(); , its just how it was there in the OS that I am using.

    I have also tried with NRF SDK15.3 using the "examples\peripheral\blinky\pca10056e\blank\ses" project , however I am seeing the same behavior.

    /** @file
     *
     * @defgroup blinky_example_main main.c
     * @{
     * @ingroup blinky_example
     * @brief Blinky Example Application main file.
     *
     * This file contains the source code for a sample application to blink LEDs.
     *
     */
    
    #include <stdbool.h>
    #include <stdint.h>
    #include "nrf_delay.h"
    #include "boards.h"
    
    /**
     * @brief Function for application main entry.
     */
    int main(void)
    {
        /* Configure board. */
        //bsp_board_init(BSP_INIT_LEDS);
    
        /* Toggle LEDs. */
        while (true)
        {
            __DSB();
            __WFI();
            //for (int i = 0; i < LEDS_NUMBER; i++)
            //{
            //    bsp_board_led_invert(i);
            //    nrf_delay_ms(500);
            //}
        }
    }
    
    /**
     *@}
     **/

    Also tried using

    {
        __SEV();
        __WFE();
        __WFE();
    }

    instead of __DSB(); and __WFI();. But as you already mentioned that did not make a difference.

    Also will you be able to check this same code on a board at your end?

    Regards

    Navaneeth

Related