杰理AC6321低功耗实战:从150μA压至22μA的七处代码级干预

发布时间:2026/10/28 12:00:38
杰理AC6321低功耗实战:从150μA压至22μA的七处代码级干预 简介本资源是一份面向嵌入式蓝牙开发工程师的杰理AC6321芯片低功耗实战指南聚焦BLE设备续航优化这一核心痛点解决实际项目中功耗不达标、客户验收困难等典型问题。内容系统梳理powerdown18μARAM保持、poweroff2μA软关机与sniff蓝牙呼吸策略三类关键功耗模式的原理、触发条件、唤醒机制及实测表现并结合功耗盒子波形分析广播、连接、上电等各阶段电流特征提供板级配置调整、SDK参数修改、低功耗注册函数调试等可落地的降耗方法。资源为1个PDF文件大小2.18MB结构清晰含环境准备、代码片段如sys_timer_add、连接参数计算公式及常见功耗异常排查清单。目前已有2063人学习下载适合具备C语言基础与BLE开发经验的中级以上工程师快速掌握杰理平台功耗调优全流程。1. 杰理 AC6321 BLE 功耗实测数据与可落地的降功耗路径不是调参数而是控唤醒、锁状态、断干扰你手上的杰理 AC6321 模块标称低功耗模式powerdown18 µA但实测却卡在 80–120 µA 下不来烧录公版透传 demo 能稳在 19 µA自己加了电量检测、按键扫描、LED 状态指示后功耗直接跳到 200 µA 以上连“”和“”打印都消失了这不是玄学是芯片在明确告诉你它根本没进低功耗——不是硬件不行是你写的每一行代码都在悄悄阻止它睡觉。这篇笔记不讲蓝牙协议栈原理不堆芯片手册截图只聚焦一个目标让你今天下午就能把板子功耗从 150 µA 压到 22 µA 以内并清楚知道哪一行代码、哪一个 IO 配置、哪一次定时器注册是罪魁祸首。适用对象非常明确正在用 AC6321/AC631/AC636 系列做蓝牙防丢器、HID 键鼠、透传模组或 Beacon 的嵌入式开发者手里有功耗盒子或能接万用表示波器、能改 SDK、能看串口 log但被“为什么公版行我就不行”反复暴击的实战派。我们以 AC6321 为锚点所有操作、配置、避坑点全部来自真实拆解《AC630N_bt_data_transfer_sdk_release_v2.1.0》透传工程 实机功耗盒子波形验证拒绝理论空转。2. 杰理低功耗三态本质与芯片进出逻辑poweroff / powerdown / sniff 不是并列选项而是层级关卡杰理芯片的低功耗管理不是靠enter_low_power()一条函数调用就能触发的开关而是一套由硬件状态、软件注册、中断源共同构成的“睡眠准入审查机制”。理解这三层关系是后续所有降功耗动作的前提。下面拆解三个核心状态的真实含义、触发条件、RAM 保持能力及唤醒路径全部基于 AC6321 实测行为反推非手册翻译。2.1 poweroff软关机彻底断电态1 µA 级别但连接归零poweroff是最深的休眠态官方标称 2 µA实测在干净 demo 板上可压至 1.3–1.8 µA。关键特征在于SRAM 全部掉电所有寄存器复位蓝牙连接完全丢失。这意味着设备重启后需重新广播、等待主机重连无法用于需要维持 BLE 连接的场景如 HID 键盘、实时透传。唤醒路径极其有限仅支持物理按键GPIO 中断和 RTC 闹钟。注意RTC 必须在进入 poweroff 前已配置好并使能且其时钟源通常是 32.768 kHz 晶振必须独立供电否则 RTC 停摆设备将永远沉睡。进入方式并非主动调用而是通过sys_power_off()接口触发系统级关机流程底层会强制关闭所有外设时钟、拉低 VDDIO 供电域若硬件支持 DCDC 切换最终进入该态。提示不要试图在poweroff态下维持 BLE 连接——这是违反蓝牙规范的。它只适用于“超长待机按需唤醒”的场景如电子价签、环境传感器定时上报。2.2 powerdown系统低功耗BLE 连接守护态18 µA 是黄金基准线这才是绝大多数 BLE 从机应用的目标态。AC6321 在此态下实测稳定在 18–20 µAdemo 板LDO 供电无外部负载SRAM 完全保持蓝牙链路层连接状态Link Layer Connection State持续驻留主机发来的任何数据包仍能被接收并触发中断唤醒。这是“低功耗”与“可用性”的平衡点。进入条件苛刻必须满足“系统空闲 无未决中断 所有 LP Target 返回 1”三重校验。其中REGISTER_LP_TARGET是核心钩子——它不是一个函数而是一个结构体数组注册表每个条目包含一个is_idle()回调。系统在每次空闲循环idle loop中遍历该表只有所有回调均返回1芯片才允许进入 powerdown。唤醒路径丰富按键GPIO、RTC、系统定时器sys_timer_add/sys_timeout_add、BLE 事件如主机发包、连接参数更新请求。注意usr_timer_add若 priority1则直接禁止进入 powerdown见第 5 章避坑。提示powerdown不是“节能模式”而是“连接保持下的最小系统开销态”。它的功耗值就是你的设计基线所有优化目标都是让芯片尽可能长时间地停留在此态。2.3 sniff呼吸模式纯软件策略不改变硬件功耗态但影响唤醒频率sniff常被误解为一种低功耗模式实则不然。它是 BLE 协议栈内部的一种通信调度策略从机向主机请求更长的连接间隔interval和更高的监听延迟latency从而减少从机在每个连接事件中“醒来监听”的次数。它本身不控制芯片是否进入powerdown但直接影响芯片从powerdown中被唤醒的频率。例如默认连接参数interval2835 ms、latency10则理论低功耗周期 interval × 1.25 × latency 35 × 1.25 × 10 437.5 ms。这意味着芯片每 437.5 ms 就会被 BLE 硬件强制唤醒一次处理连接事件。若你将interval改为 100125 ms、latency改为 20则周期变为125 × 1.25 × 20 3125 ms唤醒频率降低 7 倍powerdown占空比大幅提升。关键点sniff效果能否落地100% 取决于主机手机/PC是否接受你的连接参数请求。iPhone 默认较保守Android 厂商定制 ROM 差异大。务必在ble_client连接建立后立即调用le_set_conn_param()发起请求并在回调中确认status 0。3. 从烧录到波形AC6321 功耗测试四步法与公版基线建立没有可信的功耗基线一切优化都是空中楼阁。很多开发者失败的第一步就是拿一块功能齐全的样机直接测结果看到 300 µA 波形就崩溃——其实那只是 LED、充电 IC、传感器在耗电跟杰理芯片无关。本节给出一套可复现的、剥离干扰的测试流程目标是30 分钟内在你的开发板上复现公版 demo 的 19 µA 波形并定位出你当前工程与公版的首个差异点。3.1 硬件准备只保留“心跳”拆除一切“装饰”功耗测试的第一铁律测什么就只留什么。对 AC6321 而言“心跳”仅包括芯片本体AC6321A主晶振24 MHz及匹配电容RTC 晶振32.768 kHz及匹配电容若需 RTC 唤醒VBAT 电源引脚接功耗盒子输出VDDIO 电源引脚接功耗盒子输出所有 GND 引脚共地必须拆除所有 LED 指示灯含电源灯所有按键除非你专门测试按键唤醒否则先焊下所有传感器温湿度、加速度计等所有 USB 转串口芯片CH340/CP2102 等——串口调试用无线或隔离方式所有 LDO/DCDC 外围电路除非你确定使用它否则先用功耗盒子直供 3.3 V所有未使用的 IO 上拉/下拉电阻特别是 DP/DM见第 5 章提示如果你的板子是双层 PCB拆除元件后务必用万用表二极管档检查 VDDIO 与 GND 间是否短路。曾有案例因拆除 LED 后焊盘残留锡珠导致 50 µA 漏电排查 3 小时。3.2 软件配置SDK 层级的“静音开关”在AC630N_bt_data_transfer_sdk_release_v2.1.0中打开project\ac630n_bt_data_transfer\app_config.h进行以下关键裁剪// 【必关】禁用所有非必要外设驱动 #define CONFIG_CHARGE_ENABLE 0 // 关闭内置充电避免充电 IC 干扰 #define CONFIG_KEY_AD_ENABLE 0 // 关闭 AD 按键硬件未接时会导致无法进 LP #define CONFIG_BATT_CHECK_ENABLE 0 // 关闭电量检测ADC 采样会阻塞 LP #define CONFIG_BT_CLASSIC_ENABLE 0 // 关闭经典蓝牙BLE 与 Classic 共享射频资源 #define CONFIG_UART_DEBUG_ENABLE 0 // 关闭 UART 调试打印烧录时可开测功耗时必须关 // 【必配】电源模式选择根据你的硬件 #define CONFIG_DCDC_ENABLE 0 // 若硬件用 LDO 供电此项必须为 0 #define CONFIG_LDO_ENABLE 1 // 若硬件用 LDO此项必须为 1反之 DCDC 为 1LDO 为 0 // 【必设】BLE 连接参数影响 sniff 效果 #define DEFAULT_CONN_INTERVAL_MIN 100 // 125ms比默认 2835ms长 3.5 倍 #define DEFAULT_CONN_INTERVAL_MAX 100 #define DEFAULT_CONN_LATENCY 20 // 最大容忍 20 个连接事件不响应 #define DEFAULT_CONN_TIMEOUT 600 // 6s足够覆盖长间隔编译前务必检查project\ac630n_bt_data_transfer\board\board_ac630n_demo.c中的board_init()函数确保所有未使用的 GPIO 被配置为GPIO_OUTPUT_LOW或GPIO_INPUT_PULLDOWN绝不可悬空或PULLUPDP/DM 引脚USB D D-必须配置为GPIO_OUTPUT_LOW否则实测增加 300 µA见第 5 章sys_low_power_init()必须被调用且config_lp_mode(POWER_DOWN_MODE)设置正确。3.3 功耗盒子接线与校准图像化波形是你的“X 光机”推荐使用支持图形显示的功耗盒子如某些国产“电流波形分析仪”而非普通万用表。接线顺序严格遵循功耗盒子VOUT→ 板子VBAT或VDD功耗盒子VOUT-→ 板子GND功耗盒子GND→ 板子GND共地切勿将盒子串入VDDIO或VCCAC6321 的 VDDIO 与 VBAT 是同一电源域。上位机操作首次使用点击“空载归零”No Load Zero让盒子测量自身压降并补偿接板前用万用表直流电压档测量盒子VOUT与VOUT-间电压确认为稳定 3.3 V误差 ±0.05 V避免盒子故障烧毁芯片开始采集设置采样率 ≥ 10 ksps10000 次/秒时间跨度 ≥ 5 s触发模式选“上升沿”或“自动”。3.4 公版基线波形解读识别[]的真实含义烧录未修改的ac630n_bt_data_transferdemo上电后观察波形上电瞬间出现一个 5–10 ms 宽、峰值 3–5 mA 的脉冲Flash 校准、时钟启动广播阶段规律性尖峰间隔 ≈ 500 ms默认广播间隔峰值 ≈ 1.2–1.5 mA谷值 ≈ 185 µA连接成功后尖峰间隔变为 ≈ 440 ms对应interval28, latency10谷值稳定在18–20 µA且串口持续打印和应用层空闲以及[和]协议栈空闲。关键判断若波形谷值 30 µA或消失说明芯片未进入powerdown。此时不要调代码先回退到 3.1 步骤用万用表逐个测量 VDDIO-GND 电阻确认无漏电。4. 代码级降功耗实战从REGISTER_LP_TARGET到sys_timer_add的七处关键干预点公版能跑出 19 µA是因为它在 SDK 层做了大量“静默”处理。当你加入自定义功能时哪怕只加了一行printf(hello)也可能因串口 FIFO 未清空而阻塞is_idle()。本节列出七个最常踩坑的代码位置附可直接粘贴的修复代码及原理说明。所有代码均基于AC630N_bt_data_transfer_sdk_release_v2.1.0。4.1REGISTER_LP_TARGET自定义钩子你的“睡眠许可证”审批官这是最核心的干预点。SDK 默认注册了bt_lp_target、sys_lp_target等多个钩子但你的自定义模块必须显式注册。若忘记注册或注册的is_idle()永远返回0芯片将永不睡眠。错误写法常见于新手// 错未注册或注册后 is_idle() 逻辑有缺陷 u8 my_module_busy 0; u8 my_idle_query(void) { if (my_module_busy) return 0; // 忙碌时返回 0 return 1; // 但这里缺少对其他状态的检查 } // 忘记 REGISTER_LP_TARGET(...)正确写法带状态同步与超时保护#include system/includes.h #include app_config.h static u8 can_enter_lp 1; // 全局睡眠许可开关初始允许 static u32 last_activity_ms 0; // 记录最后活跃时间 // 【关键】你的模块必须提供此函数并在所有可能阻塞的地方更新 can_enter_lp void my_module_set_busy(u8 busy) { can_enter_lp !busy; if (busy) { last_activity_ms sys_time_get(); // 记录忙碌开始时间 } } // 【关键】is_idle() 必须综合判断 static u8 custom_idle_query(void) { // 1. 检查全局许可 if (!can_enter_lp) return 0; // 2. 检查是否刚活跃过防抖避免刚唤醒又立刻睡 if (sys_time_get() - last_activity_ms 100) { // 100ms 防抖 return 0; } // 3. 检查 UART 是否空闲若你用了串口 #if CONFIG_UART_DEBUG_ENABLE if (!uart_is_tx_empty(DEBUG_UART)) return 0; #endif // 4. 检查 BLE 是否空闲SDK 内置但需确认 extern u8 bt_is_idle(void); if (!bt_is_idle()) return 0; return 1; } // 【关键】必须注册名称唯一优先级由注册顺序决定 REGISTER_LP_TARGET(custom_lp_target) { .name my_module, .is_idle custom_idle_query, };参数说明can_enter_lp作为模块级睡眠闸门业务逻辑中调用my_module_set_busy(1)表示“我要干活了”完成后调用my_module_set_busy(0)表示“我可以睡了”last_activity_ms防抖防止芯片在唤醒处理完一个事件后立即又进入睡眠造成响应延迟uart_is_tx_empty()确保串口发送缓冲区为空否则printf会卡住bt_is_idle()调用 SDK 内置函数确认协议栈无 pending 事件。4.2sys_timer_add与sys_timeout_add安全唤醒的唯一合法接口sys_timer_add()创建的定时器其回调在系统空闲时执行不会阻止芯片进入powerdown是唯一推荐的周期性任务接口。而usr_timer_add()priority1会直接锁死低功耗必须规避。安全用法推荐static u8 timer_id 0; void timer_callback(void *priv) { // 此处放轻量级任务如检查按键、读取 ADC单次、更新 LED 状态 // ⚠️ 绝不可放耗时操作如 Flash 擦写、复杂计算、UART 发送多字节 if (key_scan()) { // 按键处理... } } // 在 app_main() 或初始化函数中注册 timer_id sys_timer_add(NULL, timer_callback, 100); // 每 100ms 执行一次参数说明msec100定时周期单位毫秒。值越小唤醒越频繁平均功耗越高。建议从 500ms 起调func回调函数必须是轻量级、无阻塞、无动态内存分配返回值timer_id用于后续sys_timer_del(timer_id)取消定时器。4.3usr_timer_add的致命陷阱priority1 是功耗杀手usr_timer_add()设计初衷是高精度定时但其priority参数是双刃剑priority 0定时器在硬件时基中断中触发系统仍可进入powerdown但定时周期会漂移如设 100ms实际可能是 105mspriority 1定时器在系统主循环中轮询系统永远无法进入powerdown功耗飙升至 mA 级血泪经验曾有项目因第三方库中隐藏调用usr_timer_add(..., ..., ..., 1)导致功耗从 20 µA 暴涨至 1.2 mA排查 2 天才发现。规避方案全局搜索工程中所有usr_timer_add调用确认priority参数若必须用priority1请改用sys_timer_add 状态机模拟如用sys_timer_add每 10ms 触发内部计数 10 次实现 100ms在app_config.h中定义宏强制拦截// #define usr_timer_add(priv, func, msec, priority) \ // do { if(priority1) { printf(FATAL: usr_timer_add priority1 forbidden!\r\n); while(1); } \ // else { _usr_timer_add(priv, func, msec, priority); } } while(0)4.4 DP/DM 引脚配置USB 信号线是隐形功耗黑洞AC6321 的 DP/DM 引脚USB D D-在未用作 USB 时若配置为输入GPIO_INPUT_NOPULL或悬空实测增加 300–500 µA 漏电这是硬件设计中最隐蔽的坑。正确配置必须写入board_init()// 在 board_ac630n_demo.c 的 board_init() 函数末尾添加 gpio_direction_output(GPIO_DP, 0); // DP 输出低电平 gpio_direction_output(GPIO_DM, 0); // DM 输出低电平 // 或更稳妥写法兼容不同 SDK 版本 gpio_set_pull_up(GPIO_DP, 0); gpio_set_pull_down(GPIO_DP, 0); gpio_set_direction(GPIO_DP, 1); // 输出 gpio_write(GPIO_DP, 0); gpio_set_pull_up(GPIO_DM, 0); gpio_set_pull_down(GPIO_DM, 0); gpio_set_direction(GPIO_DM, 1); // 输出 gpio_write(GPIO_DM, 0);原理DP/DM 内部有 ESD 保护二极管悬空时易受噪声耦合形成微弱漏电通路。强制输出低电平可将其钳位至 GND消除漏电。4.5 IO 口上下拉冲突一个电阻引发的 80 µA 悲剧当某个 GPIO 同时使能了上拉PULLUP和下拉PULLDOWN或上拉/下拉与外部电路形成分压会产生稳定直流电流。实测一个 10kΩ 上拉 10kΩ 下拉并联功耗增加 80 µA。排查方法查看board_ac630n_demo.c中gpio_init()配置用万用表电阻档测量可疑 IO 对 GND 电阻若为 5kΩ 左右两个 10k 并联即存在冲突检查原理图确认外部是否有上拉/下拉电阻。修复原则输入引脚只选PULLUP或PULLDOWN之一不可同时输出引脚PULLUP/PULLDOWN必须关闭设为0悬空引脚必须配置为GPIO_OUTPUT_LOW或GPIO_INPUT_PULLDOWN绝不可NOPULL。4.6 ADC 通道与电量检测未启用的 ADC 是“假死”状态CONFIG_KEY_AD_ENABLE1时SDK 会初始化 ADC 并启动扫描。但若硬件上未接按键即 ADC 输入悬空ADC 模块会持续采样一个浮动电压导致is_idle()永远返回0芯片无法睡眠。解决方案硬件未接按键CONFIG_KEY_AD_ENABLE0硬件已接按键确保按键一端接地另一端接 ADC 引脚且无其他上拉/下拉干扰若需动态启停 ADC使用adc_disable()/adc_enable()并在is_idle()中检查adc_is_enabled()。4.7 BLE 连接参数动态协商让主机接受你的“长呼吸”sniff效果取决于主机是否接受你的连接参数请求。公版 demo 在连接建立后会自动请求但你的代码若覆盖了le_connection_complete_callback可能遗漏此步。必须添加的协商代码在le_connection_complete_callback中void le_connection_complete_callback(struct le_connected_info *info) { if (info-status 0) { // 连接成功 printf(BLE connected, requesting long interval...\r\n); // 请求 interval100 (125ms), latency20, timeout600 (6s) le_set_conn_param(info-conn_handle, 100, 100, // min/max interval (x1.25ms) 20, // latency 600); // timeout (x10ms) // 【关键】必须等待回调确认 // 在 le_conn_param_update_callback 中检查 status } } // 连接参数更新回调 void le_conn_param_update_callback(u16 conn_handle, u8 status) { if (status 0) { printf(Conn param updated SUCCESS!\r\n); } else { printf(Conn param update FAILED! status%d\r\n, status); // status0x0A 表示主机拒绝可尝试更保守的参数如 interval50 } }参数说明interval100对应 125 ms是 iOS/Android 普遍接受的上限latency20允许跳过 20 个连接事件大幅降低唤醒频率timeout6006 s确保长间隔下连接不超时。5. 避坑指南AC6321 低功耗开发中 5 条血泪经验总结功耗优化不是线性过程而是一场与隐藏干扰源的捉迷藏。以下是我在多个杰理项目中踩过的、最具代表性的五个坑每一条都附带现象、根因和可立即执行的解决命令/操作。它们不是理论推测而是波形图上清晰可见的“罪证”。5.1 现象串口打印正常但功耗波形谷值在 45–60 µA始终无法压到 20 µA原因板级VDDIO电源路径上存在微小漏电最常见于 USB 转串口芯片的 VCC 与杰理 VDDIO 未隔离。当 USB 转串口芯片如 CH340的 VCC 由电脑 USB 供电5 V而其 TX/RX 引脚直接连到杰理 UART 引脚时CH340 的内部电平转换电路会通过 RX 引脚向杰理芯片注入微弱电流形成漏电通路。解决硬件在 CH340 的 TX 引脚与杰理 RX 引脚之间串联一个 1 kΩ 电阻软件测功耗时物理拔掉 USB 线改用电池或功耗盒子单独供电验证拔掉 USB 后用万用表二极管档测量杰理 VDDIO 与 GND 间正向压降应 0.8 V正常硅管压降若 0.3 V 则存在强漏电。5.2 现象烧录公版 demo 功耗正常19 µA但加入自己一行printf(test)后功耗升至 110 µA消失原因printf底层调用uart_putchar()将字符写入发送 FIFO。若 UART 外设未初始化、或 FIFO 未清空、或uart_is_tx_empty()检查缺失is_idle()会因 FIFO 非空而返回0芯片无法睡眠。解决确保CONFIG_UART_DEBUG_ENABLE0测功耗时若必须打印用putchar()替代printf()并确保每次调用后执行while(!uart_is_tx_empty(DEBUG_UART));在custom_idle_query()中加入uart_is_tx_empty()检查见 4.1 节代码。5.3 现象连接后功耗波形出现密集毛刺每 10–20 ms 一个尖峰谷值抬高至 80 µA原因代码中误用了usr_timer_add(..., ..., ..., 1)或 SDK 中某模块如 OTA、DFU默认启用了高优先级定时器。priority1的定时器强制系统主循环永不空闲芯片被“钉”在运行态。解决全局搜索usr_timer_add将所有priority1改为0若必须高精度改用sys_timer_add 计数器如每 10ms 触发内部计数 5 次实现 50ms检查app_config.h中CONFIG_OTA_ENABLE、CONFIG_DFU_ENABLE是否为1若是确认其内部未启用usr_timer_add。5.4 现象powerdown模式下功耗为 18 µA但poweroff模式下功耗为 5 µA远高于标称 2 µA原因poweroff前未关闭所有外设时钟或 RTC 晶振未起振。AC6321 进入poweroff时若 32.768 kHz 晶振未稳定系统会等待超时后强制进入浅度休眠导致功耗偏高。解决在调用sys_power_off()前添加 RTC 初始化并等待起振rtc_init(); // 初始化 RTC while(!rtc_is_32k_ready()); // 等待 32.768kHz 晶振稳定 sys_power_off(); // 再关机检查原理图确认 RTC 晶振负载电容匹配通常 12.5 pF且走线短、远离高频信号。5.5 现象连接参数协商成功le_conn_param_update_callback返回status0但波形尖峰间隔仍为 350 ms未变为预期的 3125 ms原因主机iOS/Android虽接受了连接参数但其 Link Layer 实现可能对latency值有额外限制。iOS 对latency 10 的支持不稳定部分 Android 厂商 ROM 会忽略latency直接按interval计算。解决优先调大interval如设为 100latency设为 0此时周期 interval × 1.25 125 msiOS/Android 兼容性最好使用 nRF Connect 等专业工具连接查看其显示的Connection Interval和Slave Latency实际值确认是否与请求一致若必须高latency在le_conn_param_update_callback中收到status0后再发送一次le_set_conn_param请求部分主机需二次确认。6. 进阶技巧用功耗波形反向定位代码执行时间与外设唤醒源当功耗优化进入深水区如目标 18.5 µA毫安级的波动已无意义你需要的是微秒级的“时间显微镜”。本节教你如何把功耗盒子的波形图变成一张可读的“代码执行地图”精准定位哪一行 C 代码、哪一个外设中断正在偷偷消耗你的 µA。6.1 波形即代码用 GPIO 翻转标记函数执行边界最直接的方法是在关键函数入口和出口翻转一个未使用的 GPIO用示波器抓取其高低电平时间再与功耗波形叠加。例如你想知道key_scan()函数执行了多久// 在 board_ac630n_demo.c 中定义一个 debug GPIO #define DEBUG_GPIO IO_PORTA_01 void key_scan(void) { gpio_write(DEBUG_GPIO, 1); // 标记开始 // ... 原有按键扫描代码 ... gpio_write(DEBUG_GPIO, 0); // 标记结束 }然后在board_init()中配置gpio_direction_output(DEBUG_GPIO, 0);操作示波器 CH1 接DEBUG_GPIOCH2 接功耗盒子电流采样端需加运放转电压触发设置为 CH1 上升沿观察波形CH1 高电平宽度 key_scan()执行时间CH2 在此期间若出现电流抬升说明该函数内有耗电操作如 ADC 采样、UART 发送若 CH2 在 CH1 低电平期间函数外出现尖峰说明是其他中断如 BLE 事件、定时器在唤醒。6.2 “尖峰指纹库”五类典型唤醒源的波形特征速查表通过长期实测本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询