在物联网设备开发中,低功耗设计是永恒的主题。最近在调试Telink TLSR825x系列芯片的BLE项目时,发现一个典型场景:设备需要长期处于睡眠模式,同时又要能通过GPIO唤醒响应外部事件。这种需求在智能门锁、穿戴设备等场景中非常常见。
Telink的这套方案有个特别的设计——它的GPIO唤醒机制和传统MCU不太一样。不是简单配置个中断就能搞定,而是需要结合电源管理寄存器和BLE协议栈协同工作。我花了三天时间才摸清完整配置流程,这里把关键步骤和踩坑经验完整分享出来。
TLSR825x采用双核设计:一个高性能的32位应用处理器(M0)和一个专为BLE优化的8位射频处理器。在睡眠模式下,M0核心会完全关闭,仅保留射频处理器维持基础蓝牙功能。此时GPIO唤醒需要依赖芯片的PM(Power Management)模块。
关键点:唤醒源分为两类 - 射频事件(如BLE连接请求)和硬件事件(如GPIO触发)。本文聚焦GPIO硬件唤醒场景。
完整唤醒流程包含三个关键环节:
实测发现从GPIO触发到系统完全唤醒的延迟约3.2ms(@32kHz低速时钟),这个时间参数对设计防抖策略很重要。
先看硬件层面必须满足的条件:
典型电路建议:
c复制// 推荐电路参数
VBAT ──┬── 10kΩ ── GPIO
│
100nF
│
GND
完整配置代码示例(基于Telink SDK v3.4.0):
c复制// 步骤1:配置GPIO工作模式
gpio_set_func(GPIO_PB0, AS_GPIO);
gpio_set_input_en(GPIO_PB0, 1);
gpio_setup_up_down_resistor(GPIO_PB0, PM_PIN_PULLUP_1M);
// 步骤2:设置唤醒触发条件
pm_set_gpio_wakeup_mask(GPIO_PB0, PM_GPIO_RISING);
// 步骤3:使能PM模块唤醒功能
pm_set_gpio_wakeup_debounce(30); // 30个低速时钟周期
pm_set_wakeup_source(PM_WAKEUP_GPIO);
// 步骤4:进入低功耗模式
blt_pm_proc();
关键参数说明:
PM_GPIO_RISING可选值:
code复制实际时间(ms) = 设定值 * (1/32kHz) * 1000
例如30对应约0.94ms
唤醒后必须重新初始化RF部分:
c复制void user_init_normal(void)
{
// 检测唤醒源
if(pm_get_wakeup_source() & PM_WAKEUP_GPIO){
gpio_wakeup_handler();
}
// 必须调用的恢复函数
blc_ll_resume_ram_dataRetention();
// 其他外设初始化...
}
现象1:唤醒后程序跑飞
.retention_data段是否保留关键变量现象2:GPIO频繁误唤醒
通过示波器实测的电流数据对比:
| 配置项 | 睡眠电流(uA) |
|---|---|
| 仅BLE广播 | 18.2 |
| BLE+GPIO唤醒 | 22.7 |
| 优化后的配置 | 19.5 |
优化方法:
clock_gate(GATE_GPIO, 0);gpio_setup_up_down_resistor(GPIO_PB0, PM_PIN_UP_DOWN_FLOAT);pm_set_wakeup_hold_time(10); // 单位ms通过配置PM_GPIO_WAKEUP_MASK寄存器可以实现与/或逻辑:
c复制// PB0上升沿 AND PB1下降沿触发
pm_set_gpio_wakeup_mask(GPIO_PB0, PM_GPIO_RISING);
pm_set_gpio_wakeup_mask(GPIO_PB1, PM_GPIO_FALLING);
pm_set_wakeup_logic(PM_WAKEUP_GPIO_LOGIC_AND);
典型应用代码框架:
c复制void blt_pm_proc(void)
{
if(no_ble_activity){
// 先处理BLE超时事件
bls_pm_setAppWakeupLowPower(2500, 1);
// 再使能GPIO唤醒
pm_set_wakeup_source(PM_WAKEUP_GPIO | PM_WAKEUP_TIMER);
}
}
这种模式在智能门锁中特别有用:平时靠GPIO唤醒检测按键,连接状态下通过BLE事件维持活跃。