0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【NCS随笔】如何进入system_off深度睡眠模式以及配置GPIO中断唤醒

TedLee 来源:jf_29076475 作者:jf_29076475 2025-09-29 00:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

【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
    NCS
    +关注

    关注

    1

    文章

    22

    浏览量

    9348
  • GPIO
    +关注

    关注

    16

    文章

    1313

    浏览量

    55727
  • Nordic
    +关注

    关注

    9

    文章

    238

    浏览量

    48768
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    芯源MCU进入休眠模式深度休眠模式

    )的SLEEPONEXIT 和SLEEPDEEP 位域,可实现立即进入或退出(中断服务程序)时进 入休眠模式深度休眠模式。 ●● 立即
    发表于 11-26 07:41

    MCU典型的睡眠唤醒时间delay的概念

    会首先进入低功耗模式中断延后唤醒系统。 另外,在睡眠模式下,主振荡器POSC和辅助振荡器会di
    发表于 11-25 08:03

    在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

    CW32 UART低功耗模式详解

    传输时钟 UCLK 来源为高速时钟,当系统进入深度休眠模式后,高速时钟会停止运行,UAR不会接收数据。此时,仍可通过GPIO中断
    发表于 11-12 07:24

    n32g031单片机进入睡眠模式无法唤醒怎么解决?

    求问大家:第一次使用单片机的睡眠模式遇到的问题: 1.如果把PWR_EnterSLEEPMode()函数放在while(1)外边进入睡眠模式后,外部按键
    发表于 10-10 07:11

    FAQ_MA35D1_ 如何进入睡眠模式

    FAQ_MA35D1_ 如何进入睡眠模式
    发表于 09-02 07:06

    NCS随笔NCS使用CJSON库

    NCS随笔NCS使用CJSON库 这个文章讲一下在NCS上面如何使用JSON库,我使用Hello_world例程添加库 宏的配置 CON
    的头像 发表于 08-13 15:12 490次阅读
    【<b class='flag-5'>NCS</b><b class='flag-5'>随笔</b>】<b class='flag-5'>NCS</b>使用CJSON库

    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-27 08:05

    STM32U5 IWDG的提前唤醒中断无法在STOP模式下触发怎么解决?

    我使用的是STM32U585系列芯片,开启了IWDG,并在运行模式下测试提前唤醒中断正常触发,但在进入STOP2模式后,提前
    发表于 04-24 07:50

    STM32U5 IWDG的提前唤醒中断无法在STOP模式下触发怎么解决?

    我使用的是STM32U585系列芯片,开启了IWDG,并在运行模式下测试提前唤醒中断正常触发,但在进入STOP2模式后,提前
    发表于 04-22 08:14

    AG32 MCU 如何进入低功耗模式

    的外设中断都可以从休眠模式唤醒设备。如果使用WFE指令进入睡眠模式,则一旦发生事件,MCU就退出睡眠
    发表于 04-21 11:29