I am currently using ncs 2.9.0 on a custom board using the internal ldo and internal clock settings. It is a simple project where I take and indicate an adc and internal temperature measurement every 4 seconds, and toggle a GPIO over BLE. Using the power profiler I get an idle current of around 110 uA when powered at 3.0 V. I believe it is a software problem because around 2 months ago, I used the same PCBs to get an idle current below 5 uA, and after some software changes I am not able to get back to that level again.
I have disabled all unused peripherals including UART in the nrf52dk_nrf52832.overlay file.
/*
* SPDX-License-Identifier: Apache-2.0
*
* Copyright (c) 2022 Nordic Semiconductor ASA
*/
/* STEP 2.2 - Create a zephyr,user node and set it’s io-channels to the ADC channel */
/ {
zephyr,user {
io-channels = <&adc 0>;
};
};
/* STEP 2.3 -Configure the ADC channel */
&adc {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
channel@0 { // CHANNEL at 0 means we are using ADC0
reg = <0>;
zephyr,gain = "ADC_GAIN_1_6";
zephyr,reference = "ADC_REF_INTERNAL";
zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
zephyr,input-positive = <NRF_SAADC_AIN3>; /* P0.02 for nRF52xx, P0.04 for nRF5340 */
zephyr,resolution = <12>;
};
};
&uart0 {
status = "disabled";
};
/*&uart0_default {
group1 {
psels = <NRF_PSEL(UART_TX, 0, 6)>,
<NRF_PSEL(UART_RX, 0, 1)>,
<NRF_PSEL(UART_RTS, 0, 5)>,
<NRF_PSEL(UART_CTS, 0, 7)>;
};
};*/
&pwm0 {
status = "disabled";
};
&power {
status = "okay";
};
&led0 {
status = "disabled";
};
&led1 {
status = "disabled";
};
&led2 {
status = "disabled";
};
&led3 {
status = "disabled";
};
&button0 {
status = "disabled";
};
&button1 {
status = "disabled";
};
&button2 {
status = "disabled";
};
&button3 {
status = "disabled";
};
&spi0 {
status = "disabled";
};
&spi1 {
status = "disabled";
};
&spi2 {
status = "disabled";
};
&i2c0 {
status = "disabled";
};
&i2c1 {
status = "disabled";
};
&i2s0 {
status = "disabled";
};
I turned off many things in the prj.conf file
#---------------------------------------- # Disable boot banners and console output #---------------------------------------- CONFIG_NCS_BOOT_BANNER=n # Disable NCS-specific banner CONFIG_BOOT_BANNER=n # Disable Zephyr’s own boot banner CONFIG_EARLY_CONSOLE=n CONFIG_CONSOLE=n CONFIG_SERIAL=n CONFIG_UART_CONSOLE=n CONFIG_RTT_CONSOLE=n CONFIG_USE_SEGGER_RTT=n #----------------------- # Power Management #----------------------- CONFIG_PM=y CONFIG_PM_DEVICE=y CONFIG_PM_DEVICE_RUNTIME=y #------------------------------------------------- # Clock control (internal RC oscillator settings) # for EYSHSNZWZ (Nordic nRF chip) #------------------------------------------------- CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC_CALIBRATION=y CONFIG_CLOCK_CONTROL_NRF_CALIBRATION_LF_ALWAYS_ON=y #------------------------------ # Logging and Debug Options #------------------------------ CONFIG_LOG=n CONFIG_LOG_MODE_MINIMAL=n CONFIG_PRINTK=n CONFIG_ASSERT=n CONFIG_DEBUG_OPTIMIZATIONS=n # Disable Nordic Cloud logging details CONFIG_NRF_CLOUD_LOG_OUTPUT_LEVEL=0 CONFIG_NRF_CLOUD_PRINT_DETAILS=n CONFIG_NRF_CLOUD_VERBOSE_DETAILS=n # Disable DK library (LEDs, buttons, etc.) CONFIG_DK_LIBRARY=n #------------------------------------ # ADC and Floating-Point Support #------------------------------------ CONFIG_ADC=y CONFIG_CBPRINTF_FP_SUPPORT=n CONFIG_FPU=n #---------------------------- # Bluetooth Configuration #---------------------------- CONFIG_BT=y CONFIG_BT_SMP=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_DIS=y CONFIG_BT_DIS_PNP=n CONFIG_BT_BAS=n # Device identification over BLE CONFIG_BT_DEVICE_NAME="device" CONFIG_BT_DEVICE_APPEARANCE=768 # 768 = generic thermometer. I confirmed in the build->.config file that all logging/printing configurations are not set.
In the main code, at an attempt to debug, I also manually pulled all unused GPIOs down
static const struct gpio_dt_spec wrt_spec = {
.port = DEVICE_DT_GET(DT_NODELABEL(gpio0)),
.pin = WRITE_GPIO_PIN,
.dt_flags = GPIO_ACTIVE_HIGH
};
static int init_GPIO(void)
{
int err;
int ret;
// GPIO init and config
// return 0 means not ready
err = gpio_is_ready_dt(&wrt_spec);
if (!err) {
//LOG_ERR("Error: WRITE GPIO is not ready, err: %d", err);
return -ENODEV;
}
// return 0 means successful
ret = gpio_pin_configure_dt(&wrt_spec, GPIO_OUTPUT_INACTIVE);
if (ret < 0) {
return ret;
//LOG_ERR("Error: Unable to configure WRITE GPIO pin, err: %d\n", ret);
}
/* Configure all other P0.X pins as outputs and drive low */
for (uint32_t pin = 0; pin < 32; pin++) {
if (pin == WRITE_GPIO_PIN || pin == 5) {
continue;
}
nrf_gpio_cfg_output(pin);
nrf_gpio_pin_clear(pin);
}
return 0;
}.
Please help!!