Nordic nRF52805 Zephyr OS下低功耗模式应用详细介绍-D

目录

概述

[1. nRF52805 低功耗特性](#1. nRF52805 低功耗特性)

[1.1 功耗模式](#1.1 功耗模式)

[1.2 电源域](#1.2 电源域)

[1.2.1 多级电源管理](#1.2.1 多级电源管理)

[1.2.2 深度休眠与快速唤醒](#1.2.2 深度休眠与快速唤醒)

[1.2.3 RAM 按需保留策略](#1.2.3 RAM 按需保留策略)

[1.2.4 时钟与外设精细关断](#1.2.4 时钟与外设精细关断)

[1.3 同系列功耗对比(3V 典型值)](#1.3 同系列功耗对比(3V 典型值))

[2 Zephyr RTOS 低功耗配置](#2 Zephyr RTOS 低功耗配置)

[2.1 基础配置](#2.1 基础配置)

[2.2 设备树配置](#2.2 设备树配置)

[3. 低功耗模式应用](#3. 低功耗模式应用)

[3.1 基本低功耗操作](#3.1 基本低功耗操作)

[3.2 深度睡眠模式](#3.2 深度睡眠模式)

[3.3 设备电源管理](#3.3 设备电源管理)

[4. Watchdog 在低功耗模式下的使用](#4. Watchdog 在低功耗模式下的使用)

[4.1 Watchdog 配置](#4.1 Watchdog 配置)

[4.2 设备树配置](#4.2 设备树配置)

[4.3 Watchdog 初始化和使用](#4.3 Watchdog 初始化和使用)

[4.4 Watchdog 在低功耗模式下的注意事项](#4.4 Watchdog 在低功耗模式下的注意事项)

[5. 完整应用示例](#5. 完整应用示例)

[5.1 主程序](#5.1 主程序)

[5.2 电源管理函数](#5.2 电源管理函数)

[6 低功耗优化策略](#6 低功耗优化策略)


概述

nRF52805 是 Nordic 公司研发的低功耗蓝牙系统级芯片(SoC),其核心设计理念为"极深休眠与动态能效优化相结合",专门针对蓝牙 5.2 协议及 2.4GHz 私有协议应用场景进行开发。该芯片的核心技术优势在于兼顾低功耗性能与小封装特性,可适配纽扣电池供电的长期待机设备,包括蓝牙信标、一次性医疗设备、微型传感器、触控笔等,是紧凑型低功耗无线产品的优选技术解决方案。

1. nRF52805 低功耗特性

1.1 功耗模式

下述参数均为常温环境下的典型值,实际功耗水平受供电电压、外接元器件选型及工作环境温度等多种因素影响,在产品设计阶段需预留合理冗余,以确保功耗性能的稳定性与可靠性。

  • 深度休眠模式(System OFF):无 RAM 保留状态下,电流低至 0.3 μA ;保留 24KB RAM 状态下,电流约为 0.5 μA,适用于设备长期待机场景,可最大限度降低设备待机功耗。

  • 低功耗运行模式(System ON):保留 RAM 且实时时钟(RTC)正常运行时,电流约为 1.1 μA ;无 RAM 保留状态下,电流约为 1.0 μA,可有效平衡设备快速响应能力与低功耗性能需求。

  • 无线收发功耗:蓝牙发射(TX @ 0dBm)与接收(RX)的峰值电流均为 4.6 mA,可在保障无线通信稳定性的前提下,满足低功耗设计要求。

  • 运行能效:在 CoreMark 测试标准下,代码运行于 RAM 时的能效为 32.8 μA/MHz ;运行于 Flash 时的能效为 34.4 μA/MHz,其能效表现优于同级别入门型 SoC,可有效降低设备运行阶段的能耗损耗。

|----------------|---------------------|
| 模式 | 功能 |
| System ON | 正常运行模式,所有功能启用 |
| System ON Idle | CPU 睡眠,外设保持运行 |
| System OFF | 深度睡眠模式,功耗最低,仅保留关键功能 |

1.2 电源域

nRF52805 的低功耗性能并非通过单纯降低电流实现,而是通过对电源、时钟及外设的精细化管控,达成"按需耗能、精准控耗"的设计目标,其核心实现机制具体如下:

1.2.1 多级电源管理

该芯片集成直流-直流(DC/DC)转换器与低压差稳压器(LDO),支持模式自动切换功能:在低负载场景(如设备休眠、低频率运行)下,系统自动切换至 LDO 低电流模式,有效降低电源转换损耗;在高负载场景(如无线通信、高速运算)下,自动切换至 DC/DC 模式,提升供电效率,进一步优化设备运行功耗水平。

该芯片集成直流-直流(DC/DC)转换器与低压差稳压器(LDO),支持模式自动切换功能:在低负载场景(如设备休眠、低频率运行)下,系统自动切换至 LDO 低电流模式,有效降低电源转换损耗;在高负载场景(如无线通信、高速运算)下,自动切换至 DC/DC 模式,提升供电效率,进一步优化设备运行功耗水平。

1.2.2 深度休眠与快速唤醒

System OFF 模式为该芯片的最低功耗模式,电流低至 0.3 μA,可通过外部中断、RTC 定时唤醒等方式实现激活;芯片集成 64MHz 内部振荡器(HFINT),唤醒响应时间极短,无需等待外部晶振启动,既能保障设备长期待机的续航能力,又能确保设备具备快速响应特性,避免因唤醒延迟影响产品使用体验。

1.2.3 RAM 按需保留策略

nRF52805 支持 RAM 灵活保留配置,提供两档可选方案:全保留(24KB)状态下功耗为 0.5 μA,适用于需快速恢复运行状态、保留关键数据的应用场景;无 RAM 保留状态下功耗为 0.3 μA,适用于对数据留存无要求、追求极致续航的一次性设备,通过按需配置可最大化挖掘设备续航潜力。

1.2.4 时钟与外设精细关断

时钟系统支持精细化控制:低频时钟(LFCLK)可在低功耗RC时钟(LFRC,侧重低功耗)与高精度晶振时钟(LFXO,侧重高精度)之间灵活切换,蓝牙通信期间切换至 LFXO 以保障通信精度,非通信期间切换至 LFRC 以降低时钟系统功耗;高频时钟(HFCLK)按需启停,无需高速运算时及时关闭,减少无效能耗。同时,可编程外设互连(PPI)及各类外设支持独立关断,可有效避免闲置外设产生无效功耗,进一步优化整体功耗表现。

|-------|--------------|
| 模式 | 功能 |
| VDD | 主电源域 |
| VDDIO | IO 电源域 |
| VDDH | 高电压域(用于模拟电路) |

1.3 同系列功耗对比(3V 典型值)

nRF52805 与同系列入门款 SoC 的功耗表现基本一致,其核心竞争优势集中在小封装(QFN24,3x3mm)及双层 PCB 适配性,可满足紧凑型产品设计需求,关键参数对比如下表所示:

|--------------|----------------------|-----------------------|-------------|
| 型号 | System OFF(无 RAM 保留) | System ON(保留 RAM+RTC) | 无线峰值(TX/RX) |
| nRF52805 | 0.3 μA | 1.1 μA | 4.6 mA |
| nRF52810 | 0.3 μA | 1.1 μA | 4.6 mA |
| nRF52832 | 0.3 μA | 1.1 μA | 4.6 mA |

2 Zephyr RTOS 低功耗配置

2.1 基础配置

在 prj.conf 中添加以下配置:

cpp 复制代码
# 启用电源管理
CONFIG_PM=y

# 启用设备电源管理
CONFIG_DEVICE_POWER_MANAGEMENT=y

# 启用系统电源状态
CONFIG_PM_SYSTEM=y

# 配置低功耗策略
CONFIG_PM_DEVICE=y

# 启用电池监测
CONFIG_BATTERY_GAUGE=y

2.2 设备树配置

在设备树文件中配置电源管理:

cpp 复制代码
/ {
    power-management {
        compatible = "nordic,nrf-power-management";
        status = "okay";
    };
};

3. 低功耗模式应用

3.1 基本低功耗操作

cpp 复制代码
#include <zephyr/kernel.h>
#include <zephyr/pm/pm.h>

// 进入 CPU 空闲模式
void enter_idle_mode(void)
{
    k_cpu_idle();
}

// 带超时的空闲模式
void enter_sleep_mode(int milliseconds)
{
    k_sleep(K_MSEC(milliseconds));
}

3.2 深度睡眠模式

cpp 复制代码
#include <zephyr/pm/pm.h>

// 进入深度睡眠模式
void enter_deep_sleep(void)
{
    // 配置唤醒源
    // ...
    
    // 进入深度睡眠
    pm_state_force(PM_STATE_SUSPEND_TO_IDLE);
}

3.3 设备电源管理

cpp 复制代码
#include <zephyr/pm/device.h>

// 关闭不需要的设备
void power_off_devices(void)
{
    const struct device *i2c_dev = DEVICE_DT_GET(DT_NODELABEL(i2c0));
    const struct device *uart_dev = DEVICE_DT_GET(DT_NODELABEL(uart0));
    
    pm_device_action_run(i2c_dev, PM_DEVICE_ACTION_SUSPEND);
    pm_device_action_run(uart_dev, PM_DEVICE_ACTION_SUSPEND);
}

// 重新启用设备
void power_on_devices(void)
{
    const struct device *i2c_dev = DEVICE_DT_GET(DT_NODELABEL(i2c0));
    const struct device *uart_dev = DEVICE_DT_GET(DT_NODELABEL(uart0));
    
    pm_device_action_run(i2c_dev, PM_DEVICE_ACTION_RESUME);
    pm_device_action_run(uart_dev, PM_DEVICE_ACTION_RESUME);
}

4. Watchdog 在低功耗模式下的使用

4.1 Watchdog 配置

在 prj.conf 中添加以下配置:

cpp 复制代码
# 启用 watchdog
CONFIG_WATCHDOG=y

# Nordic watchdog 驱动
CONFIG_WDT_NRF=y

# 启用 watchdog 回调
CONFIG_WDT_DISABLE_AT_BOOT=y

4.2 设备树配置

cpp 复制代码
/ {
    watchdog: watchdog {
        compatible = "nordic,nrf-watchdog";
        status = "okay";
        label = "WDT";
    };
};

4.3 Watchdog 初始化和使用

cpp 复制代码
#include <zephyr/drivers/watchdog.h>

const struct device *wdt_dev;
int wdt_channel_id;

// 初始化 watchdog
void watchdog_init(void)
{
    wdt_dev = DEVICE_DT_GET(DT_NODELABEL(wdt));
    
    struct wdt_timeout_cfg wdt_cfg = {
        .window = 0,
        .flags = WDT_FLAG_RESET_SOC,
        .callback = watchdog_callback,
        .minutes = 0,
        .seconds = 30,  // 30秒超时
        .milliseconds = 0,
        .microseconds = 0,
    };
    
    wdt_channel_id = wdt_install_timeout(wdt_dev, &wdt_cfg);
    wdt_setup(wdt_dev, 0);
}

// Watchdog 回调函数
void watchdog_callback(const struct device *dev, int channel_id)
{
    // 保存关键数据
    save_critical_data();
    printk("Watchdog timeout! Saving data...\n");
}

// 喂狗
void watchdog_feed(void)
{
    wdt_feed(wdt_dev, wdt_channel_id);
}

4.4 Watchdog 在低功耗模式下的注意事项

  • 独立时钟源 :nRF52805 的 Watchdog 使用独立的 32.768 kHz 振荡器

  • 低功耗运行 :Watchdog 在所有低功耗模式下都能正常运行

  • 超时时间调整 :根据低功耗模式的持续时间调整超时时间

  • 喂狗时机 :在进入低功耗模式前喂狗,确保不会在模式切换过程中触发复位

5. 完整应用示例

5.1 主程序

cpp 复制代码
#include <zephyr/kernel.h>
#include <zephyr/drivers/watchdog.h>
#include <zephyr/pm/pm.h>
#include <zephyr/pm/device.h>

const struct device *wdt_dev;
int wdt_channel_id;

// 传感器数据
struct sensor_data {
    uint16_t temperature;
    uint16_t humidity;
    uint16_t battery;
};

struct sensor_data current_data;

// Watchdog 回调
void watchdog_callback(const struct device *dev, int channel_id)
{
    printk("Watchdog timeout! Saving last data...\n");
    // 保存数据到 Flash
    save_data_to_flash(&current_data);
}

// 初始化系统
void system_init(void)
{
    // 初始化 watchdog
    wdt_dev = DEVICE_DT_GET(DT_NODELABEL(wdt));
    
    struct wdt_timeout_cfg wdt_cfg = {
        .window = 0,
        .flags = WDT_FLAG_RESET_SOC,
        .callback = watchdog_callback,
        .minutes = 0,
        .seconds = 30,
        .milliseconds = 0,
        .microseconds = 0,
    };
    
    wdt_channel_id = wdt_install_timeout(wdt_dev, &wdt_cfg);
    wdt_setup(wdt_dev, 0);
    
    // 初始化电源管理
    pm_init();
}

// 读取传感器数据
void read_sensors(void)
{
    // 读取温度、湿度、电池电压
    current_data.temperature = read_temperature();
    current_data.humidity = read_humidity();
    current_data.battery = read_battery();
    
    printk("Temperature: %d, Humidity: %d, Battery: %d\n", 
           current_data.temperature, current_data.humidity, current_data.battery);
}

// 发送数据
void send_data(void)
{
    // 通过蓝牙发送数据
    ble_send_data(&current_data);
}

// 低功耗模式管理
void low_power_management(void)
{
    // 喂狗
    watchdog_feed();
    
    // 关闭不需要的设备
    power_off_devices();
    
    // 进入低功耗模式
    k_cpu_idle();
    
    // 重新启用设备
    power_on_devices();
}

int main(void)
{
    // 初始化系统
    system_init();
    
    // 初始化硬件
    hardware_init();
    
    printk("System started\n");
    
    while (1) {
        // 读取传感器数据
        read_sensors();
        
        // 发送数据
        send_data();
        
        // 进入低功耗模式
        low_power_management();
    }
    
    return 0;
}

5.2 电源管理函数

cpp 复制代码
// 关闭设备
void power_off_devices(void)
{
    const struct device *i2c_dev = DEVICE_DT_GET(DT_NODELABEL(i2c0));
    const struct device *uart_dev = DEVICE_DT_GET(DT_NODELABEL(uart0));
    
    if (device_is_ready(i2c_dev)) {
        pm_device_action_run(i2c_dev, PM_DEVICE_ACTION_SUSPEND);
    }
    
    if (device_is_ready(uart_dev)) {
        pm_device_action_run(uart_dev, PM_DEVICE_ACTION_SUSPEND);
    }
}

// 启用设备
void power_on_devices(void)
{
    const struct device *i2c_dev = DEVICE_DT_GET(DT_NODELABEL(i2c0));
    const struct device *uart_dev = DEVICE_DT_GET(DT_NODELABEL(uart0));
    
    if (device_is_ready(i2c_dev)) {
        pm_device_action_run(i2c_dev, PM_DEVICE_ACTION_RESUME);
    }
    
    if (device_is_ready(uart_dev)) {
        pm_device_action_run(uart_dev, PM_DEVICE_ACTION_RESUME);
    }
}

6 低功耗优化策略

1) 硬件优化

  • 使用外部晶振 :需要高精度时钟时使用外部晶振

  • 关闭未使用的外设 :禁用不需要的外设时钟

  • 优化 GPIO 配置 :将未使用的 GPIO 配置为高阻态

2)软件优化

  • 合理的任务调度 :使用 Zephyr 的工作队列和定时器

  • 批量处理 :减少唤醒次数,批量处理数据

  • 动态时钟管理 :根据任务需求调整时钟频率

  • Watchdog 配置 :根据应用需求设置合理的超时时间

3)功耗测量

  • 使用能源监测工具 :如 Nordic Power Profiler Kit

  • 软件功耗估算 :使用 Zephyr 的功耗统计功能

  • 优化循环 :减少不必要的唤醒和处理

相关推荐
硬汉嵌入式3 天前
Zephyr 十周年报告:开源嵌入式创新的十年历程
zephyr
fitpolo4 天前
串行通讯(I2C)
zephyr
【 STM32开发 】16 天前
【STM32 + CubeMX】低功耗 -- SLEEP 睡眠模式
stm32·单片机·低功耗·sleep·睡眠模式
mftang2 个月前
Zephyr RTOS中的k_stack相关函数
zephyr·k_stack
无人装备硬件开发爱好者2 个月前
深度解析 NFC P2P 双向通信技术:I2C 低功耗 MCU 读写实现与全场景应用——下
低功耗·nfc·nfc p2p
fitpolo2 个月前
向控制台打印消息并进行日志记录
zephyr
无人装备硬件开发爱好者2 个月前
深度解析 NFC P2P 双向通信技术:I2C 低功耗 MCU 读写实现与全场景应用——上
低功耗·nfc·nfc p2p
BackCatK Chen2 个月前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
智驾2 个月前
【瑞萨RA8D1 LVGL/LWIP评测】二、CPKCOR-RA8D1B Zephyr工程适配
瑞萨·zephyr·ra8d1 lvgl/lwip