Commit 585cda13 authored by Oleh Kravchenko's avatar Oleh Kravchenko Committed by Chris Friedt
Browse files

soc: stm32l1x: Add support for sleep/stop/standby modes

Add stm32l1_disco and nucleo_l152re overlays for testing
sleep/stop/standby modes:
- samples/boards/st/power_mgmt/blinky;
- samples/boards/st/power_mgmt/wkup_pins;

I've measured consumption for each low-power mode:
- low-power sleep ~1.72mA;
- stop mode ~324uA;
- standby mode ~2.2 uA;

It's possible to use RTC as idle timer to exit from stop mode.

Signed-off-by: default avatarOleh Kravchenko <oleg@kaa.org.ua>
parent 9a9f0604
Loading
Loading
Loading
Loading
+45 −1
Changes for dts/arm/st/l1/stm32l1.dtsi: 45 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -16,11 +16,13 @@
#include <zephyr/dt-bindings/dma/stm32_dma.h>
#include <zephyr/dt-bindings/adc/stm32f4_adc.h>
#include <zephyr/dt-bindings/reset/stm32l1_reset.h>
#include <zephyr/dt-bindings/power/stm32_pwr.h>
#include <freq.h>

/ {
	chosen {
		zephyr,flash-controller = &flash;
		zephyr,cortex-m-idle-timer = &rtc;
	};

	cpus {
@@ -30,10 +32,27 @@
		cpu0: cpu@0 {
			device_type = "cpu";
			compatible = "arm,cortex-m3";
			cpu-power-states = <&sleep &stop>;
			reg = <0>;
		};
	};

	power-states {
		sleep: sleep {
			compatible = "zephyr,power-state";
			power-state-name = "runtime-idle";
			min-residency-us = <1000000>;
			exit-latency-us = <750>;
		};

		stop: stop {
			compatible = "zephyr,power-state";
			power-state-name = "suspend-to-idle";
			min-residency-us = <1000000>;
			exit-latency-us = <750>;
		};
	};

	sram0: memory@20000000 {
		compatible = "mmio-sram";
	};
@@ -81,7 +100,6 @@
	};

	soc {

		flash: flash-controller@40023c00 {
			compatible = "st,stm32-flash-controller", "st,stm32f1-flash-controller";
			reg = <0x40023c00 0x400>;
@@ -184,6 +202,32 @@
			status = "disabled";
		};

		pwr: power@40007000 {
			compatible = "st,stm32-pwr";
			reg = <0x40007000 0x400>; /* PWR register bank */
			status = "disabled";

			wkup-pins-nb = <3>;

			#address-cells = <1>;
			#size-cells = <0>;

			wkup-pin@1 {
				reg = <0x1>;
				wkup-gpios = <&gpioa 0 STM32_PWR_WKUP_PIN_NOT_MUXED>;
			};

			wkup-pin@2 {
				reg = <0x2>;
				wkup-gpios = <&gpioc 13 STM32_PWR_WKUP_PIN_NOT_MUXED>;
			};

			wkup-pin@3 {
				reg = <0x3>;
				wkup-gpios = <&gpioe 6 STM32_PWR_WKUP_PIN_NOT_MUXED>;
			};
		};

		spi1: spi@40013000 {
			compatible = "st,stm32-spi";
			#address-cells = <1>;
+15 −0
Changes for samples/boards/st/power_mgmt/wkup_pins/boards/nucleo_l152re.overlay: 15 added lines, 0 removed lines.
Original line number Diff line number Diff line
/*
 * Copyright (c) 2025 Oleh Kravchenko <oleh@kaa.org.ua>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/ {
	aliases {
		wkup-src = &user_button;
	};
};

&pwr {
	status = "okay";
};
+15 −0
Changes for samples/boards/st/power_mgmt/wkup_pins/boards/stm32l1_disco.overlay: 15 added lines, 0 removed lines.
Original line number Diff line number Diff line
/*
 * Copyright (c) 2025 Oleh Kravchenko <oleh@kaa.org.ua>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/ {
	aliases {
		wkup-src = &user_button;
	};
};

&pwr {
	status = "okay";
};
+2 −0
Changes for samples/boards/st/power_mgmt/wkup_pins/sample.yaml: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -12,5 +12,7 @@ tests:
      - nucleo_u5a5zj_q
      - nucleo_wl55jc
      - nucleo_f103rb
      - stm32l1_disco
      - nucleo_l152re
    integration_platforms:
      - nucleo_l4r5zi
+2 −2
Changes for soc/st/stm32/common/soc_config.c: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ static int st_stm32_common_config(void)

#if defined(CONFIG_STM32_ENABLE_DEBUG_SLEEP_STOP)

#if defined(CONFIG_SOC_SERIES_STM32F1X)
#if defined(CONFIG_SOC_SERIES_STM32F1X) || defined(CONFIG_SOC_SERIES_STM32L1X)
	LL_DBGMCU_EnableDBGSleepMode();
	LL_DBGMCU_EnableDBGStopMode();
	LL_DBGMCU_EnableDBGStandbyMode();
@@ -89,7 +89,7 @@ static int st_stm32_common_config(void)
#else

/* keeping in mind that debugging draws a lot of power we explcitly disable when not needed */
#if defined(CONFIG_SOC_SERIES_STM32F1X)
#if defined(CONFIG_SOC_SERIES_STM32F1X) || defined(CONFIG_SOC_SERIES_STM32L1X)
	LL_DBGMCU_DisableDBGSleepMode();
	LL_DBGMCU_DisableDBGStopMode();
	LL_DBGMCU_DisableDBGStandbyMode();
Loading