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

Parents
  • 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,

    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

Reply
  • 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

Children
No Data
Related