Hello,
I am exploring power management on the nRF54L15 DK with nRF Connect SDK v2.8.0 (Zephyr v3.7.99).
My goal is to:
-
Enter deep sleep / system off mode.
-
Wake up on an external GPIO interrupt ( Interrupt from LSM6DSL IMU Sensor).
What I tried so far
-
Tested with LSM6DSL IMU interrupt connected to the DK.
-
When the system is running normally (no sleep), the LSM6DSL interrupt is firing correctly.
-
But when entering system off / sleep, the interrupt does not wake the device.
- Tried with k_sleep(K_FOREVER) and sys_poweroff(). for both interrupt is not waking up the device
-
-
Tested the system off demo sample (as-is from the SDK).
-
It enters system off successfully.
-
However, wakeup from Button0 (sw0) did not work on the nRF54L15 DK.
-
-
Tried adding
wakeup-source;property in a device tree overlay:
/ {
button0 {
wakeup-source;
};
};Still no wakeup on button press.
Environment
- Board: nRF54L15 DK
- NCS: v2.8.0
- Toolchain: VS Code + west build
Questions
- What is the recommended way to implement deep sleep with interrupt-driven wakeup on nRF54L15?
- Are there additional device tree settings or GPIOTE configurations required beyond
wakeup-source;? - Does GPIO wakeup from sleep / system off currently work on nRF54L15 DK, or is this feature still pending support?
- Are there reference examples or low power samples for nRF54l15 showing interrupt-driven wakeup?

-
lsm6dsl interrupt configure code snippet
int configure_lsm6dsl_interrupt(void){int rc;LOG_INF("Configuring LSM6DSL GPIO interrupt...");
if (!device_is_ready(int_gpio.port)) {LOG_ERR("GPIO device not ready");return -ENODEV;}
LOG_INF("GPIO device ready, configuring pin gpio %s, %d as input", int_gpio.port->name, int_gpio.pin);rc = gpio_pin_configure_dt(&int_gpio, GPIO_INPUT); // GPIO_PULL_DOWNif (rc) {LOG_ERR("Failed to configure GPIO pin %d: %d", int_gpio.pin, rc);return rc;}
LOG_INF("Initializing GPIO callback structure...");//gpio_init_callback(&lsm_int_cb, lsm6dsl_no_motion_isr, 1U << int_gpio.pin);gpio_init_callback(&lsm_int_cb, lsm6dsl_no_motion_isr, BIT(int_gpio.pin));
LOG_INF("Adding GPIO callback to port...");rc = gpio_add_callback(int_gpio.port, &lsm_int_cb);if (rc) {LOG_ERR("Failed to add GPIO callback: %d", rc);return rc;}
LOG_INF("Enabling edge interrupt on GPIO pin...");rc = gpio_pin_interrupt_configure_dt(&int_gpio, GPIO_INT_LEVEL_HIGH | GPIO_INT_WAKEUP); //GPIO_INT_EDGE_TO_ACTIVE //GPIO_INT_LEVEL_ACTIVE //GPIO_INT_LEVEL_HIGHif (rc) {LOG_ERR("Failed to configure GPIO interrupt: %d", rc);return rc;}
LOG_INF("LSM6DSL GPIO interrupt configured successfully on pin %d", int_gpio.pin);
uint32_t abs_pin = NRF_DT_GPIOS_TO_PSEL(DT_NODELABEL(lsm6dsl), irq_gpios);uint32_t sense = nrf_gpio_pin_sense_get(abs_pin);printk("Pin %d sense setting: %d\n", abs_pin, sense);printk(" NRF_GPIO_PIN_NOSENSE = %d\n", NRF_GPIO_PIN_NOSENSE);printk(" NRF_GPIO_PIN_SENSE_LOW = %d\n", NRF_GPIO_PIN_SENSE_LOW);printk(" NRF_GPIO_PIN_SENSE_HIGH= %d\n", NRF_GPIO_PIN_SENSE_HIGH);
return 0;}