Describe the bug
When trying to sleep core on NRF52805 using low frequency internal rc oscillator, average current consumption is ~189.50 uA while when using external crystal oscillator, average current consumption is ~ 8 uA.
I can't provide actual application code that I'm running, however, the only difference at Kconfig level it's whether to decide which low frequency crystal is used. I tried to get into the errata section to find out if it was something related to it but it doesn't. Also, I do not have UART enabled, and verification have been made to confirm that there is no GPIO line floating.
How to reproduce
Chip model: NRF52805 CAAA
os: Linux / GNU
sdk-nrf tag: v1.5.1, v1.4.0
Microcontroller is using System ON and DC-DC is enabled
- Use internal rc crystal oscillator
- remove extra capacitors and crystal connected to xtal pins
- leave extra capacitors and crystal connected to xtal pins
- Measure current consumption going into NRF52805
- prj.conf:
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=n CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH=n
- Extra configurations:
CONFIG_CLOCK_CONTROL_NRF_CALIBRATION_LF_ALWAYS_ON=n
- When device sleeps and debugger is connected these are the register values:
Fields in CLOCK > LFCLKSTAT: SRC: RC 32.768 kHz RC oscillator - Source of LFCLK STATE: Running LFCLK running - LFCLK state Fields in CLOCK > HFCLKSTAT: SRC: RC 64 MHz internal oscillator (HFINT) - Source of HFCLK STATE: Running HFCLK running - HFCLK state Fields in CLOCK > LFCLKSRC: SRC: RC 32.768 kHz RC oscillator - Clock source Fields in CLOCK > HFCLKSTAT: SRC: RC 64 MHz internal oscillator (HFINT) - Source of HFCLK STATE: Running HFCLK running - HFCLK state
One way to quickly reproduce the behavior it's modifying system off sample on zephyr samples:
/* * Copyright (c) 2019 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #include <stdio.h> #include <zephyr.h> #include <device.h> #include <init.h> #include <power/power.h> #include <hal/nrf_gpio.h> #define CONSOLE_LABEL DT_LABEL(DT_CHOSEN(zephyr_console)) /* Prevent deep sleep (system off) from being entered on long timeouts * or `K_FOREVER` due to the default residency policy. * * This has to be done before anything tries to sleep, which means * before the threading system starts up between PRE_KERNEL_2 and * POST_KERNEL. Do it at the start of PRE_KERNEL_2. */ static int disable_ds_1(const struct device *dev) { ARG_UNUSED(dev); pm_ctrl_disable_state(POWER_STATE_DEEP_SLEEP_1); return 0; } SYS_INIT(disable_ds_1, PRE_KERNEL_2, 0); void main(void) { int rc; uint8_t i; const struct device *all_devices; static volatile uint16_t devices_count; devices_count = z_device_get_all_static(&all_devices); for(i = 0; i < devices_count; ++i) { rc = device_set_power_state(&(all_devices[i]), DEVICE_PM_LOW_POWER_STATE, 0, 0); } k_sleep(K_MSEC(1000000)); printk("ERROR: System off failed\n"); while (true) { /* spin to avoid fall-off behavior */ } }
Expected behavior
To have similar results on current consumption as when using external crystal oscillator with slightly offset.