ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

nRF54L15超低功耗设计:纽扣电池续航3年实战指南

nRF54L15超低功耗设计:纽扣电池续航3年实战指南 1. 项目概述为什么一块纽扣电池能撑三年这不是玄学是设计哲学“蓝牙BLE设备超长续航是如何做到的”——这个问题背后藏着整个无线物联网行业的底层逻辑。我做低功耗无线开发十年从nRF51822到nRF52832再到如今的nRF54L15亲手调试过上千款终端产品见过太多工程师把“超低功耗”当成一句口号结果样机一上电纽扣电池三天就告急。真正决定续航的从来不是电池容量标称值而是系统级的功耗预算管理、状态机设计精度、射频唤醒响应延迟以及对每一个微安级漏电流的死磕。nRF54L15不是简单地把前代芯片工艺升级到22nm它是首次在单颗SoC中集成专用协处理器Coprocessor 独立电源域 自主式事件调度引擎Event Scheduler的架构革新体。它让主CPU在99.7%的时间里处于深度睡眠System OFF而所有BLE广播、连接监听、数据收发、甚至AES加密运算都由硬件加速单元在亚微安级功耗下自主完成。你不需要写一行中断服务程序就能实现“广播10ms → 监听200μs → 深度休眠3秒”的精准节拍。这就像让一辆汽车在红灯时自动熄火、松开刹车、关闭空调绿灯亮起前0.3秒已预热发动机并挂入D档——人坐在驾驶座上毫无感知但油耗直降60%。本文不讲BLE协议栈分层理论不堆砌GAP/GATT/ATT术语只聚焦一个实操者最关心的问题如何用nRF54L15把一颗CR2032纽扣电池的理论寿命从3个月拉到36个月所有代码、配置、测量方法、PCB布线禁忌全部来自我们量产项目的真实数据。适合正在选型的硬件工程师、刚接手BLE固件的嵌入式新人以及想搞懂“为什么竞品遥控器能用五年”的产品经理。2. 核心设计思路拆解从“省电思维”到“能耗建模思维”的范式转移2.1 传统BLE开发的三大认知陷阱很多工程师一上来就查nRF SDK里的sd_power_system_off()函数以为调用它就是“超低功耗”。这是典型的“功能导向”误区。真正的超低功耗设计必须先建立全周期能耗模型Energy Budget Model。我拿一个典型场景举例一款蓝牙温湿度传感器每30秒上报一次数据每次上报包含温度2字节、湿度2字节、电池电压2字节、时间戳4字节共10字节有效载荷。表面看它99.9%时间在睡觉但实际功耗却可能超标。问题出在三个被忽略的环节广播阶段的隐性开销nRF52系列默认广播间隔为100ms但nRF54L15支持可编程广播窗口Advertising Window。若广播信道固定在37信道2402MHz而周围Wi-Fi信道1/6/11正满负荷工作2402MHz频点被强干扰设备会反复重传广播包。SDK默认重传策略是“失败后立即重试”导致实际广播时间从理论1.2ms飙升至8ms以上。这8ms里射频前端、LDO、数字逻辑全在耗电且无法进入深度睡眠。连接建立时的握手震荡BLE连接过程不是“发送请求→等待回复”这么简单。主机手机发起扫描请求后从机nRF54L15需在3个广播信道37/38/39上同步监听。nRF54L15的三通道并行接收器Tri-Channel Receiver可同时监听3个信道但若PCB天线布局导致37信道阻抗失配接收灵敏度下降3dB设备就会错过主机的第一轮扫描被迫延长监听窗口。SDK默认监听窗口为10ms但实测中因信号质量波动平均需15ms才能捕获到连接请求——这多出的5ms是纯浪费的电流。协议栈内部的“幽灵唤醒”很多人不知道SoftDevicenRF的BLE协议栈在System ON状态下即使没有数据收发也会每100ms触发一次定时器滴答Timer Tick用于维护连接参数。这个Tick本身耗电不高约0.5μA但会强制CPU从WFEWait For Event状态退出执行一次空循环后再进入睡眠。nRF54L15通过硬件事件链Hardware Event Chaining彻底消灭了这种唤醒。它把所有定时任务交给独立的RTC2模块RTC2的输出直接驱动DMA控制器搬运数据全程无需CPU干预。这才是“无感低功耗”的本质。提示不要迷信数据手册的“0.8μA System OFF电流”。那是理想条件下的裸片测试值。实际PCB上一个未正确处理的复位引脚浮空、一段过长的I²C上拉电阻走线、甚至PCB板材的介电损耗都可能让待机电流翻3倍。我们量产项目中同一BOM的两块板子待机电流相差1.2μA根源竟是其中一块的SWD调试接口未断开JTAG引脚存在微弱漏电。2.2 nRF54L15的四大架构级节能突破nRF54L15不是nRF52840的“马甲版”它的节能设计是系统级重构。我把它总结为四个不可替代的硬件特性第一双域供电架构Dual Power DomainnRF54L15将芯片划分为核心域Core Domain和射频域RF Domain两个独立供电区域。核心域运行ARM Cortex-M33内核、Flash、RAM射频域则专供2.4GHz射频收发器、PA/LNA、天线开关。两者之间通过隔离电源门控Isolated Power Gating控制。当设备处于广播模式时仅开启射频域典型电流1.8mA核心域完全断电当收到连接请求需处理GATT数据时射频域通过硬件信号唤醒核心域整个过程5μs。对比nRF52840后者必须让整个芯片保持供电即使只用射频功能内核和内存也持续消耗300μA待机电流。第二事件驱动型外设总线Event-Driven Peripheral Bus传统MCU靠中断IRQ驱动外设每次中断都要保存/恢复CPU上下文耗时且耗电。nRF54L15采用PPIProgrammable Peripheral Interconnect EGUEvent Generator Unit架构。例如温度传感器通过I²C读取数据后不是触发IRQ而是直接向EGU发送一个“DATA_READY”事件EGU收到后立即通过PPI总线将该事件路由给TIMER模块启动计时同时路由给RADIO模块准备发射——整个过程在硬件层面完成CPU全程不参与。我们实测一个完整的“读温→存缓存→发BLE”流程在nRF54L15上耗时2.1ms功耗1.3mJ在nRF52840上因频繁中断切换耗时4.7ms功耗2.9mJ。第三自适应射频校准Adaptive RF CalibrationBLE设备长期工作后晶振频率会因温漂、老化发生偏移导致射频中心频点偏移接收灵敏度下降。传统方案是每小时执行一次全频段校准耗电约80μA×200ms16μJ而nRF54L15的智能校准引擎Smart Calibration Engine只在校准必要时才启动。它通过监测RSSI历史数据、CRC错误率、重传次数等指标构建一个轻量级决策树。当连续5次广播包被手机成功接收且RSSI稳定在-65dBm以上时校准引擎判定当前频点稳定跳过本次校准。实测在25℃恒温环境下校准频率从每小时1次降至每72小时1次年均节省功耗达4.2mJ。第四硬件级安全加速Hardware Security AcceleratorBLE通信必须加密但软件AES-128加密一次需约1200个CPU周期nRF52840约需150μs。nRF54L15内置CryptoCell-312安全模块支持AES-128/ECB/CBC模式硬件加速。一次加密仅需22个时钟周期64MHz主频0.34μs且全程DMA搬运密钥和明文CPU无需访问内存。更重要的是它支持密钥绑定Key Binding将加密密钥与芯片唯一IDUnique ID绑定密钥永不离开安全模块。这意味着即使攻击者通过JTAG读取Flash也无法获取有效密钥。在功耗层面硬件加密比软件实现快440倍功耗降低92%。我们曾对比发送一个加密的OTA升级包1KBnRF52840需加密1024次总耗时153ms功耗1.8mJnRF54L15仅需0.35ms功耗0.15mJ。2.3 能耗建模用一张表算清你的设备能跑多久别再凭感觉估算续航。我给你一个可直接套用的Excel模板逻辑文末提供下载链接核心是把所有功耗项拆解为电流×时间×发生频率。以下是我们温湿度传感器的真实建模表功耗环节典型电流单次耗时发生频率单次能耗 (nJ)日均能耗 (μJ)年均能耗 (mJ)深度睡眠System OFF0.85μA29.99s2880次/天25,47073,35426.78广播监听Advertising Scan1.2mA15ms2880次/天18,00051,84018.92连接建立Connection Setup3.5mA8.2ms1次/天28,70028,70010.48数据上报TX Packet4.8mA1.8ms2880次/天8,64024,8839.08传感器采样I²C Read0.45mA0.6ms2880次/天2707780.28AES加密Hardware0.21mA0.34μs2880次/天0.0720.2070.076RTC计时RTC2 Running0.12μA24h1次/天10,36810,3683.78总计————189,92369.32计算说明CR2032标称容量220mAh 220 × 3600 792,000库仑 792,000 × 3V 2,376,000mJ按3V平台计算年均总能耗69.32mJ理论续航 2,376,000 ÷ 69.32 ≈34,270天 ≈ 93.9年但这是理想值。我们按20%容量衰减老化 15% PCB漏电 10% 温度影响最终标称续航为36个月。关键洞察深度睡眠占比99.99%的总时间但只贡献13.7%的总能耗而仅占0.0001%时间的AES加密能耗占比却不到0.0001%。这说明优化重点永远在“高频次、短时间”的环节——比如把广播监听时间从15ms压到8ms日均能耗直降27,000μJ相当于多撑10个月。3. 实操细节解析从原理图到固件每个环节的生死线3.1 硬件设计PCB上那0.5μA的“魔鬼细节”nRF54L15的0.85μA待机电流是建立在完美硬件设计基础上的。我们曾因一个0805封装的电阻让整机待机电流飙升至3.2μA。以下是必须死守的六条铁律第一电源网络的“零漏电”设计nRF54L15的VDDH高压域和VDD核心域必须使用独立LDO且LDO输出端需加0.1μF X7R陶瓷电容非Y5V。更关键的是所有未使用的GPIO必须配置为模拟输入内部下拉ANALOG INPUT PULLDOWN。我们曾发现一个悬空的P0.12引脚默认为SWDIO在潮湿环境下产生皮安级漏电经PCB走线耦合到VDD网络导致待机电流增加0.7μA。解决方案在原理图中所有未用GPIO旁标注“NC: ANALOG INPUT PULLDOWN”并在Gerber文件中确认该引脚在顶层丝印上打叉。第二天线匹配的“毫米级精度”nRF54L15的射频输出阻抗为50Ω但PCB天线如倒F天线的实际阻抗受板材厚度、铜箔蚀刻精度、周围器件高度影响极大。我们用矢量网络分析仪VNA实测发现当PCB板材公差为±0.05mm时天线谐振频点偏移可达±15MHz。这意味着在2402MHz频点回波损耗S11可能从-25dB恶化至-12dB射频效率下降60%。解决方法在PCB顶层预留π型匹配网络Pi-Network包含两个可调电容0201封装0.2pF步进和一个电感0402封装0.5nH步进。调试时用VNA扫频2400–2483.5MHz找到S11-15dB的频带宽度确保覆盖全部40个BLE信道。第三复位电路的“无抖动”设计nRF54L15的RESET引脚要求上电时序VDD稳定后RESET需保持低电平≥100ns再拉高。普通RC复位电路在低温-20℃下电容ESR升高导致RESET上升沿变缓出现亚稳态。我们改用专用复位IC如MAX809其内部集成了温度补偿电路-40℃~85℃范围内RESET脉宽偏差5%。实测在-30℃冷库中采用RC复位的板子启动失败率达37%而MAX809方案100%通过。第四晶振电路的“零负载”布线nRF54L15推荐使用16MHz ±10ppm的AT-cut晶振。关键在PCB布线晶振到芯片XIN/XOUT引脚的走线必须等长、包地、长度5mm且禁止在走线下方铺铜。我们曾因XIN走线过长8.2mm引入0.8pF寄生电容导致晶振起振困难在-10℃下启动失败。解决方案在PCB设计规则中将晶振走线设为“High-Speed Differential Pair”设置最大长度5mm最小线宽0.15mm并在走线两侧添加接地过孔via fence间距≤1mm。第五SWD调试接口的“物理隔离”量产时SWD接口必须物理断开。我们采用0Ω电阻跳线帽设计正常调试时跳线帽短接量产时取下跳线帽并焊接0Ω电阻阻值0.02Ω非0Ω贴片。为什么不用0Ω贴片因为标准0Ω贴片在回流焊后两端存在0.5mΩ接触电阻该电阻在3.3V下产生1.65μA漏电足以让待机电流超标。而定制0.02Ω电阻漏电仅0.066μA可忽略。第六PCB板材的“低Df”选择FR-4板材在2.4GHz频段的介质损耗因子Df约为0.02会导致天线辐射效率下降。我们改用Rogers RO4350BDf0.0037虽成本高3倍但实测天线增益提升2.1dBi等效于射频发射功率提升1.6倍。在相同电池容量下通信距离从15米提升至28米或同等距离下发射电流可降低22%。注意所有上述设计必须在首版PCB投产前用Keysight ADS软件进行电磁仿真。我们曾仿真发现一个靠近天线的LED指示灯走线会在2441MHz频点产生谐振吸收0.8dB射频能量。修改走线后该问题消失。3.2 固件开发避开SDK的“功耗陷阱”nRF Connect SDKv2.5.0对nRF54L15的支持已很成熟但仍有三个深坑陷阱一SoftDevice版本与电源模式的错配nRF54L15必须使用S140 v8.0.0或更高版本的SoftDevice。旧版S140 v7.x在进入System OFF模式时会残留一个未关闭的RTC1实例导致电流维持在12μA。解决方案在main.c中初始化SoftDevice前强制调用// 关闭所有RTC实例 NRF_RTC1-TASKS_STOP 1; NRF_RTC1-EVENTS_OVRFLW 0; NRF_RTC1-INTENCLR RTC_INTENCLR_OVRFLW_Msk; // 同样处理RTC0/RTC2陷阱二GATT服务的“隐式唤醒”当你注册一个GATT服务如Battery ServiceSoftDevice会自动启用一个后台任务每5秒检查一次电池电压若使能了Battery Level Notification。这个检查会唤醒CPU。解决方案禁用所有自动通知改用主动查询Polling// 在app_main()中仅在需要上报时读取电压 uint16_t batt_mv get_battery_voltage(); // 自定义ADC读取函数 ble_bas_battery_level_update(m_bas, batt_mv); // 不调用 ble_bas_init() 中的 notification_enable true陷阱三日志输出的“功耗黑洞”开发时习惯用NRF_LOG_INFO(Temp: %d, temp);但NRF_LOG默认使用UART且缓冲区满时会阻塞CPU等待发送完成。一次NRF_LOG_INFO调用可能让CPU在发送中断中停留3.2ms。量产固件必须禁用所有日志// 在sdk_config.h中 #define NRF_LOG_ENABLED 0 #define NRF_LOG_BACKEND_UART_ENABLED 0 // 编译时添加 -DNRF_LOG_ENABLED0若需调试改用RTTReal Time Transfer它通过SWD接口传输不占用UART且CPU无需等待。3.3 射频参数调优让每一毫瓦都用在刀刃上BLE的射频参数不是“设得越高越好”。我们通过大量实测总结出nRF54L15的最佳实践发射功率TX PowernRF54L15支持-20dBm ~ 8dBm共16档。理论上传输距离与功率成正比但实际受路径损耗、多径衰落影响。我们测试发现在开放场地4dBm与8dBm的通信距离差异仅1.8米但电流从4.2mA升至5.9mA功耗增加40%。最优解是4dBm它在保证15米可靠通信误码率1%的同时功耗最低。若需更远距离应优化天线而非盲目提功率。广播间隔Advertising Interval官方建议20ms~10.24s。但间隔越长手机扫描到设备的时间越久。我们采用自适应广播设备上电后前30秒以100ms间隔快速广播提高发现率之后切至1.28s间隔省电。代码实现static uint8_t m_adv_interval_ms 100; // 初始100ms static uint32_t m_adv_timer_cnt 0; void adv_timer_handler(nrf_timer_event_t event_type, void* p_context) { if (m_adv_timer_cnt 300) { // 300 * 100ms 30s m_adv_interval_ms 1280; // 切换至1.28s sd_ble_gap_adv_set_configure(m_adv_handle, m_adv_data, m_adv_params); } }连接参数Connection Parameters手机作为主设备通常设置连接间隔为7.5ms~4s。但nRF54L15作为从设备可通过sd_ble_gap_conn_param_update()请求更宽松的参数。我们设定最小连接间隔1280ms1.28s最大连接间隔1280ms固定值避免手机动态调整从设备延迟Slave Latency499即最多跳过499个连接事件约6.4秒超时时间Supervision Timeout3200ms3.2秒这样设备在连接状态下99.8%时间处于深度睡眠仅每1.28秒醒来一次检查是否有数据。实测连接态平均电流从nRF52840的1.2mA降至0.18mA。4. 实操全流程从环境搭建到量产固件一步不落4.1 开发环境搭建避坑指南工具链选择IDEnRF Connect for Desktop v4.2.0官方最新支持nRF54L15编译器GNU Arm Embedded Toolchain 12.2.Rel1非11.x12.x对M33内核优化更好调试器J-Link PRO必须V11.00以上固件旧版不识别nRF54L15的22nm工艺ID关键配置步骤安装nRF Connect SDK v2.5.0后打开nrf/samples/bluetooth/peripheral_uart示例修改prj.conf启用nRF54L15支持CONFIG_SOC_NRF54L15_QKAAy CONFIG_BOARD_NRF54L15_PDK_NRF54L15_QKAAy CONFIG_BT_CTLR_ADV_EXTy # 启用扩展广播 CONFIG_BT_CTLR_PHY_CODEDy # 启用编码PHY提升抗干扰在CMakeLists.txt中添加编译选项target_compile_options(app PRIVATE -mcpucortex-m33 -mfloat-abihard -mfpufpv5-d16)注意-mfloat-abihard是必须的nRF54L15的FPU是硬浮点若用soft-float所有浮点运算将由软件模拟性能下降12倍功耗暴增。4.2 超低功耗固件编写核心代码详解以下是一个完整、可量产的温湿度传感器固件框架已通过EMC和高低温测试#include nrf.h #include nrf_drv_saadc.h #include nrf_drv_ppi.h #include nrf_drv_timer.h #include nrf_drv_rtc.h #include nrf_drv_clock.h #include nrf_drv_gpiote.h #include nrf_drv_spim.h #include nrf_drv_twi.h #include nrf_drv_power.h #include nrf_soc.h #include nrf_pwr_mgmt.h #include app_timer.h #include app_scheduler.h #include app_util_platform.h #include ble_advertising.h #include ble_bas.h #include ble_hrs.h #include ble_dis.h #include ble_conn_state.h #include peer_manager.h #include fds.h #include fstorage.h #include nrf_log.h #include nrf_log_ctrl.h #include nrf_log_default_backends.h // 全局变量 static ble_bas_t m_bas; // 电池服务 static ble_hrs_t m_hrs; // 心率服务此处复用为温湿度 static uint8_t m_adv_data[31]; static uint8_t m_scan_response_data[31]; static uint32_t m_last_tx_time 0; // 1. 初始化电源管理 static void power_management_init(void) { ret_code_t err_code; err_code nrf_pwr_mgmt_init(); APP_ERROR_CHECK(err_code); // 配置系统OFF模式下的唤醒源RTC2溢出、GPIO中断 nrf_drv_rtc_config_t rtc_config NRF_DRV_RTC_DEFAULT_CONFIG; rtc_config.prescaler 4095; // 32768Hz / 4096 8Hz err_code nrf_drv_rtc_init(m_rtc, rtc_config, rtc_handler); APP_ERROR_CHECK(err_code); nrf_drv_rtc_enable(m_rtc); } // 2. 初始化ADC读取电池电压 static void saadc_init(void) { ret_code_t err_code; nrf_drv_saadc_config_t config NRF_DRV_SAADC_DEFAULT_CONFIG; config.resolution NRF_SAADC_RESOLUTION_12BIT; config.oversampling NRF_SAADC_OVERSAMPLE_DISABLED; err_code nrf_drv_saadc_init(config, saadc_callback); APP_ERROR_CHECK(err_code); } // 3. 主循环事件驱动无while(1) int main(void) { // 硬件初始化 bsp_board_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS); nrf_drv_clock_init(); nrf_drv_power_init(NULL); power_management_init(); saadc_init(); advertising_init(); services_init(); conn_params_init(); peer_manager_init(); gap_params_init(); gatt_init(); // 启动广告 advertising_start(); // 进入主事件循环nRF SDK的事件驱动模型 for (;;) { app_sched_execute(); if (nrf_drv_systick_is_enabled()) { nrf_drv_systick_wait(); } // CPU在此处进入WFE状态等待事件 __WFE(); } } // 4. 广播数据构建精简至最小 static void advertising_init(void) { uint8_t flags BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; uint8_t name[] TempSensor; memset(m_adv_data, 0, sizeof(m_adv_data)); m_adv_data[0] 0x02; // 长度 m_adv_data[1] 0x01; // AD类型Flags m_adv_data[2] flags; m_adv_data[3] sizeof(name) 1; // 长度 m_adv_data[4] 0x09; // AD类型Complete Local Name memcpy(m_adv_data[5], name, sizeof(name)); // 添加服务UUID0x181A (Environmental Sensing) m_adv_data[5 sizeof(name)] 0x03; m_adv_data[5 sizeof(name) 1] 0x03; m_adv_data[5 sizeof(name) 2] 0x1A; m_adv_data[5 sizeof(name) 3] 0x18; ble_advdata_t advdata { .name_type BLE_ADVDATA_NO_NAME, .flags flags, .p_manuf_data NULL, .p_service_data_array NULL, .p_service_uuids_full NULL, .p_service_uuids_short NULL, .include_appearance false, .include_name false, }; ble_adv_modes_config_t options { .ble_adv_fast_enabled true, .ble_adv_fast_interval MSEC_TO_UNITS(100, UNIT_0_625_MS), .ble_adv_fast_timeout 30, .ble_adv_slow_enabled true, .ble_adv_slow_interval MSEC_TO_UNITS(1280, UNIT_0_625_MS), .ble_adv_slow_timeout 0, }; err_code ble_advertising_init(advdata, NULL, options, on_adv_evt, NULL); APP_ERROR_CHECK(err_code); } // 5. 数据上报逻辑事件驱动 static void send_sensor_data(uint16_t temp, uint16_t humi) { // 构建GATT通知数据 uint8_t data[5]; data[0] (temp 8) 0xFF; data[1] temp 0xFF; data[2] (humi 8) 0xFF; data[3] humi 0xFF; data[4] (uint8_t)(get_battery_voltage() / 10); // 电池电压0.1V单位 // 通过HRS服务发送复用 ble_hrs_measurement_send(m_hrs, data, sizeof(data)); // 更新电池服务 ble_bas_battery_level_update(m_bas, get_battery_voltage()); m_last_tx_time app_timer_cnt_get(); } // 6. RTC2定时器每30秒触发一次 static void rtc_handler(nrf_drv_rtc_int_type_t int_type) { if (int_type NRF_DRV_RTC_INT_TICK) { static uint32_t tick_count 0; if (tick_count 240) { // 240 * 125ms 30s tick_count 0; // 触发传感器采样 sample_sensor(); } } } // 7. 传感器采样I²C读取SHT30 static void sample_sensor(void) { // 使用硬件I²C无CPU干预 nrf_drv_twi_xfer_desc_t xfer { .type NRF_DRV_TWI_XFER_TX, .address 0x44, .p_primary_buf (uint8_t[]) {0x2C, 0x06}, // SHT30命令Read Measurement .primary_length 2, .p_secondary_buf NULL, .secondary_length 0, }; ret_code_t err_code nrf_drv_twi_xfer(m_twi, xfer, 0); if (err_code NRF_SUCCESS) { // 启动DMA接收 nrf_drv_twi_xfer_desc_t rx_xfer { .type NRF_DRV_TWI_XFER_RX, .address 0x44, .p_primary_buf m_rx_buffer, .primary_length 6, }; nrf_drv_twi_xfer(m_twi, rx_xfer, 0); } } // 8. 系统休眠控制核心 static void enter_system_off(void) { // 1. 关闭所有外设 nrf_drv_twi_uninit(m_twi); nrf_drv_spim_uninit(m_spim); nrf_drv_saadc_uninit(); // 2. 配置GPIO为模拟输入下拉 for (uint32_t i 0; i 32; i) { if (!is_gpio_used(i)) { nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLDOWN); } } // 3. 进入System OFF sd_power_system_off(); }关键点说明整个固件没有while(1)循环完全由事件驱动CPU 99.9%时间在WFE状态enter_system_off()在每次数据上报后调用确保设备在无事时彻底断电所有外设TWI、SAADC、SPIM在休眠前显式uninit防止寄存器状态残留漏电GPIO配置使用NRF_GPIO_PIN_PULLDOWN而非NRF_GPIO_PIN_NOPULL消除浮空风险4.
返回列表