BPU模组,由于SDK(PHY6222_3.5.4)没有提供定时唤醒功能,我自行实现一个软定时器用于唤醒,发现定时时长无论设置多少,都是30S唤醒,即定时时间设置无效,请问是什么原因导致的呢?但如果不启动该定时器,则不唤醒,从这个角度分析,确实是定时唤醒(实测也进入了定时回调函数)
【已解决】BPU模组定时唤醒功能
Re: BPU模组定时唤醒功能
TUYA_WEAK_ATTRIBUTE OPERATE_RET tal_sw_timer_create(TAL_TIMER_CB func, VOID_T *arg, TIMER_ID *timer_id);
和
TUYA_WEAK_ATTRIBUTE OPERATE_RET tal_sw_timer_start(TIMER_ID timer_id, TIME_MS time_ms, TIMER_TYPE timer_type);
其中timer_type入参使用TAL_TIMER_ONCE,即单次
Re: BPU模组定时唤醒功能
细测发现,tal_sw_timer_start()定时入参如果设置小于20(即全速运行时的20ms),则进入休眠立马定时唤醒,如果大于或等于20,则30S唤醒
Re: BPU模组定时唤醒功能
tal_sw_timer_create是软定时,软定时是依赖于系统主循环的,所以在设备进入低功耗模式后是不可用的,您如果要在低功耗模式下唤醒设备,可以使用tkl_timer_init及相关接口
Re: BPU模组定时唤醒功能
那很奇怪,为何启用软定时,就能30S唤醒呢,其中是什么逻辑;
另外,我测试了tkl_timer_init()相关接口,tkl_timer_start设置时间超过30000(us),比如40000,就不能唤醒(至少等了几分钟没唤醒),但设置小于或等于30000(us),立马唤醒,这种现象与软定时唤醒的情况很类似,请问是什么原因
Re: BPU模组定时唤醒功能
第一点,30s唤醒的原因:
芯片原厂的SDK在sleep模式下,默认30s会唤醒一次,但是唤醒后会立刻再次进入休眠,这个逻辑本身不会对低功耗有很大的影响。
但是如果使用tal_sw_timer_create,由于tal_sw_timer_create整套逻辑依赖于主循环,也就是说在sleep模式下,tal_sw_timer_create整套逻辑都不会执行,但是由于芯片原厂每隔30s会短暂唤醒一次,在这次唤醒的时候,就会执行tal_sw_timer_create整套逻辑。
假设你在对应的回调函数中做了保持唤醒的操作,那么就会发生唤醒后不再会进入休眠的现象。
第二点,我测试了tkl_timer_init()相关接口,例如将tkl_timer_start设置时间为50,000,000us(即50s),并在对应的回调函数中做保持唤醒的操作,是可以在50s的时候唤醒设备的(使用该机制的同时请不要使用软定时机制)
Re: BPU模组定时唤醒功能
测试tkl_timer_init()相关接口,没有同时使用软定时唤醒机制;我是在一个软定时器回调函数里面根据业务逻辑来调用tkl_timer_start()启动硬件定时器然后进行休眠,在该硬件定时器的回调函数里面调用tal_ble_sdk_test_wake_up_handler()进行唤醒,请问这样有问题吗
Re: BPU模组定时唤醒功能
该文档说的是deep sleep模式下只能通过 GPIO 唤醒,不支持 Timer 唤醒,但是我们之前讨论的都是 sleep 模式,所以是支持 Timer 唤醒的。
代码如下:
实际效果如下: