杰理BLE功耗从185uA压到18uA:可复现的降功耗实战笔记

发布时间:2026/10/15 6:08:14

杰理BLE功耗从185uA压到18uA:可复现的降功耗实战笔记 简介这份PDF资料聚焦杰理BLE芯片的功耗数据与降功耗方法面向正在开发蓝牙低功耗产品、遇到功耗降不下来或无法满足客户续航要求的嵌入式工程师。内容以AC6321为例系统梳理powerdown、poweroff、sniff三种功耗模式的特点与唤醒机制并给出环境准备、软件配置、各阶段功耗分析及进出低功耗流程的完整思路。资源包内含1个PDF文件大小约2.18MB便于随时查阅与对照调试。目前已有2056人学习下载说明其在杰理平台开发者中具有较高参考价值。读者可从中获得低功耗模式的具体电流数据、广播与连接状态的功耗波形解读、连接参数对功耗的影响以及排查芯片不进低功耗、功耗偏高等问题的实用方向适合需要优化BLE设备电池寿命的开发者参考。1. 杰理 BLE 功耗从 185uA 压到 18uA一份能照着复现的降功耗笔记做杰理 BLE 案子的人十个里有八个被功耗卡过脖子。客户要求整机待机 50uA 以内你测出来 200uA 下不去公版程序跑出来正常自己写的代码一烧进去功耗直接翻倍。这类问题不是玄学是有一整套可复现的排查路径的。这份笔记以 AC6321 为例把杰理 BLE 芯片的功耗模式、测量方法、软件配置、进出低功耗机制和常见翻车点拆开讲一遍。适合正在用杰理 SDK 做透传、防丢器、Beacon 类产品的嵌入式工程师也适合刚接手 BLE 项目、对 powerdown 和 sniff 还没建立直觉的新手。读完你至少能做到知道正常功耗长什么样、知道自己的代码为什么不进低功耗、知道连接参数怎么影响平均电流。2. 先把三个功耗名词和测量环境立住powerdown、poweroff、sniff 到底差在哪2.1 powerdown 与 poweroff一个保连接一个只留按键杰理芯片的低功耗名词如果不先理清后面看波形就是黑匣子。最核心的两个状态是 powerdown 和 poweroff。poweroff 也叫 shutdown软关机模式功耗大约 2uA。这个模式下 RAM 掉电芯片基本处于“只留一口气”的状态唤醒方式只有按键和 RTC 闹钟。几乎所有芯片的 shutdown 功耗都在这个量级不是杰理独有的优势所以别拿这个数字去宣传续航。powerdown 才是 BLE 产品真正要盯的状态。AC632 在 powerdown 下功耗约 18uARAM 不掉电蓝牙连接可以保持。唤醒源比 poweroff 多一个系统定时器中断也能把芯片拉出来。这意味着你的 BLE 从机可以在保持连接的同时大部分时间躺在 18uA 里每隔一段时间被定时器叫醒处理一下协议栈的事情然后继续睡。我一般会跟新人这么解释poweroff 是“关机”powerdown 是“打盹”。BLE 产品要的是打盹不是关机。因为关机之后连接就断了手机再连你得重新广播、重新配对用户体验直接崩。这里有个容易混淆的点sniff 不是硬件状态是蓝牙协议层的一种策略。它通过减少主设备发送数据的时隙数、相应减少从设备监听的时隙数来省电。但 sniff 省的是“射频监听”那部分的电如果芯片本身没有进 powerdown该跑的系统定时器还在跑该唤醒的模块还在唤醒实际功耗不一定降得下来。所以判断 sniff 有没有用最终还是要看电流波形上芯片有没有频繁进入那个 18uA 的平台区。2.2 测量环境为什么电流表不如功耗盒子测 BLE 功耗普通万用表基本没法用。BLE 的电流是脉冲式的广播时瞬间冲到几 mA然后掉到 uA 级再冲上去。万用表采样率不够你看到的是一个被平均过的数字根本不知道芯片在干什么。常见做法是用功耗盒子它能以波形方式显示电流随时间的变化。接线方式不同盒子可能有差异但核心就两点盒子输出给板子供电盒子串在供电回路里采电流。第一次用之前先做“空载归零”不然零点漂移会让你的 uA 级读数完全不可信。注意接板子之前先用万用表量一下功耗盒子的输出电压。有些盒子输出会偏高直接烧芯片。烧了芯片再测功耗数据就没有意义了。板子本身也要处理。如果你手上是样机不是 demo 板那就拆。把跟杰理芯片不相关的硬件全去掉只留晶振、VBAT、VDDIO 脚的电容。支持 DCDC 的芯片可以保留 DCDC 部分电路。为什么要拆因为一个 LDO、一颗 LED、一个上拉电阻都可能在你测 18uA 的时候贡献出几十 uA 的偏差。你以为是芯片没进低功耗其实是外围电路在漏电。2.3 软件配置测功耗前必须关掉的东西软件层面测功耗的工程建议用最简单的 BLE 透传单从机工程。功能越少变量越少功耗基线越干净。板级配置里要动几个地方。串口在测功耗时可以开但测数据的时候串口线不要接接了以后功耗会偏低——因为串口线的电平会通过 IO 口倒灌电流让你的读数比真实值小。AD 按键要关掉软件开了 AD 按键但硬件没接会导致芯片无法进入低功耗。低功耗模式要使能DCDC 和 LDO 根据实际硬件选DCDC 比 LDO 功耗低。电量检测和经典蓝牙也关掉这两个模块在纯 BLE 透传场景下没有用开着只会增加唤醒次数。这些配置改完之后把代码下载到 demo 板接上功耗盒子你才有资格开始谈“功耗高不高”。3. 四个阶段的功耗波形怎么读从广播 185uA 到连接 377ms 周期3.1 低功耗平台18-20uA 是及格线下载程序后串口如果有和[]打印说明芯片有正常进出低功耗。是应用层的打印[]是库里面的打印。用功耗盒子的游标去量波形最低点的功耗应该在 18-20uA 之间。如果这个值偏高先排查芯片外围电路。把不相关的硬件断开只留最小系统再测。如果还是高换一块板子试试。我遇到过一块板子因为 VBAT 脚的一个电容漏电低功耗平台一直在 35uA 下不去换电容之后立刻回到 18uA。这种问题用万用表是看不出来的只有波形能暴露。3.2 广播状态185uA 和 500ms 间隔广播状态下功耗波形是一串脉冲。两个波峰之间的间隔是广播间隔常见配置是 500ms。近期的平均功耗大约 185uA。这个 185uA 是怎么来的芯片大部分时间在 powerdown 里每隔 500ms 被广播定时器叫醒启动射频发一包广播数据然后继续睡。平均电流就是“睡眠电流 × 睡眠时间占比 广播瞬间电流 × 广播时间占比”的加权结果。想降广播功耗要么拉长广播间隔要么缩短每次广播的射频开启时间。但广播间隔改到 2s 以上手机搜索到设备的速度会明显变慢甚至有些手机直接搜不到。这是一个需要跟产品经理拉扯的取舍点。3.3 上电状态全擦 Flash 第一次上电为什么偏高正常上电开机的波形全擦 Flash 上电功耗会高一点。原因是芯片第一次上电会多一个校准流程这个流程会消耗额外的电流。如果你测的是刚擦完 Flash 的板子看到上电瞬间电流比平时高不用慌等校准完成之后会回落到正常水平。这个阶段基本没有降功耗的空间因为校准是芯片启动的必经流程。你要关注的是校准完成后的稳态功耗而不是上电瞬间的峰值。3.4 连接状态interval、latency、timeout 怎么决定平均电流连接状态是 BLE 产品待机功耗的大头。用 iPhone 测试连接参数 interval28、latency10、timeout600 时两个波峰之间的时间大约是 377ms。这个时间可以算出来。低功耗周期 interval × 1.25 × latency单位 ms。代入数值28 × 1.25 × 10 350ms。实测 377ms 跟理论值相差不大多出来的部分是协议栈处理和射频启动的固定开销。有时候你会看到连续两个波峰原因是杰理看门狗周期的一半也会触发低功耗退出。看门狗是硬件模块它的唤醒不受连接参数控制所以会在连接周期的中间插进来一次。如果你在波形上看到这种“双峰”不用怀疑芯片坏了这是正常现象。连接参数怎么改interval 决定从机多久起来跟主机通信一次latency 决定从机可以跳过多少次连接事件timeout 是连接超时时间。latency 设得越大从机睡的时间越长平均功耗越低。但 latency 太大会导致主机发数据时从机响应变慢影响吞吐量。timeout 要大于 interval × (latency 1) × 1.25 × 2否则会误触发连接超时断开。提示公版流程是主机打开监听通道时从机才会向主机请求自己的连接参数。所以你在代码里设了参数不代表立刻生效要等主机发起参数更新请求。4. 进出低功耗的底层逻辑REGISTER_LP_TARGET 和定时器怎么配合4.1 芯片不能主动进低功耗但可以阻止它进杰理芯片的低功耗机制跟很多 MCU 不一样。你没法在代码里写一句“现在进入 powerdown”芯片是在空闲的时候自动进低功耗的。当系统定时器产生中断时芯片会主动退出低功耗。程序不能控制芯片主动进低功耗但可以控制芯片不要进低功耗。这个“阻止”机制就是REGISTER_LP_TARGET注册的回调函数。底层在准备进低功耗之前会遍历所有注册的 LP target调用它们的is_idle函数。如果任何一个返回 0芯片就不进低功耗。// 代码任意地方添加此段代码全局修改此变量底层会自动获取判断 u8 can_enter_lp 0; // 置 1 可进睡眠置 0 不可进睡眠 static u8 custom_idle_query(void) { if (can_enter_lp) { return 1; // 允许进低功耗 } else { return 0; // 阻止进低功耗 } } REGISTER_LP_TARGET(custom_lp_target) { .name custom_lp, .is_idle custom_idle_query, };这段代码的逻辑是定义一个全局变量can_enter_lp在任意地方修改它。custom_idle_query是底层会调用的查询函数返回 1 表示当前允许进低功耗返回 0 表示不允许。REGISTER_LP_TARGET宏把这个 target 注册到低功耗管理模块里。参数说明.name是 target 的名字调试用.is_idle是查询函数指针底层在进低功耗前会调用它。如果你有多个模块需要控制低功耗可以注册多个 target任何一个返回 0 都会阻止芯片进低功耗。4.2 系统定时器功耗和实时性的拉扯sys_timer_add和sys_timeout_add是杰理 SDK 里常用的两个定时器接口。它们底层用的是系统定时器会产生中断把芯片从 powerdown 里拉出来。u16 sys_timer_add(void *priv, void (*func)(void *priv), u32 msec); u16 sys_timeout_add(void *priv, void (*func)(void *priv), u32 msec);sys_timer_add是周期性定时器每隔msec毫秒调用一次func。sys_timeout_add是一次性定时器msec毫秒后调用一次func然后自动释放。priv是传给回调函数的私有参数func是回调函数指针。这两个接口用起来方便但对功耗不友好。每调用一次芯片就要退出低功耗一次。如果你在代码里开了很多系统定时器芯片进出低功耗的频率会非常快平均功耗自然就上去了。如果在意功耗我一般会建议用硬件定时器替代系统定时器。硬件定时器可以在低功耗模式下继续计数不需要 CPU 频繁唤醒。但硬件定时器的接口比系统定时器复杂需要配置寄存器而且数量有限。这是一个典型的“功耗换开发效率”的取舍。4.3 usr_timer 的 priority 参数0 和 1 的区别SDK 里还有一个usr_timer_add接口它的priority参数直接决定了对低功耗的影响。/** * brief usr_timer 定时扫描增加接口 * param [in] priv 私有参数 * param [in] func 定时扫描回调函数 * param [in] msec 定时时间单位毫秒 * param [in] priority 优先级范围0/1 * return 定时器分配的 id 号 * note * 1、usr_timer 的参数 priority 为 1使用该类定时器系统无法进入低功耗 * 2、usr_timer 的参数 priority 为 0使用该类定时器系统低功耗会忽略该节拍 * 节拍不会丢失但是定时周期会变 * 3、usr_timer 属于异步接口add 的时候注册的扫描函数将在硬件定时器中时基到时被调用 * 4、对应释放接口 usr_timer_del。 */ u16 usr_timer_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority);priority1时系统无法进入低功耗。这个模式适合对定时精度要求极高的场景比如某些传感器采样。priority0时系统低功耗会忽略这个节拍节拍不会丢失但定时周期会变。什么意思就是芯片该睡还是睡定时器到点了会记录一个标志等芯片醒来之后再处理。这样功耗保住了但定时精度下降了。选哪个取决于你的产品需求。如果只是 LED 闪烁、状态轮询priority0完全够用。如果是射频时序控制、精确采样那就得用priority1接受功耗上升的代价。5. 避坑排查公版正常、自己代码功耗高的四类原因5.1 芯片直接不进低功耗现象功耗一直在 mA 级波形上看不到 18uA 的平台区串口也没有和[]打印。原因一REGISTER_LP_TARGET注册的函数有地方没有返回 1。底层遍历所有 target 时只要有一个返回 0芯片就不进低功耗。检查你的is_idle函数确认所有分支都有正确的返回值。原因二板级配置里面低功耗没有使能。这个在 SDK 的板级配置文件里不同版本位置可能不一样但关键词是LP或low_power。确认对应的宏是打开的。原因三自己写的代码耗时太长导致芯片进不了低功耗。芯片是在空闲时进低功耗的如果你的主循环里有一个函数执行了几百毫秒芯片就一直没机会睡。排查方法是用示波器抓函数前后在函数入口和出口翻转一个 IO 口看高电平持续时间。如果超过几毫秒就要考虑把这个函数拆成状态机分多次执行。原因四其他模块阻止了低功耗。比如某些外设驱动在初始化时注册了自己的 LP target但没有正确释放。这种情况需要逐个排查最近添加的模块。5.2 芯片有进低功耗但功耗偏高现象串口有和[]打印波形上能看到低功耗平台但平台电流不是 18uA而是 50uA、100uA 甚至更高。原因一DP、DM 脚做输出会高 300uA。USB 的 DP、DM 脚如果配置成输出模式即使没有 USB 通信也会产生额外的漏电流。检查你的 IO 配置把不用的 USB 脚设成高阻或输入。原因二IO 口同时开上下拉电阻。一个 IO 口同时开上拉和下拉相当于在电源和地之间接了一个电阻电流直接漏掉。检查所有 IO 的上下拉配置确保没有同时使能。原因三外围电路漏电。前面提过的电容漏电、LDO 静态电流、LED 漏电流都会叠加到芯片的低功耗平台电流上。把外围电路逐个断开看平台电流有没有变化。5.3 芯片进出低功耗频率太快现象波形上低功耗平台很短波峰很密平均功耗比预期高很多。原因调用了太多的系统定时器。每个sys_timer_add都会产生周期性中断把芯片从低功耗里拉出来。如果你开了 5 个 10ms 的定时器芯片每 10ms 就要醒一次低功耗平台根本来不及稳定。解决如果在意功耗避免系统定时器的使用改用硬件定时器。或者把多个定时任务合并到一个定时器里用计数器分频。比如一个 10ms 的定时器在里面计数到 100 再执行 1s 的任务这样芯片只需要每 10ms 醒一次而不是每个任务都单独唤醒。5.4 连接状态功耗降不下来现象广播状态功耗正常一连接功耗就上去了。原因连接参数没设对或者主机没有接受从机的参数更新请求。连接状态的低功耗周期由 interval 和 latency 决定如果 latency 是 0从机每个连接事件都要起来功耗自然高。解决在代码里请求合适的连接参数latency 尽量设大但不要超过主机允许的范围。同时确认主机是否接受了参数更新。有些手机对 latency 有限制比如 iOS 对某些参数组合会拒绝。如果主机拒绝从机只能接受主机的参数这时候功耗就取决于主机的配置了。6. 把功耗压到极限的几个进阶技巧和验证习惯6.1 用 IO 翻转做时间测量当你怀疑某个函数耗时太长导致芯片进不了低功耗时最直接的方法是在函数入口和出口翻转一个 IO 口用示波器看高电平持续时间。// 假设 PA0 是调试 IO gpio_set_output(PA0); gpio_write(PA0, 1); // 函数入口拉高 my_long_function(); gpio_write(PA0, 0); // 函数出口拉低这个方法的精度取决于示波器带宽和 IO 翻转速度对于毫秒级的函数完全够用。如果高电平持续时间超过你预期的低功耗周期就要考虑拆分函数。6.2 分阶段验证功耗不要一上来就测整机功耗。按阶段来先测最小系统板在 powerdown 下的平台电流确认是 18uA再测广播状态的平均电流确认是 185uA 左右再测连接状态确认低功耗周期符合公式最后才测整机。每个阶段都确认正常之后再往上叠加功能。这样一旦功耗异常你能快速定位是哪个阶段引入的。6.3 连接参数的计算和验证低功耗周期 interval × 1.25 × latency单位 ms。这个公式要记牢。设置参数时先算一遍理论值再用功耗盒子测实际值两者对比。参数含义对功耗的影响建议范围interval连接事件间隔越大功耗越低28-8035-100mslatency可跳过的连接事件数越大功耗越低4-20timeout连接超时时间需大于周期×2600-20006-20stimeout 的计算timeout interval × (latency 1) × 1.25 × 2。比如 interval28、latency10周期是 350mstimeout 要大于 700ms。实际设置时留足余量6006s是安全的。6.4 看门狗周期对功耗的隐藏影响前面提过杰理看门狗周期的一半也会触发低功耗退出。这意味着即使你的连接参数设得很大看门狗还是会定期把芯片叫醒。如果你在波形上看到连接周期的中间有一个额外的波峰那就是看门狗干的。看门狗周期能不能改可以但要看 SDK 是否开放了配置接口。有些版本看门狗周期是固定的你只能接受这个额外的唤醒。如果看门狗周期是 1s那芯片最多每 500ms 就会被叫醒一次连接参数设得再大也突破不了这个下限。我一般会在项目初期就把看门狗周期确认清楚把它纳入功耗预算。如果看门狗周期不可改那连接参数的优化空间就有限需要跟产品经理同步这个限制。6.5 一个验证习惯从那以后我每次改完功耗相关的配置都会强制走一遍完整验证擦 Flash、重新烧录、功耗盒子归零、测平台电流、测广播电流、测连接电流、记录波形。不跳步骤不凭感觉。因为功耗问题最怕的就是“我以为改好了”结果一测还是老样子。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/15 6:08:14

C++与++c:从语言命名到前置自增的语法细节与工程实践

“C 和 c”,这两个词放在一起,乍一看像程序员之间才懂的冷笑话。但如果你真在代码里和它们长期打交道,会发现这个标题里藏着的是一语三关:C 是一门语言名字,c 是一个具体的自增表达式,而把“C”这个单词重新…

2026/10/15 6:08:14

Keras YOLOv3环境搭建实战:版本匹配与依赖安装避坑指南

刚把 yolov3 的环境搭完,准备跑个 demo 验证一下,结果一执行命令就是一连串的报错。折腾了一整天,最后发现全是版本匹配的问题——TensorFlow、Keras、Python 三者之间稍微错一个版本,整个环境就起不来。我估计不少人和我一样&…

2026/10/15 7:08:16

YOLOv8路面裂缝检测系统开发实践:从数据到部署全流程

我已经在多个项目里用过YOLO系列做视觉检测,但真正让我觉得“这套流程可以沉淀下来复用”的,还是最近完成的这个路面裂缝检测系统。起因是某交通巡检项目需要把道路裂缝从现场照片里自动识别出来,效率要求接近实时,同时还得应付不…

2026/10/15 7:08:16

审计报告出具与底稿归档:项目收尾阶段的关键控制点与实操指南

1. 审计报告出具前的关键控制点每年到了报告集中出具的那几周,办公室里基本就是两种状态:一种是项目组还没收完数、报告模板改到第八版、合伙人办公室门口排着队等签字;另一种是已经出完报告的人表面上很轻松,但心里还有一个事没落…

2026/10/15 7:08:16

IT资产管理全生命周期解决方案与关键技术解析

1. 项目概述:IT资产管理为何需要全生命周期视角IT资产管理(IT Asset Management,简称ITAM)从来都不是简单的设备登记表。在我经手的十几个企业IT治理项目中,真正能把资产台账理清楚的团队不到三成。某次审计时发现&…

2026/10/15 7:08:16

TypeSafe Jev:从编译期到运行时的类型安全全链路实践

1. 从标题说起:TypeSafe Jev 到底在解决什么问题第一次看到“TypeSafe Jev”这个组合词,很多人会愣一下——TypeSafe 是类型安全,Jev 又是什么?这两个词拼在一起,指向的其实是一个很具体的工程痛点:在数据系…

2026/10/15 7:08:16

基于Python的网络爬虫系统设计与实现——毕业设计完整指南

1. 选题拆解:为什么“爬虫Python”是毕业设计的黄金组合每年毕业季,总有大量同学在选题阶段反复纠结。我见过太多人选了偏理论的方向,吭哧吭哧读了一堆论文,最后代码写不出来、实验数据凑不齐;也见过选纯前端、纯业务系…

2026/10/15 7:03:16

IQ测试题深度拆解:60题五大题型解析与刷题指南

简介:面向备考平安集团PA基础性向测试及同类智力测验的求职者,这份doc文档系统收录了60道经典IQ测试题与完整答案,覆盖类比推理、数字序列、逻辑推断、数学计算、词语解码等高频考点,并搭配逐题知识点详解,能帮助读者快…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/15 0:02:22

防关联浏览器哪个好?三款产品实测差异解析

新手做多店铺,最纠结的就是防关联浏览器选哪个。飞跨、网易、站斧这三款被问得最多,先给结论:要一体化省心、长期便宜,选站斧;要网易招牌和稳,选网易;预算紧做东南亚 Lazada,选飞跨。…

2026/10/15 0:02:22

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 一、技术背景 大模型(LLM)在通用场景下表现强大,但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时,准确率通常只有 40%-60%。原因…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑