更新时间: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_SLEEP
与 TUYA_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 唤醒方式配置。
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(¶m_gpio);
tkl_wakeup_source_set(¶m_timer);
tkl_cpu_sleep_mode_set(1, TUYA_CPU_SLEEP);
tkl_cpu_allow_sleep();
Mesh 网络运行一段时间后会触发 IV index 更新,所以低功耗设备必须定期唤醒来保证可以进行正常 IV index 更新,否则将无法与 Mesh 网络内其他设备通信。
唤醒机制:低功耗设备必须每隔 96h 唤醒一次,每次唤醒持续 15s 以上时间。
PHY6222 平台:Deep_sleep
模式下不支持 Timer 唤醒。
PHY6222 平台:Deep_sleep
模式下不支持 RAM 保持。
TLSR825x 平台:理论休眠最长时间为 268s。
对于 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
}
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈