蓝牙低功耗模式

更新时间:2023-12-11 07:46:03下载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 平台:理论休眠最长时间为 268s。

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
}