samples: boards: stm32: exit Poweroff using wkup pins & gpios
This sample demonstrates how gpio pins can be used to power on the system after a Poweroff, just like a reset pin. The user only needs to add the STM32_GPIO_WKUP flag to the gpio pin in "gpios" property of a DT device such a button or a sensor. The samples Powers off the system after a delay then the user can power it on with the user button that has the STM32_GPIO_WKUP flag in DT. Only works on STM32 boards that support Zephyr POWEROFF (U5, WL, WB, & L4 SoC series), & also have a user button whose GPIO pin is associated with a wake-up pin (see PWR node in SoC dtsi file). Signed-off-by: Abderrahmane Jarmouni <abderrahmane.jarmouni-ext@st.com>
This commit is contained in:
parent
323fcf94f9
commit
80180188b1
9 changed files with 194 additions and 0 deletions
7
samples/boards/stm32/power_mgmt/wkup_pins/CMakeLists.txt
Normal file
7
samples/boards/stm32/power_mgmt/wkup_pins/CMakeLists.txt
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.20.0)
|
||||||
|
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
||||||
|
project(stm32_wkup_pins)
|
||||||
|
|
||||||
|
target_sources(app PRIVATE src/main.c)
|
38
samples/boards/stm32/power_mgmt/wkup_pins/README.rst
Normal file
38
samples/boards/stm32/power_mgmt/wkup_pins/README.rst
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
.. _gpio-as-a-wkup-pin-src-sample:
|
||||||
|
|
||||||
|
GPIO As A Wake-up Pin Source
|
||||||
|
############################
|
||||||
|
|
||||||
|
Overview
|
||||||
|
********
|
||||||
|
|
||||||
|
This sample is a minimum application to demonstrate using a wake-up pin with a GPIO as
|
||||||
|
a source to power on an STM32 SoC after Poweroff.
|
||||||
|
|
||||||
|
The system will power off automatically ``WAIT_TIME_US`` us after boot.
|
||||||
|
Press the user button designated in boards's devicetree overlay as "wkup-src" to power it on again.
|
||||||
|
|
||||||
|
.. _gpio-as-a-wkup-pin-src-sample-requirements:
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
************
|
||||||
|
|
||||||
|
The SoC should support POWEROFF functionality & have a wake-up pin that corresponds
|
||||||
|
to the GPIO pin of a user button.
|
||||||
|
To support another board, add an overlay in boards folder.
|
||||||
|
Make sure that wake-up pins are configured in SoC dtsi file.
|
||||||
|
|
||||||
|
Building and Running
|
||||||
|
********************
|
||||||
|
|
||||||
|
Build and flash wkup_pins as follows, changing ``nucleo_u5a5zj_q`` for your board:
|
||||||
|
|
||||||
|
.. zephyr-app-commands::
|
||||||
|
:zephyr-app: samples/boards/stm32/power_mgmt/wkup_pins
|
||||||
|
:board: nucleo_u5a5zj_q
|
||||||
|
:goals: build flash
|
||||||
|
:compact:
|
||||||
|
|
||||||
|
After flashing, the LED in ON.
|
||||||
|
The LED will be turned off when the system is powered off.
|
||||||
|
Press the user button to power on the system again.
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024 STMicroelectronics
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zephyr/dt-bindings/gpio/stm32-gpio.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
aliases {
|
||||||
|
wkup-src = &user_button;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&user_button {
|
||||||
|
gpios = <&gpioc 13 (GPIO_ACTIVE_HIGH | STM32_GPIO_WKUP)>;
|
||||||
|
};
|
||||||
|
|
||||||
|
&pwr {
|
||||||
|
status = "okay";
|
||||||
|
};
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024 STMicroelectronics
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zephyr/dt-bindings/gpio/stm32-gpio.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
aliases {
|
||||||
|
wkup-src = &user_button;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&user_button {
|
||||||
|
gpios = <&gpioc 13 (GPIO_ACTIVE_HIGH | STM32_GPIO_WKUP)>;
|
||||||
|
};
|
||||||
|
|
||||||
|
&pwr {
|
||||||
|
status = "okay";
|
||||||
|
};
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024 STMicroelectronics
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zephyr/dt-bindings/gpio/stm32-gpio.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
aliases {
|
||||||
|
wkup-src = &user_button;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&user_button {
|
||||||
|
gpios = <&gpioc 13 (GPIO_ACTIVE_HIGH | STM32_GPIO_WKUP)>;
|
||||||
|
};
|
||||||
|
|
||||||
|
&pwr {
|
||||||
|
status = "okay";
|
||||||
|
};
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024 STMicroelectronics
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zephyr/dt-bindings/gpio/stm32-gpio.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
aliases {
|
||||||
|
wkup-src = &user_button_1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&user_button_1 {
|
||||||
|
gpios = <&gpioa 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP | STM32_GPIO_WKUP)>;
|
||||||
|
};
|
||||||
|
|
||||||
|
&pwr {
|
||||||
|
status = "okay";
|
||||||
|
};
|
7
samples/boards/stm32/power_mgmt/wkup_pins/prj.conf
Normal file
7
samples/boards/stm32/power_mgmt/wkup_pins/prj.conf
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
CONFIG_POWEROFF=y
|
||||||
|
CONFIG_STM32_WKUP_PINS=y
|
||||||
|
CONFIG_INPUT=y
|
||||||
|
CONFIG_INPUT_GPIO_KEYS=y
|
||||||
|
CONFIG_PM=n
|
||||||
|
CONFIG_PM_DEVICE=n
|
||||||
|
CONFIG_PM_DEVICE_RUNTIME=n
|
12
samples/boards/stm32/power_mgmt/wkup_pins/sample.yaml
Normal file
12
samples/boards/stm32/power_mgmt/wkup_pins/sample.yaml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
sample:
|
||||||
|
name: GPIO As A Wake-up Pin Source
|
||||||
|
tests:
|
||||||
|
sample.boards.stm32.power_mgmt.wkup_pins:
|
||||||
|
build_only: true
|
||||||
|
filter: dt_enabled_alias_with_parent_compat("wkup-src",
|
||||||
|
"gpio-keys") and dt_compat_enabled("st,stm32-pwr")
|
||||||
|
platform_allow:
|
||||||
|
- nucleo_l4r5zi
|
||||||
|
- nucleo_u575zi_q
|
||||||
|
- nucleo_u5a5zj_q
|
||||||
|
- nucleo_wl55jc
|
46
samples/boards/stm32/power_mgmt/wkup_pins/src/main.c
Normal file
46
samples/boards/stm32/power_mgmt/wkup_pins/src/main.c
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024 STMicroelectronics
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zephyr/kernel.h>
|
||||||
|
#include <zephyr/device.h>
|
||||||
|
#include <zephyr/devicetree.h>
|
||||||
|
#include <zephyr/drivers/gpio.h>
|
||||||
|
#include <zephyr/sys/printk.h>
|
||||||
|
#include <zephyr/sys/poweroff.h>
|
||||||
|
|
||||||
|
#define WAIT_TIME_US 4000000
|
||||||
|
|
||||||
|
#define WKUP_SRC_NODE DT_ALIAS(wkup_src)
|
||||||
|
#if !DT_NODE_HAS_STATUS(WKUP_SRC_NODE, okay)
|
||||||
|
#error "Unsupported board: wkup_src devicetree alias is not defined"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const struct gpio_dt_spec button = GPIO_DT_SPEC_GET(WKUP_SRC_NODE, gpios);
|
||||||
|
|
||||||
|
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios);
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
__ASSERT_NO_MSG(gpio_is_ready_dt(&button));
|
||||||
|
printk("\nWake-up button set up at %s pin %d\n", button.port->name, button.pin);
|
||||||
|
|
||||||
|
__ASSERT_NO_MSG(gpio_is_ready_dt(&led));
|
||||||
|
gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
|
||||||
|
gpio_pin_set(led.port, led.pin, 1);
|
||||||
|
|
||||||
|
printk("Device is ready\n");
|
||||||
|
|
||||||
|
printk("Will wait %ds before powering the system off\n", (WAIT_TIME_US / 1000000));
|
||||||
|
k_busy_wait(WAIT_TIME_US);
|
||||||
|
|
||||||
|
printk("Powering off\n");
|
||||||
|
printk("Press the user button to power the system on\n\n");
|
||||||
|
|
||||||
|
sys_poweroff();
|
||||||
|
/* Will remain powered off until wake-up or reset button is pressed */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue