nRF5340 low power on example peripheral_lbs ncs v1.6.1

Dear,

        I followed the ticket below to set peripheral_lbs for nRF5340.

but still cannot see the 8uA in power consumption.Would you help?

I also use nRF5340DK and multi-meter to measure the current in ncs v1.6.1.

https://devzone.nordicsemi.com/f/nordic-q-a/79490/nrf5340-dk-low-power-configuration-issues

  Attached my main.c and prj.conf and prj_minimal.conf.

at least I simply setup the BLE and handlers and then call:

for (;;) {
k_cpu_idle();
}

I am not sure whether need to add spm.conf and add add below change to the CMakeLists.txt

set(spm_CONF_FILE ${CMAKE_CURRENT_SOURCE_DIR}/spm.conf)

          I also not sure whether need to make the 3 change below:

Would you teach me how to add if need ?

1...I have added hci_rpmsg.conf in a folder in named child_image as described, copied ncs\v1.6.1\zephyr\samples\bluetooth\hci_rpmsg in and changed LOG and SERIAL to n

2.Added the following to my prj.conf

CONFIG_PM=y
CONFIG_PM_DEVICE=y

3.Disabled Uart0 and Uart1 in nrf5340dk_nrf5340_cpuappns.overlay

&uart0{

status="disabled";
};

&uart1{

status="disabled";
};

4.CONFIG_PM 


void pm_power_state_set(struct pm_state_info info)

/*
 * Copyright (c) 2018 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 */

#include <zephyr/types.h>
#include <stddef.h>
#include <string.h>
#include <errno.h>
#include <sys/printk.h>
#include <sys/byteorder.h>
#include <zephyr.h>
#include <drivers/gpio.h>
#include <soc.h>

#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/conn.h>
#include <bluetooth/uuid.h>
#include <bluetooth/gatt.h>

#include <bluetooth/services/lbs.h>

#include <settings/settings.h>

#include <dk_buttons_and_leds.h>

#include <device.h>
#include "power/power.h"

#define DEVICE_NAME             CONFIG_BT_DEVICE_NAME
#define DEVICE_NAME_LEN         (sizeof(DEVICE_NAME) - 1)


#define RUN_STATUS_LED          DK_LED1
#define CON_STATUS_LED          DK_LED2
#define RUN_LED_BLINK_INTERVAL  1000

#define USER_LED                DK_LED3

#define USER_BUTTON             DK_BTN1_MSK

#define BT_LE_ADV_CONN_TEST BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE, \
				            BT_GAP_ADV_SLOW_INT_MAX, \
				            BT_GAP_ADV_SLOW_INT_MAX, NULL)

const struct device *console, *uart1;

static bool app_button_state;

static const struct bt_data ad[] = {
	BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
	BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
};

static const struct bt_data sd[] = {
	BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_LBS_VAL),
};

static void connected(struct bt_conn *conn, uint8_t err)
{
	if (err) {
		printk("Connection failed (err %u)\n", err);
		return;
	}

	printk("Connected\n");

	dk_set_led_on(CON_STATUS_LED);
}

static void disconnected(struct bt_conn *conn, uint8_t reason)
{
	printk("Disconnected (reason %u)\n", reason);

	dk_set_led_off(CON_STATUS_LED);
}

#ifdef CONFIG_BT_LBS_SECURITY_ENABLED
static void security_changed(struct bt_conn *conn, bt_security_t level,
			     enum bt_security_err err)
{
	char addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	if (!err) {
		printk("Security changed: %s level %u\n", addr, level);
	} else {
		printk("Security failed: %s level %u err %d\n", addr, level,
			err);
	}
}
#endif

static struct bt_conn_cb conn_callbacks = {
	.connected        = connected,
	.disconnected     = disconnected,
#ifdef CONFIG_BT_LBS_SECURITY_ENABLED
	.security_changed = security_changed,
#endif
};

#if defined(CONFIG_BT_LBS_SECURITY_ENABLED)
static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey)
{
	char addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	printk("Passkey for %s: %06u\n", addr, passkey);
}

static void auth_cancel(struct bt_conn *conn)
{
	char addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	printk("Pairing cancelled: %s\n", addr);
}

static void pairing_confirm(struct bt_conn *conn)
{
	char addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	bt_conn_auth_pairing_confirm(conn);

	printk("Pairing confirmed: %s\n", addr);
}

static void pairing_complete(struct bt_conn *conn, bool bonded)
{
	char addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	printk("Pairing completed: %s, bonded: %d\n", addr, bonded);
}

static void pairing_failed(struct bt_conn *conn, enum bt_security_err reason)
{
	char addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	printk("Pairing failed conn: %s, reason %d\n", addr, reason);
}

static struct bt_conn_auth_cb conn_auth_callbacks = {
	.passkey_display = auth_passkey_display,
	.cancel = auth_cancel,
	.pairing_confirm = pairing_confirm,
	.pairing_complete = pairing_complete,
	.pairing_failed = pairing_failed
};
#else
static struct bt_conn_auth_cb conn_auth_callbacks;
#endif

static void app_led_cb(bool led_state)
{
	dk_set_led(USER_LED, led_state);
}

static bool app_button_cb(void)
{
	return app_button_state;
}

static struct bt_lbs_cb lbs_callbacs = {
	.led_cb    = app_led_cb,
	.button_cb = app_button_cb,
};

static void button_changed(uint32_t button_state, uint32_t has_changed)
{
	if (has_changed & USER_BUTTON) {
		bt_lbs_send_button_state(button_state);
		app_button_state = button_state ? true : false;
	}
}

static int init_button(void)
{
	int err;

	err = dk_buttons_init(button_changed);
	if (err) {
		printk("Cannot init buttons (err: %d)\n", err);
	}

	return err;                                                                                                                                                                                                                                              
}

void main(void)
{       
        int blink_status = 0;
	int err;

	printk("Starting Bluetooth Peripheral LBS example\n");

	err = dk_leds_init();
	if (err) {
		printk("LEDs init failed (err %d)\n", err);
		return;
	}

	err = init_button();
	if (err) {
	    printk("Button init failed (err %d)\n", err);
	    return;
	}

	bt_conn_cb_register(&conn_callbacks);
	if (IS_ENABLED(CONFIG_BT_LBS_SECURITY_ENABLED)) {
	    bt_conn_auth_cb_register(&conn_auth_callbacks);
	}

	err = bt_enable(NULL);
	if (err) {
		printk("Bluetooth init failed (err %d)\n", err);
		return;
	}

	printk("Bluetooth initialized\n");

	if (IS_ENABLED(CONFIG_SETTINGS)) {
		settings_load();
	}

	err = bt_lbs_init(&lbs_callbacs);
	if (err) {
		printk("Failed to init LBS (err:%d)\n", err);
		return;
	}

	err = bt_le_adv_start(BT_LE_ADV_CONN_TEST, ad, ARRAY_SIZE(ad),
			      sd, ARRAY_SIZE(sd));
	if (err) {
		printk("Advertising failed to start (err %d)\n", err);
		return;
	}

	printk("Advertising successfully started\n");

	for (;;) {
		//dk_set_led(RUN_STATUS_LED, (++blink_status) % 2);
                //dk_set_led(RUN_STATUS_LED, 0);
		//k_sleep(K_MSEC(RUN_LED_BLINK_INTERVAL));
                k_cpu_idle();
	}
}

27227.prj.conf

prj_minimal.conf

Parents
  • Hi, 

    I have some questions after a quick look but haven't tested. 

    1...I have added hci_rpmsg.conf in a folder in named child_image as described, copied ncs\v1.6.1\zephyr\samples\bluetooth\hci_rpmsg in and changed LOG and SERIAL to n

    hci_rpmsg.conf should be located under peripheral_lbs\child_image. 

    2.Added the following to my prj.conf

    I see the CONFIG_PM=y and CONFIG_PM_DEVICE=y are added into your prj_minimal.conf instead of the prj.conf. Do you build with the prj_minimal.conf as this Minimal build section? What do you use to build the project, Segger, VScode or west build? How do you set to build with the prj_minimal.conf? 

    3.Disabled Uart0 and Uart1 in nrf5340dk_nrf5340_cpuappns.overlay

    Could you double-check that it was really built with the overlay? Just want to make sure the overlay is sourced. 

    Are you using PPK2? Do you cut SB40 as the Preparing the nRF5340 DK section described? What is the HW version (on the white sticker) of the nRF5340DK?

    Regards,
    Amanda 

Reply
  • Hi, 

    I have some questions after a quick look but haven't tested. 

    1...I have added hci_rpmsg.conf in a folder in named child_image as described, copied ncs\v1.6.1\zephyr\samples\bluetooth\hci_rpmsg in and changed LOG and SERIAL to n

    hci_rpmsg.conf should be located under peripheral_lbs\child_image. 

    2.Added the following to my prj.conf

    I see the CONFIG_PM=y and CONFIG_PM_DEVICE=y are added into your prj_minimal.conf instead of the prj.conf. Do you build with the prj_minimal.conf as this Minimal build section? What do you use to build the project, Segger, VScode or west build? How do you set to build with the prj_minimal.conf? 

    3.Disabled Uart0 and Uart1 in nrf5340dk_nrf5340_cpuappns.overlay

    Could you double-check that it was really built with the overlay? Just want to make sure the overlay is sourced. 

    Are you using PPK2? Do you cut SB40 as the Preparing the nRF5340 DK section described? What is the HW version (on the white sticker) of the nRF5340DK?

    Regards,
    Amanda 

Children
Related