Is lowest power consumption of 1.2uA possible using nrf52832 & SYSTEM_ON (s132, SDK17) for GATTS - Central

Hi nRF community,

I have a question regarding the lowest power consumption ever possible with nRF52832 chip.

I'm experimenting with power consumption using nRF52832 DK (PCA10040 1.2.1), talking to another nRF52832DK.

I run a central (based on GATTS example) scanning for my peripheral, I use SDK17.1 + S132.

The SDK is configured to have no logs and external interfaces, and most of the peripherals are disabled + I use DCDC.

After the BLE initialization is complete I set up the interrupt event for GPIOTE.

The entire thing is configured and run's properly for the BLE piece but I want it to have a smaller consumption while I'm in idle state (during __WFE()).

Before entering the main loop I call "  sd_power_mode_set(NRF_POWER_MODE_LOWPWR) " function and basicly wait for an event on the interrupt to start scanning.

Currently according to nRF PPK2 I'm consuming around 18 microamps, but the question is can I get it 10 times smaller, like 1.2 ~ 2 uA (microamps)?

What other peripherals I can disable if I use SoftDevice and BLE ? 

Regards, 

Dmytro.

Parents Reply Children
  • Hi Edvin,

    Regarding your quetion's : 

    I have most of application modules enabled (the code I execute is listed below)

    int main(void)
    {
        // Initialize.
        external_interrupt_init();     // Enable external event on rising pulse edge (lo-to-hi)
        power_management_init();     // Init power manager
        ble_stack_init();     // Init the BLE stack
        gatt_init();     // Init GATT's
        services_init();     // Init BLE services + characteristic
        scan_init();     // Init BLE Scan module
        sd_power_mode_set(NRF_POWER_MODE_LOWPWR);     // Configre power manager to keep LP mode

        // Enter main loop.
        for (;;) {
            my_state_machine(); // State machine that starts scan on interrupt event
            APP_ERROR_CHECK(sd_app_evt_wait()); // Power mamnger __WFE
       }
    }

    When I have SoftDevice enabled + GATT + Service + scan init + GPIOTE - I have 18 uA consumption.

    I need to get the lowest consumption for the SYSTEM_ON mode described in nRF52832 1.8 PS

    https://infocenter.nordicsemi.com/pdf/nRF52832_PS_v1.8.pdf - page 80.

    It is stated that SYSTEM_ON full ram retention [no ram retention] is 1.5 uA [1.2 uA] only, how can I get my system to consume that little power?

  • Hello,

    I don't know what your state machine does. But you are not scanning at this point in time (when you are doing the measurements)? Also, you are using sd_app_evt_wait(), and not __WFE(). Good.

    Are you powering any other peripherals? Are any GPIOs set to output? Are you powering any other devices from the nRF? Are the LEDs configured as outputs?

    Is there any way for me to reproduce what you are seeing? 

    And how are you measuring the current consumption? Do you have a PPK II? Or are you using a multimeter?

    BR,

    Edvin 

  • Hi again, 

    So regarding state machine : it does a classic case/switch job. The variable is changed in the GPIOTE interrupt to "1" and processed in the state machine in the main loop afterwards. If variable is set to "1" I start scanning. Initially the variable is set to 0.

    No, I don't use any other peripheral with nRF52832DK, just the DK it self.

    I don't use GPIO's except for the PIN 0.27, which is GPIOTE event monitoring pin.

    The LED's and Buttons are already removed from the project, along with UART and other interfces.

    Yes, I use nRF PPK 2 device to measure the power consumption.

    Is there a way to turn off (stop or pause) the SoftDevice and it's peripherals to reduce consumption, and turn them back on when needed?

    Is there any example of the soft device on the fly init and deinit ?

  • dmytro.m said:
     If variable is set to "1" I start scanning. Initially the variable is set to 0.

    Can you please show me some snippets on how it is set, and how it is checked?

    The SoftDevice shouldn't use more power if you are not using it for anything. That being said, it is possible to disable the softdevice. Please check out the declaration of sd_softdevice_disable() in nrf_sdm.h.

    Do you see a different current consumption if you do not enable the SoftDevice in the first place?

    BR,
    Edvin

  • Hi Edvin, sure I can share my code, I applied some additional efforts to get you the way to reproduce it.

    Not to deal with my messy experimental code I did some basic changes in the nRF SDK17 example for GATT's central that initially was used ( I took it from here "nRF5_SDK_17.1.0_ddde560\examples\ble_central\ble_app_gatts") and got pretty same result of ~22 uA. I also have added the snippet for state machine that does the scanning, added my interrupt pin init function and handler to trigger the state machine, added couple of variables and definitions and comented out couple of lines (attaching "main.c" in .zip). The most changes were made in the "sdk_config.h", they are the following (attaching my "sdk_config.h" file in .zip):

    BSP_BTN_BLE_ENABLED 0

    NRFX_POWER_ENABLED 1

    NRFX_UARTE_ENABLED 0

    NRFX_UART_ENABLED 0

    POWER_ENABLED 1

    POWER_CONFIG_DEFAULT_DCDCEN 1

    UART_ENABLED 0

    UART0_ENABLED 0

    APP_TIMER_ENABLED 0

    BUTTON_ENABLED 0

    NRF_LOG_BACKEND_UART_ENABLED 0

    NRF_LOG_ENABLED 0

    NRF_SDH_BLE_LOG_ENABLED 0

    NRF_SDH_LOG_ENABLED 0

    NRF_SDH_SOC_LOG_ENABLED 0

    PM_LOG_ENABLED 0

    To trigger the interrupt event - Dupont wire need to be applied from P0.27 to a VDD pin.

    To build the entire thing I use IAR IDE ( EWB 4 ARM 8.32.2 )

    So the question is - what else need to be done with the sdk.config or what ever in the code to make it consume 1.2 uA ?

    I did a quick test on my project and used "sd_softdevice_disable()" but have not noticed any change in the consumption, so the question is still open.

    Kind regards, Dmytro.

    ble_app_gatts.zip

Related