nRF52832 high current consumption

Hi folks, 

I am using zephyr sdk version 2.7.0 with a custom board that integrates a nrf52832, an ens210 sensor for temperature and humidity and lis3dh sensor for accelerations.

Both sensors communicate with i2c0 and i2c1, in my project the lis3dh works with the sensor_attr_set(sensor, trig.chan, SENSOR_ATTR_SLOPE_TH, &thresh) mode and I also have a timer1 that creates interrupts every hour.

In my main I have a state machine where the code blocks at the k_poll() function, awakened by the two signals that come from either the timer1 or the accelerometer lis3dh.

The consumption is around 400 uA, I should have consumption equal to 4-7 uA.

I have set in the prj

CONFIG_BT=y
CONFIG_BT_SMP=y
CONFIG_BT_DEVICE_NAME="IoT ABB"
CONFIG_FILE_SYSTEM=y
CONFIG_BT_SIGNING=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DIS=y
CONFIG_BT_ATT_PREPARE_COUNT=5
CONFIG_BT_PRIVACY=y
CONFIG_BT_DEVICE_APPEARANCE=833
CONFIG_BT_DEVICE_NAME_DYNAMIC=y
CONFIG_BT_DEVICE_NAME_MAX=65
CONFIG_BT_KEYS_OVERWRITE_OLDEST=y
CONFIG_BT_L2CAP_TX_MTU=247
CONFIG_BT_MAX_PAIRED=2
CONFIG_FLASH=y
CONFIG_FLASH_MAP=y
CONFIG_TRACING=y
CONFIG_LOG=n
CONFIG_SETTINGS=y
CONFIG_FILE_SYSTEM_LITTLEFS=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_RESET_ON_FATAL_ERROR=y
CONFIG_COUNTER=y
CONFIG_REBOOT=y
CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_SENSOR=y
CONFIG_LIS2DH=y
CONFIG_LIS2DH_TRIGGER_GLOBAL_THREAD=y
CONFIG_LIS2DH_ACCEL_RANGE_8G=y
CONFIG_RTT_CONSOLE=n
CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_SIZE_OPTIMIZATIONS=y
CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y
CONFIG_BT_BUF_ACL_RX_SIZE=251
CONFIG_PM=y
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y
CONFIG_PM_STATS=y
CONFIG_STATS=y
CONFIG_DEBUG=n
CONFIG_LIS2DH_OPER_MODE_LOW_POWER=y
CONFIG_PM_CPU_OPS=y

Do you have any advice on how to reach these consumptions? Is the function k_poll() correct for standby or is there another way?

Here my main:

typedef enum{
    INIT,
    SLEEP,
    INIT_BLE,
    STOP_BLE,
    ACTIVE_BLE,
    WRITE
}sm_state_e;
sm_state_e sm_state = INIT;
static bool active_ble = false;

static struct k_poll_signal sensor_signal = K_POLL_SIGNAL_INITIALIZER(sensor_signal);
static struct k_poll_signal button_signal = K_POLL_SIGNAL_INITIALIZER(button_signal);
static struct k_poll_event events[2];

uint8_t get_sm_state(void)
{
    return (uint8_t)sm_state;
}

void notify_sensor_irq(void)
{
    k_poll_signal_raise(&sensor_signal, 0);
}

void notify_button_pressed(void)
{
    k_poll_signal_raise(&button_signal, 0);
}

int main(void)
{  
    k_msleep(2000);
    int ret;
    events[0].signal = &sensor_signal;
    events[0].type = K_POLL_TYPE_SIGNAL;
    events[0].mode = K_POLL_MODE_NOTIFY_ONLY;

    events[1].signal = &button_signal;
    events[1].type = K_POLL_TYPE_SIGNAL;
    events[1].mode = K_POLL_MODE_NOTIFY_ONLY;
    while (1)
    {
        switch (sm_state)
        {
            case INIT:

                ret = gpio_initialise();
                if (ret != 0)
                {
                    sys_reboot(SYS_REBOOT_COLD);
                }      
                k_msleep(2000);

                ret = memory_init();
                if (ret != 0)
                {
                    sys_reboot(SYS_REBOOT_COLD);
                }
                k_msleep(3000);

                ret = initialise_sensor();
                if (ret != 0)
                {
                    sys_reboot(SYS_REBOOT_COLD);
                }
                k_msleep(2000);

                ret = start_timer();
                if (ret != 0)
                {
                    sys_reboot(SYS_REBOOT_COLD);
                }
                k_msleep(1000);
                sm_state = SLEEP;
                break;
            case SLEEP:
                set_button_pressed_state(0);
                set_sensor_irq(0);
                sm_state = SLEEP;
                k_poll(events, 2, K_FOREVER);
                k_poll_signal_reset(&sensor_signal);
                k_poll_signal_reset(&button_signal);
                if (1 == get_sensor_irq())
                {
                    set_sensor_irq(0);
                    get_measure_temperature();
                }
                else if (2 == get_sensor_irq())
                {
                    set_sensor_irq(0);
                    get_measure_temperature();
                    sm_state = WRITE;
                }

                if (1 == get_button_pressed_state())
                {
                    erase_flash();
                    set_button_pressed_state(0);
                    sys_reboot(SYS_REBOOT_COLD);
                }
                else if (2 == get_button_pressed_state())
                {
                    set_button_pressed_state(0);
                    sm_state = INIT_BLE;
                }
                break;
            case INIT_BLE:
                static bool first_ble_init = false;
                if (!first_ble_init)
                {
                    ret = initialise_first_ble();
                }
                else
                {
                    ret = initialise_ble();                
                }

                if (ret != 0)
                {
                    sm_state = SLEEP;
                }
                else
                {
                    first_ble_init = true;
                    active_ble = true;
                    ble_time = k_uptime_get();
                    sm_state = ACTIVE_BLE;
                }                  
                break;
            case STOP_BLE:
                bt_disable();
                set_gpio_led_zero(1);
                sm_state = SLEEP;
                break;
            case ACTIVE_BLE:
                set_gpio_led_zero(0);
                while(active_ble == true)
                {
                    if (1 == get_sensor_irq())
                    {
                        set_sensor_irq(0);
                        get_measure_temperature();
                    }
                    else if (2 == get_sensor_irq())
                    {
                        while(true == get_device_connected())
                        {
                            k_msleep(500);
                        }
                        set_sensor_irq(0);
                        get_measure_temperature();
                        write_measures();
                    }

                    if (2 == get_button_pressed_state())
                    {
                        set_button_pressed_state(0);
                    }
                    else if (1 == get_button_pressed_state())
                    {
                        while(true == get_device_connected())
                        {
                            k_msleep(500);
                        }
                        erase_flash();
                        set_button_pressed_state(0);
                        sys_reboot(SYS_REBOOT_COLD);
                    }

                    int64_t ble_release_time = k_uptime_get();
                    int64_t ble_duration = ble_release_time - ble_time;
                    if (ble_duration >= TIMER_INTERVAL_MS)
                    {
                        active_ble = false;
                    }
                    k_msleep(1000);
                }
                sm_state = STOP_BLE;
                break;
            case WRITE:
                write_measures();
                sm_state = SLEEP;
            break;
            default:
                break;
        }  
        k_msleep(500);
    }
    return 0;
}
Related