目录概述1. nRF52805 低功耗特性1.1 功耗模式1.2 电源域1.2.1 多级电源管理1.2.2 深度休眠与快速唤醒1.2.3 RAM 按需保留策略1.2.4 时钟与外设精细关断1.3 同系列功耗对比3V 典型值2 Zephyr RTOS 低功耗配置2.1 基础配置2.2 设备树配置3. 低功耗模式应用3.1 基本低功耗操作3.2 深度睡眠模式3.3 设备电源管理4. Watchdog 在低功耗模式下的使用4.1 Watchdog 配置4.2 设备树配置4.3 Watchdog 初始化和使用4.4 Watchdog 在低功耗模式下的注意事项5. 完整应用示例5.1 主程序5.2 电源管理函数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 IdleCPU 睡眠外设保持运行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主电源域VDDIOIO 电源域VDDH高电压域用于模拟电路1.3 同系列功耗对比3V 典型值nRF52805 与同系列入门款 SoC 的功耗表现基本一致其核心竞争优势集中在小封装QFN243x3mm及双层 PCB 适配性可满足紧凑型产品设计需求关键参数对比如下表所示型号System OFF无 RAM 保留System ON保留 RAMRTC无线峰值TX/RXnRF528050.3 μA1.1 μA4.6 mAnRF528100.3 μA1.1 μA4.6 mAnRF528320.3 μA1.1 μA4.6 mA2 Zephyr RTOS 低功耗配置2.1 基础配置在 prj.conf 中添加以下配置# 启用电源管理 CONFIG_PMy # 启用设备电源管理 CONFIG_DEVICE_POWER_MANAGEMENTy # 启用系统电源状态 CONFIG_PM_SYSTEMy # 配置低功耗策略 CONFIG_PM_DEVICEy # 启用电池监测 CONFIG_BATTERY_GAUGEy2.2 设备树配置在设备树文件中配置电源管理/ { power-management { compatible nordic,nrf-power-management; status okay; }; };3. 低功耗模式应用3.1 基本低功耗操作#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 深度睡眠模式#include zephyr/pm/pm.h // 进入深度睡眠模式 void enter_deep_sleep(void) { // 配置唤醒源 // ... // 进入深度睡眠 pm_state_force(PM_STATE_SUSPEND_TO_IDLE); }3.3 设备电源管理#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 中添加以下配置# 启用 watchdog CONFIG_WATCHDOGy # Nordic watchdog 驱动 CONFIG_WDT_NRFy # 启用 watchdog 回调 CONFIG_WDT_DISABLE_AT_BOOTy4.2 设备树配置/ { watchdog: watchdog { compatible nordic,nrf-watchdog; status okay; label WDT; }; };4.3 Watchdog 初始化和使用#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 主程序#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 电源管理函数// 关闭设备 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 的功耗统计功能- 优化循环 减少不必要的唤醒和处理