蓝牙低功耗模式

更新时间:2025-04-16 06:03:47LLM 副本以 Markdown 格式查看下载 PDF

蓝牙 Mesh 官方定义了 LPN 节点,可以自动与 friend 节点建立关系,后续 friend 节点可以替 LPN 节点缓存消息,在 LPN 节点唤醒后与其通信。由于需要搭配 friend 节点使用以及 TuyaOS 开发方案的使用场景多种多样,目前 TuyaOS Bluetooth Mesh SDK 未支持此通信方式,后续支持时会发布独立 SDK。

TuyaOS Bluetooth Mesh SDK 支持休眠唤醒功能,设备可以通过进入休眠来降低功耗。对于电池供电的设备比较适用,因为在没有进入休眠时,Mesh 设备保持持续的 Scan,所以射频与 SOC 这块的功耗加起来是比较高的。目前,市面上的芯片 Mesh 不休眠工作功耗范围大约在 6mA - 10mA 左右。

进入低功耗之后设备将无法接收 Mesh 数据,所以对设备的使用场景是有要求的。目前使用 Mesh 低功耗的产品有遥控器、场景面板、无线开关以及各类传感器等。

休眠模式

SDK 目前支持两种模式:TUYA_CPU_SLEEPTUYA_CPU_DEEP_SLEEP,详细介绍见下表。

参数 TUYA_CPU_SLEEP TUYA_CPU_DEEP_SLEEP
模式 Suspend 休眠 深度休眠
RAM 保持情况 保持 不保持(部分平台 Retention 模式则支持 RAM 保持)
唤醒后 PC 指针 唤醒后从休眠处继续运行 唤醒后从头开始运行
相对功耗 较低 极低

数据结构

TUYA_CPU_SLEEP_MODE_E

typedef enum {
    TUYA_CPU_SLEEP,
    TUYA_CPU_DEEP_SLEEP,
} TUYA_CPU_SLEEP_MODE_E;
  • TUYA_CPU_SLEEP:目前默认为 Suspend 模式。

  • TUYA_CPU_DEEP_SLEEP:深度休眠模式。

TUYA_WAKEUP_SOURCE_E

typedef enum {
    TUYA_WAKEUP_SOURCE_GPIO,
    TUYA_WAKEUP_SOURCE_TIMER,
} TUYA_WAKEUP_SOURCE_E;
  • TUYA_WAKEUP_SOURCE_GPIO:GPIO 唤醒源类型。

  • TUYA_WAKEUP_SOURCE_TIMER:Timer 唤醒源类型。

TUYA_WAKEUP_SOURCE_GPIO_T

typedef struct {
    TUYA_GPIO_NUM_E gpio_num;
    TUYA_GPIO_LEVEL_E level;
} TUYA_WAKEUP_SOURCE_GPIO_T;
  • gpio_num:GPIO 号。

  • level:唤醒的 GPIO 电平。

TUYA_WAKEUP_SOURCE_TIME_T

typedef struct {
    TUYA_TIMER_NUM_E timer_num;
    TUYA_TIMER_MODE_E mode;
    UINT32_T ms;
} TUYA_WAKEUP_SOURCE_TIMER_T;

TUYA_WAKEUP_SOURCE_BASE_CFG_T

typedef struct {
    TUYA_WAKEUP_SOURCE_E source;
    union {
        TUYA_WAKEUP_SOURCE_GPIO_T gpio_param;
        TUYA_WAKEUP_SOURCE_TIMER_T timer_param;
    } wakeup_para;
}TUYA_WAKEUP_SOURCE_BASE_CFG_T;
  • source:唤醒源类型。

  • gpio_param:GPIO 唤醒方式配置。

  • timer_param:Timer 唤醒方式配置。

API 使用说明

休眠模式配置

OPERATE_RET tkl_cpu_sleep_mode_set(BOOL_T enable, TUYA_CPU_SLEEP_MODE_E mode);
  • enable:使能休眠模式。

  • mode:休眠模式。

进入休眠

VOID_T tkl_cpu_allow_sleep(VOID_T);

TuyaOS Bluetooth Mesh SDK 调用此接口后,将会立即进入低功耗。

唤醒源配置

OPERATE_RET tkl_wakeup_source_set(CONST TUYA_WAKEUP_SOURCE_BASE_CFG_T *param);

param:唤醒源配置参数,详细格式参考前文数据结构。

使用说明

如下示例中配置设备 GPIO 8 低电平唤醒与 30s timer 唤醒,使用 suspend 方式休眠。

TUYA_WAKEUP_SOURCE_BASE_CFG_T param_gpio;
param_gpio.source = TUYA_WAKEUP_SOURCE_GPIO;
param_gpio.wakeup_para.gpio_param.gpio_num = TUYA_GPIO_NUM_8;
param_gpio.wakeup_para.gpio_param.level = TUYA_GPIO_LEVEL_LOW;

TUYA_WAKEUP_SOURCE_BASE_CFG_T param_timer;
param_timer.source = TUYA_WAKEUP_SOURCE_TIMER;
param_timer.wakeup_para.timer_param.timer_num = TUYA_TIMER_NUM_0;
param_timer.wakeup_para.timer_param.mode = TUYA_TIMER_MODE_ONCE;
param_timer.wakeup_para.timer_param.ms = 30000;

tkl_wakeup_source_set(&param_gpio);
tkl_wakeup_source_set(&param_timer);

tkl_cpu_sleep_mode_set(1, TUYA_CPU_SLEEP);
tkl_cpu_allow_sleep();

注意事项

IV 更新适配

Mesh 网络运行一段时间后会触发 IV index 更新,所以低功耗设备必须定期唤醒来保证可以进行正常 IV index 更新,否则将无法与 Mesh 网络内其他设备通信。

唤醒机制:低功耗设备必须每隔 96h 唤醒一次,每次唤醒持续 15s 以上时间。

平台特性

  • PHY6222 平台:Deep_sleep 模式下不支持 Timer 唤醒。

  • PHY6222 平台:Deep_sleep 模式下不支持 RAM 保持。

  • TLSR825x 平台:理论上,休眠最长时间为 234s(依据芯片原厂开发手册)。

Deep Sleep Retention

对于 TLSR825x 平台,深度休眠模式下支持 32K RAM 保持,即 Deep Sleep Retention 模式。SDK 中默认未开启 Retention 模式,如要使能 Retention 需要做如下配置(3.8.0 版本及以上):

tuya_iot_config.h 中增加 #define TKL_DEEPSLEEP_RETENTION_ENABLE 1。开启 Retention 模式后,默认所有变量都放置于 Retention 区域,但是只有 32k 可能会导致 Retention 区域 Size 超出,导致编译不通过。您可以将无需保持的变量增加 _attribute_no_retention_bss_ 前缀来降低 Retention 区域 RAM 占用。

注意:使用堆 malloc 时,休眠唤醒后堆内的内容不保持。

另外,开启 Retention 模式后,需要按照如下方式修改休眠接口,否则 iv 更新功能将出现异常。

INT32_T tuya_cpu_sleep_wakeup(SleepMode_TypeDef deepsleep, SleepWakeupSrc_TypeDef wakeup_src, UINT32_T ms)
{
#if 0
    return cpu_long_sleep_wakeup(deepsleep, wakeup_src, ms * HAL_CLOCK_1MS_TICKS);
#else
    UINT32_T wakeup_tick = clock_time() + ms * CLOCK_SYS_CLOCK_1MS;
    return cpu_sleep_wakeup(deepsleep, wakeup_src, wakeup_tick);
#endif
}