Skip to main content

Seeed Studio XIAO nRF54L15(Sense) 入门指南

Seeed Studio XIAO nRF54L15Seeed Studio XIAO nRF54L15 Sense

介绍

Seeed Studio XIAO nRF54L15 是一款紧凑、高性能的开发板,搭载了前沿的 Nordic nRF54L15 芯片。这款下一代 SoC 集成了超低功耗多协议 2.4 GHz 无线电和包含 128 MHz Arm® Cortex®-M33 处理器以及用于高级电源管理的 Arm® Cortex®-M0+ 的 MCU。它提供高达 1.5 MB NVM 和 256 KB RAM 的可扩展内存,以及显著延长电池寿命的内部超低功耗设计。其强大的无线电支持 Bluetooth® 6.0(包括信道探测)、Matter、Thread、Zigbee,以及高达 4 Mbps 的高吞吐量 2.4 GHz 专有模式。该开发板包含全面的外设集、集成的 128 MHz RISC-V 协处理器,以及诸如 TrustZone® 隔离和加密引擎保护等高级安全功能。凭借内置锂离子电池管理,XIAO nRF54L15 非常适合紧凑、安全且节能的物联网解决方案,如智能可穿戴设备、工业传感器和高级人机界面。

规格参数

项目XIAO nRF54L15XIAO nRF54L15 Sense
MCUArm Cortex-M33 128 MHz
RISC-V 协处理器 128 MHz FLPR
Arm Cortex-M33 128 MHz
RISC-V 协处理器 128 MHz FLPR
无线连接

Bluetooth LE 6.0(包括信道探测)
NFC
Thread
Zigbee
Matter
Amazon Sidewalk
专有 2.4 GHz 协议

Bluetooth LE 6.0(包括信道探测)
NFC
Thread
Zigbee
Matter
Amazon Sidewalk
专有 2.4 GHz 协议

内存NVM 1.5 MB + RAM256 KBNVM 1.5 MB + RAM256 KB
内置传感器6 轴 IMU(LSM6DS3TR-C)
麦克风 (MSM261DGT006)
发射功率+8 dBm+8 dBm
接收灵敏度-96 dBm-96 dBm
主要外设14 位 ADC,全局 RTC14 位 ADC,全局 RTC
电源

USB Type-C 接口供电
内部 PMIC 支持锂电池供电
支持锂电池电量采集

USB Type-C 接口供电
内部 PMIC 支持锂电池供电
支持锂电池电量采集

工作温度-40 至 105°C-40 至 105°C
供电电压范围3.7 至 5 V3.7 至 5 V
ESB 和 2.4 GHz 专有协议高达 4 Mbps高达 4 Mbps
篡改检测器
蓝牙信道探测

特性

  • 强大的 CPU:128 MHz Arm® Cortex®-M33 处理器,支持 DSP 指令和 FPU 浮点运算,32 位 RISC 架构,集成 128 MHz RISC-V 协处理器。
  • 超低功耗:专为卓越的超低功耗而设计,显著延长电池寿命,包含高级电源管理。
  • 多模式无线传输:集成 2.4 GHz 多协议无线收发器,支持低功耗蓝牙(包括信道探测)、802.15.4-2020、Matter、Thread、Zigbee 和 2.4 GHz 专有模式(高达 4 Mbps)。
  • 强大的安全性:高级安全功能,包括 TrustZone® 隔离、篡改检测和加密引擎侧的信道泄漏保护。
  • 丰富的片上资源:可扩展内存配置,高达 1.5 MB NVM 和 256 KB RAM,提供充足的存储空间。
  • 丰富的接口:全面的外设集,包括新的全局 RTC(在系统关闭模式下可用)、14 位 ADC 和高速串行接口。内置锂电池管理。

硬件概述

XIAO nRF54L15 引脚列表
XIAO nRF54L15 正面示意图
XIAO nRF54L15 背面示意图

nRFConnect SDK 使用

nRF Connect SDK (NCS) 是 Nordic Semiconductor 推出的一个可扩展、统一的软件开发套件,专门为基于 Nordic nRF52、nRF53、nRF54、nRF70 和 nRF91 系列的无线设备构建低功耗无线应用而设计。

NCS 提供了丰富的现成示例应用程序、协议栈、库和硬件驱动程序生态系统,旨在简化开发过程并加快产品上市时间。其模块化和可配置的特性为开发者提供了灵活性,既可以为内存受限的设备构建尺寸优化的软件,也可以为更高级和复杂的应用程序提供强大的功能。NCS 是一个托管在 GitHub 上的开源项目,为 Visual Studio Code 等集成开发环境提供了出色的支持。

使用 Vscode 安装

提前了解 nRF Connect SDK 安装知识

本文档详细介绍了如何在 Windows 11 计算机上安装 nRF Connect SDK 开发环境。以下是需要安装的工具概述

  • Visual Studio Code
  • nRF Command Line Tools
  • nRF Connect for Desktop
  • Git
git --version
  • Python
python --version
  • Ninja
ninja --version
  • CMake
cmake --version
  • Zephyr SDK
west --version
  • nRF Connect SDK
  • VSCode nRF Connect 插件

如果您已经在计算机上预安装了这些工具,可以通过以下命令检查工具的版本号

1
下载烧录插件

附加插件:

在 Windows 上,我们将使用 Chocolatey 包管理器来安装 OpenOCD。

1.打开 PowerShell(以管理员身份运行):

  • 在 Windows 搜索栏中,输入"PowerShell"。
  • 右键点击"Windows PowerShell"并选择"以管理员身份运行"。

2.检查 PowerShell 执行策略:

  • 输入 Get-ExecutionPolicy 并按回车。
  • 输入 Get-ExecutionPolicy -List 并按回车。

3.安装 Chocolatey:

  • 粘贴并运行以下命令:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

此命令会绕过当前 PowerShell 会话的执行策略并安装 Chocolatey。安装完成后,关闭并重新打开 PowerShell 窗口(仍以管理员身份运行)。

4.安装 OpenOCD:

  • 在新的 PowerShell 窗口中(以管理员身份),输入:
choco install openocd

5.验证 OpenOCD 安装:

  • 输入 Get-Command openocd 并按回车键。

  • 如果安装成功,此命令将显示 openocd.exe 的路径。

2
West Flash 烧录程序
  • 打开 nRF 终端
  • 只需输入 west flash 命令,要烧录您的设备,只需输入 west flash 命令。红色高亮显示的路径表示您编译的 .elf 文件的位置。您可以使用相同的路径找到对应的 .hex 文件,该文件适用于使用 J-Link 调试器进行编程。
tip

如果出现 west flash 错误,说明与 VS Code 中的 CMake 插件存在冲突,您需要移除 CMake 插件。

3
点亮 LED

当我们成功在 Seeed Studio XIAO nRF54L15 Sense 中烧录程序后,您可以看到板子上方的用户指示灯在不停地闪烁绿光,如果您的手中也有相同的渲染效果,说明您已经成功点亮了它!🎊

4
深入了解 nRF Connect SDK 内部机制

要真正掌握 nRF Connect SDK,您需要从内到外了解其构建模块。跳转到这些课程来提升您的知识:

电池供电板

XIAO nRF54L15 内置电源管理芯片,允许 XIAO nRF54L15 通过电池独立供电,或通过 XIAO nRF54L15 的 USB 端口为电池充电。

如果您想为 XIAO 连接电池,我们建议您购买合格的可充电 3.7V 锂电池。焊接电池时,请注意区分正负极。

XIAO nRF54L15 BLE Advertising Power Consumption

电池连接示意图

电池使用说明:

  1. 请使用符合规格的合格电池。
  2. 使用电池时,XIAO 可以通过数据线连接到您的计算机设备,请放心,XIAO 内置电路保护芯片,是安全的。
  3. XIAO nRF54L15 在电池供电时不会有任何 LED 亮起(除非您编写了特定程序),请不要通过 LED 的状态来判断 XIAO nRF54L15 是否工作,请通过您的程序合理判断。

同时,我们为电池充电设计了红色指示灯,通过指示灯显示来告知用户电池当前的充电状态。

caution

焊接时请注意不要短路正负极,以免烧坏电池和设备。

电池电压检测

XIAO nRF54L15 集成了电池电压检测功能,该功能以使用 TPS22916CYFPR 负载开关高效管理电池功率测量为核心。本指南将重点分析电池检测的软件实现**(特别是 main.c 代码)**,并指导您如何在 PlatformIO 环境中轻松部署和使用此功能,避免 Zephyr NCS SDK 的复杂性。

XIAO nRF54L15 BLE Advertising Power Consumption

电池检测示意图

TPS22916CYFPR 芯片的作用:

  • 它是一个智能电源开关,按需控制电池电压的通断。当需要测量电池电压时,它会导通,将电池连接到分压电路;当不需要测量时,它会关断,断开连接。

  • 这个功能帮助我们做什么? 通过这种按需切换机制,芯片大大减少了不必要的电流消耗,有效延长电池寿命。结合后续的分压电路和 nRF54L15 的 ADC(模数转换器),XIAO nRF54L15 能够准确监控电池的剩余电量,为电池供电的低功耗应用(如物联网设备)提供重要的续航优化。

note

以下示例代码是为 PlatformIO 设计的,但它也与 nRF Connect SDK 兼容。

在 PlatformIO 中使用 XIAO nRF54L15 如果您想在 PlatformIO 中使用 XIAO nRF54L15,请参考此教程进行配置:XIAO nRF54L15 PlatformIO 配置

在 nRF Connect SDK 中使用 XIAO nRF54L15 要在 nRF Connect SDK 中使用此代码,您需要移植以下三个文件 main.cprj.confapp.overlay XIAO nRF54L15 PlatformIO 配置


核心代码

#include <inttypes.h>
#include <stddef.h>
#include <stdint.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/regulator.h>
#include <zephyr/drivers/adc.h>
#include <zephyr/kernel.h>


#if !DT_NODE_EXISTS(DT_PATH(zephyr_user)) || \
!DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels)
#error "未指定合适的设备树覆盖"
#endif

#define DT_SPEC_AND_COMMA(node_id, prop, idx) \
ADC_DT_SPEC_GET_BY_IDX(node_id, idx),

/* 设备树中指定的 ADC io-channels 数据。 */
static const struct adc_dt_spec adc_channels[] = {
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels,
DT_SPEC_AND_COMMA)};

static const struct device *const vbat_reg = DEVICE_DT_GET(DT_NODELABEL(vbat_pwr));

int main(void)
{
int err;
uint16_t buf;
int32_t val_mv;
struct adc_sequence sequence = {
.buffer = &buf,
/* 缓冲区大小以字节为单位,不是样本数量 */
.buffer_size = sizeof(buf),
};

regulator_enable(vbat_reg);
k_sleep(K_MSEC(100));

/* 在采样之前单独配置通道。 */
if (!adc_is_ready_dt(&adc_channels[7]))
{
printf("ADC 控制器设备 %s 未就绪\n", adc_channels[7].dev->name);
return 0;
}

err = adc_channel_setup_dt(&adc_channels[7]);
if (err < 0)
{
printf("无法设置通道 #7 (%d)\n", err);
return 0;
}

(void)adc_sequence_init_dt(&adc_channels[7], &sequence);

err = adc_read_dt(&adc_channels[7], &sequence);
if (err < 0)
{
printf("无法读取 (%d)\n", err);
return 0;
}

/*
* 如果使用差分模式,ADC 样本缓冲区中的 16 位值
* 应该是有符号的 2 的补码值。
*/
if (adc_channels[7].channel_cfg.differential)
{
val_mv = (int32_t)((int16_t)buf);
}
else
{
val_mv = (int32_t)buf;
}
err = adc_raw_to_millivolts_dt(&adc_channels[7],
&val_mv);
/* 可能不支持转换为 mV,如果不支持则跳过 */
if (err < 0)
{
printf(" mV 值不可用\n");
}
else
{
printf("电池电压 = %" PRId32 " mV\n", val_mv * 2);
}

regulator_disable(vbat_reg);
return 0;
}

所需硬件

tip

您需要下载最新版本的 J-Link 以获得 nRF54L15 型号板的支持。

所需软件

需要从网站下载 Segger 软件。

  • 步骤 1. 使用 Jlink 连接以下引脚:

pir

  • 步骤 2. 启动 J-Flash 并搜索 nRF54L15,创建一个新项目:

pir

  • 步骤 3. 点击"Target"然后选择"Connect"。

pir

  • 步骤 4. 将 bin 或 hex 文件拖拽到软件中。然后按顺序按下 F4 和 F5。重新烧录完成。

pir

板载按键

XIAO nRF54L15(Sense) 配备了两个重要的物理按键,它们在设备操作和固件编程中起着关键作用:复位按键用户按键。了解它们的功能对于日常使用和固件更新至关重要。


复位按键

复位按键用于对设备执行硬复位操作。

  • 功能:
    • 强制重启: 按下此按键会立即中断所有当前设备操作并使其重启,类似于电源循环。
    • 解决程序卡死: 当设备运行的程序崩溃、进入无限循环或变得无响应时,按下复位按键是强制其恢复正常运行状态的最快方法。
    • 不影响固件: 复位操作不会擦除或更改已编程到设备中的固件。它只是重新启动当前运行的应用程序。
  • 使用场景:
    • 在开发/调试期间快速重新运行程序。
    • 当设备表现出意外行为或卡死时。

用户按键

用户按键是一个多功能的可编程输入,在您的应用程序中提供灵活的控制。

功能:

  • 可定制输入:与复位按键的固定功能不同,用户按键的操作完全由您编程的固件定义。

  • 事件触发:它可以被编程来触发特定事件、控制不同功能,或作为应用程序的通用输入。

使用场景:

  • 在自定义应用程序中激活特定功能或模式。
note

以下示例代码是为 PlatformIO 设计的,但它也与 nRF Connect SDK 兼容。

在 PlatformIO 中使用 XIAO nRF54L15 如果您想在 PlatformIO 中使用 XIAO nRF54L15,请参考此教程进行配置:XIAO nRF54L15 PlatformIO 配置

在 nRF Connect SDK 中使用 XIAO nRF54L15 要在 nRF Connect SDK 中使用此代码,您需要移植以下三个文件 main.cprj.confapp.overlay XIAO nRF54L15 PlatformIO 配置


每次按键时灯亮一次

XIAO nRF54L15 功耗代码示例(PlatformIO)

以下示例代码专为 PlatformIO 设计,但也兼容 nRF Connect SDK。

在 PlatformIO 中使用 XIAO nRF54L15 如果您想在 PlatformIO 中使用 XIAO nRF54L15,请参考此教程进行配置:XIAO nRF54L15 PlatformIO 配置

在 nRF Connect SDK 中使用 XIAO nRF54L15 要在 nRF Connect SDK 中使用此代码,您需要移植以下三个文件 main.cprj.confapp.overlay

移植 main.c

移植 prj.conf/app.overlay,在进行项目配置时,您可能会看到以下文件:

  • prj.conf:此文件用于设置项目的 Kconfig 配置选项,例如启用特定外设或功能。

  • app.overlay:此文件用于修改设备树设置,例如更改引脚功能或调整硬件配置。

如果下面的代码示例包含这些单独的文件,您需要将它们的内容合并到您的 nRF Connect SDK 项目中。

替换位置

  • app.overlay 文件: 将其放在您的 board 文件夹中。

  • prj.conf 文件: 将其放在您的项目根文件夹中。

  • main.c 文件: 将其放在您的 src 文件夹中。

蓝牙连接

本节详细介绍了设备作为蓝牙低功耗(BLE)外设主动广播时的功耗特性。设备实现了自定义 BLE 服务,允许其他中心设备连接并与其交互。

以下图表展示了设备持续广播时的典型功耗配置文件:

XIAO nRF54L15 BLE Advertising Power Consumption

BLE 广播期间的设备功耗

如图所示,设备表现出与每个广播事件相对应的周期性电流峰值,随后是较低电流消耗的时期。广播期间的平均功耗高于系统关闭模式,反映了广播所需的主动无线电操作。


BLE 广播代码示例


以下是用于测试 BLE 广播期间功耗的代码:

#include <stdio.h>

#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/hci.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/uuid.h>
#include <zephyr/bluetooth/gatt.h>

// ONOFF 服务的自定义 128 位 UUID
#define BT_UUID_ONOFF_VAL BT_UUID_128_ENCODE(0x8e7f1a23, 0x4b2c, 0x11ee, 0xbe56, 0x0242ac120002)
#define BT_UUID_ONOFF BT_UUID_DECLARE_128(BT_UUID_ONOFF_VAL)

// ONOFF 动作特征(写入)的自定义 128 位 UUID
#define BT_UUID_ONOFF_ACTION_VAL \
BT_UUID_128_ENCODE(0x8e7f1a24, 0x4b2c, 0x11ee, 0xbe56, 0x0242ac120002)
#define BT_UUID_ONOFF_ACTION BT_UUID_DECLARE_128(BT_UUID_ONOFF_ACTION_VAL)

// ONOFF 读取特征(读取)的自定义 128 位 UUID
#define BT_UUID_ONOFF_READ_VAL \
BT_UUID_128_ENCODE(0x8e7f1a25, 0x4b2c, 0x11ee, 0xbe56, 0x0242ac120003)
#define BT_UUID_ONOFF_READ BT_UUID_DECLARE_128(BT_UUID_ONOFF_READ_VAL)

// 用于保存开/关状态的静态标志,初始化为 0(关闭)
static uint8_t onoff_flag = 0;

// 广播数据:标志和完整设备名称
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), // 通用可发现,无 BR/EDR
BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME, sizeof(CONFIG_BT_DEVICE_NAME) - 1), // 设备名称
};

// 扫描响应数据:包含我们自定义服务的 128 位 UUID
static const struct bt_data sd[] = {
BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_ONOFF_VAL), // 服务 UUID
};

/**
* @brief ONOFF 读取特征的 GATT 读取回调函数。
*
* 当连接的中心设备尝试读取 ONOFF 读取特征时调用此函数。
* 它返回 onoff_flag 的当前值。
*
* @param conn 指向连接对象的指针。
* @param attr 指向正在读取的 GATT 属性的指针。
* @param buf 用于存储读取值的缓冲区。
* @param len 缓冲区的最大长度。
* @param offset 读取属性值的偏移量。
* @return 读取的字节数,或负错误代码。
*/
static ssize_t read_onoff_val(struct bt_conn *conn, const struct bt_gatt_attr *attr,
void *buf, uint16_t len, uint16_t offset)
{
// 属性的 user_data 字段指向 onoff_flag
const uint8_t *value = attr->user_data;
// 执行 GATT 属性读取操作
return bt_gatt_attr_read(conn, attr, buf, len, offset, value, sizeof(*value));
}

/**
* @brief ONOFF 动作特征的 GATT 写入回调函数。
*
* 当连接的中心设备尝试写入 ONOFF 动作特征时调用此函数。
* 它根据接收到的值更新 onoff_flag。
*
* @param conn 指向连接对象的指针。
* @param attr 指向正在写入的 GATT 属性的指针。
* @param buf 包含要写入值的缓冲区。
* @param len 缓冲区中值的长度。
* @param offset 写入属性值的偏移量。
* @param flags 写入操作的标志。
* @return 写入的字节数,或负错误代码。
*/
static ssize_t write_onoff_val(struct bt_conn *conn, const struct bt_gatt_attr *attr,
const void *buf, uint16_t len, uint16_t offset, uint8_t flags)
{
uint8_t val;

// 确保写入数据的长度为 1 字节
if (len != 1U) {
return BT_GATT_ERR(BT_ATT_ERR_INVALID_ATTRIBUTE_LEN);
}

// 确保写入操作从偏移量 0 开始
if (offset != 0) {
return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET);
}

// 从缓冲区获取值
val = *((uint8_t *)buf);

// 根据接收到的值更新 onoff_flag
if (val == 0x00U) {
printf("写入: 0\n");
onoff_flag = 0; // 设置为关闭
} else if (val == 0x01U) {
printf("写入: 1\n");
onoff_flag = 1; // 设置为开启
} else {
// 如果值不是 0 或 1,返回错误
return BT_GATT_ERR(BT_ATT_ERR_VALUE_NOT_ALLOWED);
}

return len; // 返回成功写入的字节数
}

// 定义自定义 GATT 服务及其特征
BT_GATT_SERVICE_DEFINE(lbs_svc,
BT_GATT_PRIMARY_SERVICE(BT_UUID_ONOFF), // 主服务:ONOFF 服务
BT_GATT_CHARACTERISTIC(BT_UUID_ONOFF_ACTION, BT_GATT_CHRC_WRITE, // 特征:ONOFF 动作(写入)
BT_GATT_PERM_WRITE, NULL, write_onoff_val, NULL), // 权限,回调函数
BT_GATT_CHARACTERISTIC(BT_UUID_ONOFF_READ, BT_GATT_CHRC_READ, // 特征:ONOFF 读取(读取)
BT_GATT_PERM_READ, read_onoff_val, NULL, &onoff_flag), // 权限,回调函数,user_data(onoff_flag)
);

/**
* @brief 蓝牙连接成功的回调函数。
*
* @param conn 指向连接对象的指针。
* @param err 错误代码(成功时为 0)。
*/
static void connected(struct bt_conn *conn, uint8_t err)
{
if (err != 0U) {
printf("连接失败 (%02x, %s)\n", err, bt_hci_err_to_str(err));
return;
}

printf("已连接\n");
}

/**
* @brief 蓝牙断开连接的回调函数。
*
* @param conn 指向连接对象的指针。
* @param reason 断开连接的原因。
*/
static void disconnected(struct bt_conn *conn, uint8_t reason)
{
printf("已断开连接 (%02x, %s)\n", reason, bt_hci_err_to_str(reason));
}

// 定义连接回调函数
BT_CONN_CB_DEFINE(conn_callbacks) = {
.connected = connected,
.disconnected = disconnected,
};

/**
* @brief 应用程序的主函数。
*
* 初始化蓝牙协议栈,开始广播,并进入主循环。
* @return 成功时返回 0,失败时返回负错误代码。
*/
int main(void)
{
int err;

// 启用蓝牙协议栈
err = bt_enable(NULL);
if (err < 0) {
printf("蓝牙启用失败 (err %d)", err);
return err;
}

// 开始 BLE 广播
err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd));
if (err < 0) {
printf("广播启动失败 (err %d)", err);
return err;
}

printf("蓝牙已启用");
return 0;
}

超低功耗状态

为了实现设备的极低功耗,我们在 System Off 模式下进行了功耗测试。System Off 模式是 Zephyr OS 提供的深度睡眠模式,在此模式下大部分外设和 CPU 都会关闭,仅保留必要的唤醒源(如 GPIO 中断)以最小化功耗。

以下图表展示了设备进入 System Off 模式后的典型功耗曲线:

XIAO nRF54L15 Ultra-low Power Consumption in System Off Mode

设备在 System Off 模式下的功耗

如图所示,进入 System Off 模式后,功耗显著降低,仅维持在微安级别,这大大延长了电池寿命。当按下 sw0 按钮时,设备将从 System Off 模式唤醒并重新启动。


功耗代码示例


以下是用于测试上述 System Off 模式功耗的代码:

/*
* Copyright (c) 2019 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <inttypes.h>
#include <stdio.h>

#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/hwinfo.h>
#include <zephyr/drivers/comparator.h>
#include <zephyr/kernel.h>
#include <zephyr/pm/device.h>
#include <zephyr/sys/poweroff.h>
#include <zephyr/sys/util.h>

static const struct gpio_dt_spec sw0 = GPIO_DT_SPEC_GET(DT_ALIAS(sw0), gpios);

void print_reset_cause(void)
{
uint32_t reset_cause;

hwinfo_get_reset_cause(&reset_cause);
if (reset_cause & RESET_DEBUG) {
printf("由调试器复位。\n");
} else if (reset_cause & RESET_CLOCK) {
printf("由 GRTC 从 System OFF 唤醒。\n");
} else {
printf("其他唤醒原因 0x%08X。\n", reset_cause);
}
}

int main(void)
{
int rc;
const struct device *const cons = DEVICE_DT_GET(DT_CHOSEN(zephyr_console));

if (!device_is_ready(cons)) {
printf("%s: 设备未就绪。\n", cons->name);
return 0;
}

printf("\n%s system off 演示\n", CONFIG_BOARD);
print_reset_cause();


/* 将 sw0 配置为输入,中断配置为电平有效以允许唤醒 */
rc = gpio_pin_configure_dt(&sw0, GPIO_INPUT);
if (rc < 0) {
printf("无法配置 sw0 GPIO (%d)\n", rc);
return 0;
}

rc = gpio_pin_interrupt_configure_dt(&sw0, GPIO_INT_LEVEL_LOW);
if (rc < 0) {
printf("无法配置 sw0 GPIO 中断 (%d)\n", rc);
return 0;
}

printf("进入 system off;按下 sw0 重新启动\n");


rc = pm_device_action_run(cons, PM_DEVICE_ACTION_SUSPEND);
if (rc < 0) {
printf("无法挂起控制台 (%d)\n", rc);
return 0;
}

hwinfo_clear_reset_cause();
sys_poweroff();

return 0;
}

资源

Seeed Studio XIAO nRF54L15

Seeed Studio XIAO nRF54L15 Sense

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...