【NCS隨筆】如何進入system_off深度睡眠模式以及配置GPIO中斷喚醒
本文章主要是講解NCS下面使用nRF54L15如何進入system_off模式,以及如何配置通過按鍵喚醒
一、如何進入system_off模式
在prj.conf里面添加CONFIG_POWEROFF=y
在主函數文件調用如下頭文件#include
即可使用進入system_off模式的函數:sys_poweroff();
進入 System OFF 前,需確保所有 EasyDMA 事務結束,HFXO 停止,且 RESETREAS 清零,否則可能無法進入
二、配置GPIO中斷喚醒
還是老規矩,使用hello_world例程,分別使用nrfx的gpio庫和zephyr的庫來喚醒
2.1 nrf_gpio庫
1、頭文件調用#include
2、main函數里面添加
#define BUTTON3_PIN 4 // P0.04 對應DK的BUTTON3
// 配置 P0.04 為輸入,上拉,并使能 SENSE 低電平喚醒
nrf_gpio_cfg_input(BUTTON3_PIN, NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_sense_set(BUTTON3_PIN, NRF_GPIO_PIN_SENSE_LOW);
2.2 zephyr的API
1、頭文件調用#include
2、添加宏定義CONFIG_GPIO=y
3、主函數配置gpio喚醒
#define BUTTON_NODE DT_ALIAS(sw0)
#define BUTTON_PIN DT_GPIO_PIN(BUTTON_NODE, gpios)
#define BUTTON_FLAGS (GPIO_INPUT | DT_GPIO_FLAGS(BUTTON_NODE, gpios))
static const struct device *button_dev;
void main(void)
{
int ret;
printf("Hello World! %sn", CONFIG_BOARD_TARGET);
button_dev = DEVICE_DT_GET(DT_GPIO_CTLR(BUTTON_NODE, gpios));
if (!device_is_ready(button_dev)) {
printk("Button device not readyn");
return;
}
ret = gpio_pin_configure(button_dev, BUTTON_PIN, BUTTON_FLAGS);
if (ret < 0) {
printk("Failed to configure buttonn");
return;
}
// 配置為喚醒源
ret = gpio_pin_interrupt_configure(button_dev, BUTTON_PIN, GPIO_INT_EDGE_TO_ACTIVE | GPIO_INT_WAKEUP);
if (ret < 0) {
printk("Failed to configure button interruptn");
return;
}
printk("Waiting 5 seconds before entering System OFF...n");
k_sleep(K_SECONDS(5));
printk("Entering System OFF moden");
sys_poweroff();
// 進入System OFF后,只有喚醒源(如按鍵)才能喚醒,喚醒后會復位
}
4、overlay里面設置BUTTON0的sense-edge-mask寄存器
&gpio1 {
sense-edge-mask = < 0x00002000 >;
//sense-edge-mask 的每一位對應一個 GPIO pin,bit0 對應 P0.00,bit1 對應 P0.01,……,bit31 對應 P0.31所以P1,13對應0x200
};
2.3、附上所有代碼
main:
/*
* Copyright (c) 2012-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include < stdio.h >
#include < zephyr/kernel.h >
#include < zephyr/device.h >
#include < zephyr/drivers/gpio.h >
#include < zephyr/pm/pm.h >
#include < zephyr/pm/policy.h >
#include < zephyr/sys/printk.h >
#include < zephyr/sys/poweroff.h >
#include < hal/nrf_gpio.h >
#define BUTTON_NODE DT_ALIAS(sw0)
#define BUTTON_PIN DT_GPIO_PIN(BUTTON_NODE, gpios)
#define BUTTON_FLAGS (GPIO_INPUT | DT_GPIO_FLAGS(BUTTON_NODE, gpios))
static const struct device *button_dev;
#define BUTTON3_PIN 4 // P0.04 對應DK的BUTTON3
void main(void)
{
int ret;
printf("Hello World! %sn", CONFIG_BOARD_TARGET);
button_dev = DEVICE_DT_GET(DT_GPIO_CTLR(BUTTON_NODE, gpios));
if (!device_is_ready(button_dev)) {
printk("Button device not readyn");
return;
}
ret = gpio_pin_configure(button_dev, BUTTON_PIN, BUTTON_FLAGS);
if (ret < 0) {
printk("Failed to configure buttonn");
return;
}
// 配置為喚醒源
ret = gpio_pin_interrupt_configure(button_dev, BUTTON_PIN, GPIO_INT_EDGE_TO_ACTIVE | GPIO_INT_WAKEUP);
if (ret < 0) {
printk("Failed to configure button interruptn");
return;
}
// 配置 P0.04 為輸入,上拉,并使能 SENSE 低電平喚醒
nrf_gpio_cfg_input(BUTTON3_PIN, NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_sense_set(BUTTON3_PIN, NRF_GPIO_PIN_SENSE_LOW);
printk("Waiting 5 seconds before entering System OFF...n");
k_sleep(K_SECONDS(5));
printk("Entering System OFF moden");
sys_poweroff();
// 進入System OFF后,只有喚醒源(如按鍵)才能喚醒,喚醒后會復位
}
prj.conf
CONFIG_GPIO=y
CONFIG_POWEROFF=y
overlay:
&gpio1 {
sense-edge-mask = < 0x00002000 >; // 只舉例,實際bit需對應你的按鍵引腳
};
三測試
設置上電5S進入深度休眠模式,然后通過按鍵喚醒:
你的點贊、收藏和評論是對我最大的支持,有問題多多指教,如果有需要Nordic開發板、Nordic的芯片以及Nordic技術支持的可以在個人資料獲取我的聯系方式,感謝讀者支持!
審核編輯 黃宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
NCS
+關注
關注
1文章
22瀏覽量
9393 -
GPIO
+關注
關注
16文章
1328瀏覽量
56216 -
Nordic
+關注
關注
9文章
256瀏覽量
49016
發布評論請先 登錄
相關推薦
熱點推薦
CW32F030在深度休眠模式下UART接收數據
:
使能 UART 接收(即設置 UARTx_CR1.RXEN 為 1);
步驟 4:
進入深度休眠模式;
步驟 5:
等待主機發送數據,產生 GPIO 下降沿
發表于 12-15 06:53
芯源MCU進入休眠模式或深度休眠模式
)的SLEEPONEXIT 和SLEEPDEEP 位域,可實現立即進入或退出(中斷服務程序)時進
入休眠模式或深度休眠模式。
●● 立即
發表于 11-26 07:41
在CW32F030 MCU上設置外部中斷和RTC喚醒條件的示例
, PWR_SLEEPENTRY_WFI);
// 注意:代碼執行到這里后,MCU將進入Sleep模式,直到被外部中斷喚醒
}
int main(void) {
HAL_I
發表于 11-25 08:00
CW32L010進入休眠模式后,外部中斷無法喚醒MCU,為什么?
現在開發的項目需要低功耗,現在的工作邏輯是:無動作10s后,MCU進入休眠模式,然后在用戶按下按鍵后,外部中斷喚醒MCU。 在10s計時滿足后,關閉定時器,重新
發表于 11-25 07:11
CW32單片機UART低功耗模式的介紹
MCU恢復到運行模式。
如果設置了傳輸時鐘 UCLK 來源為高速時鐘,當系統進入深度休眠模式后,高速時鐘會停止運行,UAR不會接收數據。此時,仍可通過
發表于 11-19 06:08
n32g031單片機進入睡眠模式無法喚醒怎么解決?
求問大家:第一次使用單片機的睡眠模式遇到的問題:
1.如果把PWR_EnterSLEEPMode()函數放在while(1)外邊進入睡眠模式后,外部按鍵
發表于 10-10 07:11
RK3128 Android 7.1 進入深度休眠流程分析
硬件相關流程
PMIC配置:通過RK808或類似電源管理IC配置低功耗模式
DDR控制:將DDR設置為自刷新模式以保持數據
時鐘管理:關閉所有非必要時鐘域
發表于 07-22 10:45
請問 CYW20829 深度睡眠模式是否可以通過遠程 BLE 喚醒,還是必須從主機喚醒?
請問 CYW20829 深度睡眠模式是否可以通過遠程 BLE 喚醒,還是必須從主機喚醒? 謝謝!
發表于 07-01 07:55
STM32U5 IWDG的提前喚醒中斷無法在STOP模式下觸發怎么解決?
我使用的是STM32U585系列芯片,開啟了IWDG,并在運行模式下測試提前喚醒中斷正常觸發,但在進入STOP2模式后,提前
發表于 04-22 08:14
【NCS隨筆】如何進入system_off深度睡眠模式以及配置GPIO中斷喚醒
評論