【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浏览量
9430 -
GPIO
+关注
关注
16文章
1337浏览量
56629 -
Nordic
+关注
关注
9文章
276浏览量
49190
发布评论请先 登录
相关推荐
热点推荐
将 TJA1145 CAN 收发器置于睡眠模式时出现问题,怎么解决?
我似乎已经尝试了一切让TJA1145进入睡眠模式。根据数据表,如果“没有待处理的唤醒事件和至少一个常规唤醒源”,TJA1145将进入睡眠
发表于 04-24 06:20
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
【NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒
评论