nRF Connect SDK system off模式介紹

目錄

概述

1.? 軟硬件環境

1.1 軟件開發環境

1.2 硬件環境?

2 System Off 模式

2.1 模式介紹

2.2?注意事項

3 功能實現

3.1 框架結構介紹

3.2 代碼介紹

4 功能驗證

4.1 編譯和下載代碼

4.2 測試

4.3 使能CONFIG_APP_USE_RETAINED_MEM的測試

5 main.c的源代碼文件

參考文獻


概述

System Off 模式是 Nordic nRF 系列芯片最省電的工作模式,在 nRF Connect SDK 中通過 Zephyr RTOS 的電源管理框架提供完善支持。本文通過一個demo介紹system off功能的用法及其相關函數的功能。

1.? 軟硬件環境

1.1 軟件開發環境

nordic提供了基于zephyr平臺sdk, 其提供了大量的demo可供開發者參考和使用,同時nordi還提供一個集成的軟件庫工具,方便開發者安裝相應的SDK和編譯工具鏈。集成環境同時包含了其他的一些軟件,非常便于進行項目開發。

軟件工具功能版本信息
nRF Connect SDK?nordic提供基于zephyr的代碼庫v2.9.0?
nRF Connect SDK Toolchain代碼編譯工具v2.9.1
VS-CODE集成開發環境v1.99.3?
nRF Connect for Desktopnordic集成工具鏈v5.1.0
nRF Connect手機App

手機App下載地址:

https://nav.nordicsemi.com/search?query=nRF%20Connect

搭建編譯環境的注意點

安裝工具時,在D:\ncs\v2.9.0目錄下執行如下語句,安裝與編譯器相關的工具鏈

pip3 install --user -r scripts/requirements.txt

運行該語句后,安裝信息如下:

1.2 硬件環境?

本案例是在nRF52832開發板(nRF52-DK)上實現的,該開發板nRF52832的主要特點如下:

1)板載j-link調試接口

2)引出所有 IO接口,用戶可根據實際應用,外載其他設備

3)支持4個LED

4)支持4路Key接口

5)板載UART調試接口,方便打印調試信息

2 System Off 模式

2.1 模式介紹

System Off 是 Nordic nRF 系列芯片的一種深度節能模式,在 nRF Connect SDK (基于 Zephyr RTOS) 中有完整的支持。這種模式可以最大限度地降低功耗,適用于電池供電設備。

System Off 模式特性

  • 超低功耗:僅保持 RAM 保持電源 (約 0.7μA @ 3V)

  • 喚醒源:特定 GPIO、LPCOMP、NFC、RTC 等。注意: nRF52832不支持RTC喚醒模式

  • 數據保留:可選擇保留部分或全部 RAM 內容

  • 系統狀態:CPU 和外設完全停止

1)電源特性

  • 功耗表現:0.7μA @ 3V (RAM 保持)

  • 電壓范圍:1.7V - 3.6V

  • 喚醒時間:~100μs 從 OFF 到 RUN

2) 狀態對比

模式電流消耗喚醒源RAM保持執行恢復
RUN~4mA任意保持繼續執行
IDLE~1.5mA任意保持繼續執行
System Off~0.7μA有限可選復位重啟

2.2?注意事項

  1. 調試限制:在 System Off 模式下,調試器連接會斷開

  2. 外設狀態:進入 System Off 前應正確關閉所有外設

  3. 電流測量:使用高精度電流表測量實際功耗

  4. 喚醒延遲:從 System Off 喚醒會有約 100μs 的啟動延遲

  5. GPIO 狀態:配置為喚醒源的 GPIO 必須保持有效電平

3 功能實現

3.1 框架結構介紹

軟件使用VS-CODE開發工具搭建,底層使用zephry平臺,其實現功能主要如下:

1)系統上電運行一段時間后,通過調用system off進入到低功耗模式

2)使用按button-1觸發系統重新運行

3)retained組件管理進入睡眠后的參數

3.2 代碼介紹

?1)prj.conf

代碼第1行: 使能PM管理模式

代碼第2行:使能IO工具庫

代碼第3行:使能CRC工具庫

代碼第4行:使能POWEROFF工具庫

2)main.c文件

代碼12~17行: 引入zephyr提供的代碼庫

代碼23行: 使用按鍵,其用于喚醒MCU

代碼第29行:獲取控制云臺串口端口信息

代碼第31行:check device初始化是否完成?

代碼第63行: 配置和按鍵相連的端口為輸入口?

代碼第69行:配置該端口為輸入中斷模式

代碼第78行:? 掛起控制臺設備

注釋:

pm_device_action_run?的功能介紹


pm_device_action_run?是 Zephyr RTOS (以及基于它的 nRF Connect SDK) 中電源管理子系統的一個重要函數,用于對設備執行特定的電源管理操作。

1)函數原型

int pm_device_action_run(const struct device *dev, enum pm_device_action action);

2)參數說明

  • dev: 指向目標設備的指針,可使用?DEVICE_DT_GET?宏獲取

  • action: 要執行的電源管理操作,有以下幾種可能值:

    • PM_DEVICE_ACTION_SUSPEND: 掛起設備

    • PM_DEVICE_ACTION_RESUME: 恢復設備

    • PM_DEVICE_ACTION_TURN_ON: 打開設備

    • PM_DEVICE_ACTION_TURN_OFF: 關閉設備

    • PM_DEVICE_ACTION_LOW_POWER: 進入低功耗模式

    • PM_DEVICE_ACTION_FORCE_SUSPEND: 強制掛起

3)返回值

  • 0: 操作成功

  • 負數: 錯誤代碼 (如 -ENOTSUP 表示設備不支持該操作)

4)??函數的用法

- 1) 基本用法

const struct device *sensor_dev = DEVICE_DT_GET(DT_NODELABEL(bme280));// 關閉傳感器
pm_device_action_run(sensor_dev, PM_DEVICE_ACTION_TURN_OFF);// 需要時重新打開
pm_device_action_run(sensor_dev, PM_DEVICE_ACTION_TURN_ON);

- 2)批量管理多個設備

const struct device *devices[] = {DEVICE_DT_GET(DT_NODELABEL(uart0)),DEVICE_DT_GET(DT_NODELABEL(i2c0)),DEVICE_DT_GET(DT_NODELABEL(spi1)),
};void suspend_all_devices(void)
{for (int i = 0; i < ARRAY_SIZE(devices); i++) {pm_device_action_run(devices[i], PM_DEVICE_ACTION_SUSPEND);}
}

- 3)?與電源狀態結合使用

#include <pm/pm.h>void enter_low_power_mode(void)
{// 首先掛起所有設備suspend_all_devices();// 然后進入系統低功耗狀態pm_power_state_force(0, (struct pm_state_info){.state = PM_STATE_SUSPEND_TO_RAM,.substate_id = 0,.info = PM_STATE_INFO_DT_ITEMS_LIST(DT_NODELABEL(power_states))});
}

- 4)?傳感器周期性采樣

void sample_sensor_periodically(void)
{const struct device *sensor = DEVICE_DT_GET(DT_NODELABEL(bme280));while (1) {// 喚醒傳感器pm_device_action_run(sensor, PM_DEVICE_ACTION_TURN_ON);k_msleep(10); // 等待穩定// 采樣sensor_sample_fetch(sensor);// 完成后再關閉pm_device_action_run(sensor, PM_DEVICE_ACTION_TURN_OFF);k_sleep(K_MINUTES(5)); // 5分鐘后再采樣}
}

- 5)?電池供電設備

void manage_battery_life(void)
{const struct device *display = DEVICE_DT_GET(DT_NODELABEL(ssd1306));// 用戶不活動時if (inactive_time > INACTIVITY_THRESHOLD) {// 關閉顯示屏pm_device_action_run(display, PM_DEVICE_ACTION_TURN_OFF);// 掛起非必要外設pm_device_action_run(DEVICE_DT_GET(DT_NODELABEL(i2c1)), PM_DEVICE_ACTION_SUSPEND);}
}

4 功能驗證

4.1 編譯和下載代碼

編譯配置項如下:

編譯結果如下:

?下載代碼至板卡中:

4.2 測試

下載代碼到板卡中之后,可以看見如下log:

?提示信息顯示,按鍵sw0可以重新喚醒MCU,按鍵swo后,

4.3 使能CONFIG_APP_USE_RETAINED_MEM的測試

1)編譯后重新下載代碼至板卡,運行結果如下:

2)按下SW0后的log

5 main.c的源代碼文件

/** Copyright (c) 2019 Nordic Semiconductor ASA** SPDX-License-Identifier: Apache-2.0*/#include "retained.h"#include <inttypes.h>
#include <stdio.h>#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/kernel.h>
#include <zephyr/pm/device.h>
#include <zephyr/sys/poweroff.h>
#include <zephyr/sys/util.h>#if IS_ENABLED(CONFIG_GRTC_WAKEUP_ENABLE)
#include <zephyr/drivers/timer/nrf_grtc_timer.h>
#define DEEP_SLEEP_TIME_S 2
#else
static const struct gpio_dt_spec sw0 = GPIO_DT_SPEC_GET(DT_ALIAS(sw0), gpios);
#endifint main(void)
{int rc;const struct device *const cons = DEVICE_DT_GET(DT_CHOSEN(zephyr_console));if (!device_is_ready(cons)) {printf("%s: device not ready.\n", cons->name);return 0;}printf("\n%s system off demo\n", CONFIG_BOARD);if (IS_ENABLED(CONFIG_APP_USE_RETAINED_MEM)) {bool retained_ok = retained_validate();/* Increment for this boot attempt and update. */retained.boots += 1;retained_update();printf("Retained data: %s\n", retained_ok ? "valid" : "INVALID");printf("Boot count: %u\n", retained.boots);printf("Off count: %u\n", retained.off_count);printf("Active Ticks: %" PRIu64 "\n", retained.uptime_sum);} else {printf("Retained data not supported\n");}#if IS_ENABLED(CONFIG_GRTC_WAKEUP_ENABLE)int err = z_nrf_grtc_wakeup_prepare(DEEP_SLEEP_TIME_S * USEC_PER_SEC);if (err < 0) {printk("Unable to prepare GRTC as a wake up source (err = %d).\n", err);} else {printk("Entering system off; wait %u seconds to restart\n", DEEP_SLEEP_TIME_S);}
#else/* configure sw0 as input, interrupt as level active to allow wake-up */rc = gpio_pin_configure_dt(&sw0, GPIO_INPUT);if (rc < 0) {printf("Could not configure sw0 GPIO (%d)\n", rc);return 0;}rc = gpio_pin_interrupt_configure_dt(&sw0, GPIO_INT_LEVEL_ACTIVE);if (rc < 0) {printf("Could not configure sw0 GPIO interrupt (%d)\n", rc);return 0;}printf("Entering system off; press sw0 to restart\n");
#endifrc = pm_device_action_run(cons, PM_DEVICE_ACTION_SUSPEND);if (rc < 0) {printf("Could not suspend console (%d)\n", rc);return 0;}if (IS_ENABLED(CONFIG_APP_USE_RETAINED_MEM)) {/* Update the retained state */retained.off_count += 1;retained_update();}sys_poweroff();return 0;
}

參考文獻

D:\ncs\v2.9.0\zephyr\samples\boards\nordic\system_off

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79844.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79844.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79844.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

白楊SEO:如何查看百度、抖音、微信、微博、小紅書、知乎、B站、視頻號、快手等7天內最熱門話題及流量關鍵詞有哪些?使用方法和免費工具推薦以及注意事項【干貨】

大家好&#xff0c;我是白楊SEO&#xff0c;專注SEO十年以上&#xff0c;全網SEO流量實戰派&#xff0c;AI搜索優化研究者。 &#xff08;溫馨提醒&#xff1a;本文有點長&#xff0c;看不完建議先收藏或星標&#xff0c;后面慢慢看哈&#xff09; 最近&#xff0c;不管是在白…

2025 Mac常用軟件安裝配置

1、homebrew 2、jdk 1、使用brew安裝jdk&#xff1a; brew install adoptopenjdk/openjdk/adoptopenjdk8 jdk默認安裝位置在 /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home 目錄。 2、配置環境變量&#xff1a; vim ~/.zshrc# Jdk export JAVA_HOM…

Linux 內核學習(6) --- Linux 內核基礎知識

目錄 Linux 內核基礎知識進程調度內存管理虛擬文件系統和網絡接口進程間通信Linux 內核編譯Makefile 和 Kconfig內核Makefile內核Kconfig 配置項標識的寫法depend 關鍵字select 關鍵字表達式邏輯關系Kconfig 其他語法 配置文件的編譯Linux 內核引導方法Booloader 定義Linux 內核…

常見匯編代碼及其指令

1. 數據傳輸指令 1.1. mov 作用&#xff1a;將數據從源操作數復制到目標操作數。語法&#xff1a;mov dest, src mov eax, 10 ; 將立即數 10 存入 eax 寄存器 mov ebx, eax ; 將 eax 的值復制到 ebx mov [ecx], eax ; 將 eax 的值寫入 ecx 指向的內存地址 1.2. …

STM32基礎教程——軟件SPI

目錄 前言 技術實現 接線圖 代碼實現 技術要點 引腳操作 SPI初始化 SPI起始信號 SPI終止信號 SPI字節交換 宏替換命令 W25Q64寫使能 忙等待 讀取設備ID號和制造商ID 頁寫入 數據讀取 實驗結果 問題記錄 前言 SPI&#xff08;Serial Peripheral Interf…

(B題|礦山數據處理問題)2025年第二十二屆五一數學建模競賽(五一杯/五一賽)解題思路|完整代碼論文集合

我是Tina表姐&#xff0c;畢業于中國人民大學&#xff0c;對數學建模的熱愛讓我在這一領域深耕多年。我的建模思路已經幫助了百余位學習者和參賽者在數學建模的道路上取得了顯著的進步和成就。現在&#xff0c;我將這份寶貴的經驗和知識凝練成一份全面的解題思路與代碼論文集合…

無網絡環境下配置并運行 word2vec復現.py

需運行文件 # -*- coding: utf-8 -*- import torch import pandas as pd import jieba import torch import torch.nn as nn from tqdm import tqdm from torch.utils.data import DataLoader,Dataset from transformers import AutoTokenizer,AutoModeldef get_stop_word():w…

讀《暗時間》有感

讀《暗時間》有感 反思與筆記 這本書還是我無意中使用 ima 給我寫職業規劃的時候給出的&#xff0c;由于有收藏的習慣&#xff0c;我就去找了這本書。當讀到第一章暗時間的時候給了我很大的沖擊&#xff0c;我本身就是一個想快速讀完一本書的人&#xff0c;看到東西沒有深入思…

ubuntu安裝Go SDK

# 下載最新版 Go 安裝包&#xff08;以 1.21.5 為例&#xff09; wget https://golang.google.cn/dl/go1.21.5.linux-amd64.tar.gz # 解壓到系統目錄&#xff08;需要 root 權限&#xff09; sudo tar -C /usr/local -xzf go1.21.5.linux-amd64.tar.gz # 使用 Go 官方安裝腳本…

FFmpeg(7.1版本)編譯生成ffplay

FFmpeg在編譯的時候,沒有生成ffplay,怎么辦? 1. 按照上一篇文章:FFmpeg(7.1版本)在Ubuntu18.04上的編譯_ffmpeg-7.1-CSDN博客 在build.sh腳本里配置了ffplay 但是,實際上卻沒有生成ffplay,會是什么原因呢? 2. 原因是編譯ffplay的時候,需要一些依賴庫 sudo apt-get i…

【Python 函數】

Python 中的函數&#xff08;Function&#xff09;是可重復使用的代碼塊&#xff0c;用于封裝特定功能并提高代碼復用性。以下是函數的核心知識點&#xff1a; 一、基礎語法 1. 定義函數 def greet(name):"""打印問候語""" # 文檔字符串&…

7. HTML 表格基礎

表格是網頁開發中最基礎也最實用的元素之一,盡管現代前端開發中表格布局已被 CSS 布局方案取代,但在展示結構化數據時,表格依然發揮著不可替代的作用。本文將基于提供的代碼素材,系統講解 HTML 表格的核心概念與實用技巧。 一、表格的基本結構 一個完整的 HTML 表格由以下…

極狐GitLab 命名空間的類型有哪些?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 命名空間 命名空間在極狐GitLab 中組織項目。因為每一個命名空間都是單獨的&#xff0c;您可以在多個命名空間中使用相同的項…

powershell批處理——io校驗

powershell批處理——io校驗 在刷題時&#xff0c;時常回想&#xff0c;OJ平臺是如何校驗競賽隊員提交的代碼的&#xff0c;OJ平臺并不看代碼&#xff0c;而是使用“黑盒測試”&#xff0c;用測試數據來驗證。對于每題&#xff0c;都事先設定了很多組輸入數據&#xff08;data…

前端面經-webpack篇--定義、配置、構建流程、 Loader、Tree Shaking、懶加載與預加載、代碼分割、 Plugin 機制

看完本篇你將基本了解webpack!!! 目錄 一、Webpack 的作用 1、基本配置結構 2、配置項詳解 1. entry —— 構建入口 2. output —— 輸出配置 3. mode:模式設置 4. module:模塊規則 5. plugins:插件機制 6. resolve:模塊解析配置(可選) 7. devServer:開發服務器…

面試算法刷題練習1(核心+acm)

3. 無重復字符的最長子串 核心代碼模式 class Solution {public int lengthOfLongestSubstring(String s) {int lens.length();int []numnew int[300];int ans0;for(int i0,j0;i<len;i){num[s.charAt(i)];while(num[s.charAt(i)]>1){num[s.charAt(j)]--;j;}ansMath.max…

拉削絲錐,螺紋類加工的選擇之一

在我們的日常生活中&#xff0c;螺紋連接無處不在&#xff0c;從簡單的螺絲釘到復雜的機械設備&#xff0c;都離不開螺紋的精密加工。今天&#xff0c;給大家介紹一種的螺紋刀具——拉削絲錐&#xff1a; 一、拉削絲錐的工作原理 拉削絲錐&#xff0c;聽起來有點陌生吧&#…

數據清洗-電商雙11美妝數據分析(二)

1.接下來用seaborn包給出每個店鋪各個大類以及各個小類的銷量銷售額 先觀察銷量&#xff0c;各店小類中銷量最高的是相宜本草的補水類商品以及妮維雅的清潔類商品&#xff0c;這兩類銷量很接近。而銷售額上&#xff0c;相宜本草的補水類商品比妮維雅的清潔類商品要高得多&#…

【上位機——MFC】對話框

對話框的使用 1.添加對話框資源 2.定義一個自己的對話框類(CMyDlg)&#xff0c;管理對話框資源&#xff0c;派生自CDialog或CDialogEx均可 對話框架構 #include <afxwin.h> #include "resource.h"class CMyDlg :public CDialog {DECLARE_MESSAGE_MAP() publi…

2025東三省C題深圳杯C題數學建模挑戰賽數模思路代碼文章教學: 分布式能源接入配電網的風險分析

完整內容請看文章最下面的推廣群 數據整理與分析 表1&#xff1a;有源配電網62節點系統負荷參數 內容&#xff1a;列出了62個節點的有功負荷&#xff08;單位&#xff1a;kW&#xff09;。 特點&#xff1a; 負荷范圍&#xff1a;24 kW&#xff08;節點19&#xff09;到420 …