【已解决】TLSR8250 单点蓝牙无法进入休眠

蓝牙 BLE设备、蓝牙 MESH设备、蓝牙 Beacon设备、Sub-G设备等


Post Reply
dong
Posts: 15

已打开宏
#define BLE_MODULE_PM_ENABLE 1
#define PM_DEEPSLEEP_RETENTION_ENABLE 1

设置了唤醒PIN
#define GPIO_WAKEUP_MODULE_POLARITY 0
#define WAKEUP_MODULE_GPIO GPIO_PB6

//////////////////////////// MODULE PM GPIO (EVK board) /////////////////////////////////
#define GPIO_WAKEUP_MODULE GPIO_PB6 //mcu wakeup module
#define PB6_FUNC AS_GPIO
#define PB6_INPUT_ENABLE 1
#define PB6_OUTPUT_ENABLE 0
#define PB6_DATA_OUT 0
#define GPIO_WAKEUP_MODULE_HIGH gpio_setup_up_down_resistor(GPIO_WAKEUP_MODULE, PM_PIN_PULLUP_10K);
#define GPIO_WAKEUP_MODULE_LOW gpio_setup_up_down_resistor(GPIO_WAKEUP_MODULE, PM_PIN_PULLDOWN_100K);

执行 ty_system_enter_sleep(); 后无法进入休眠

请教,是还有其它配置的地方吗?

jinyuan
Posts: 81

Re: TLSR8250 单点蓝牙无法进入休眠

1、如果唤醒口一直被触发,则芯片无法进入休眠状态。
2、这里获得的信息不够全面, 如果可以,希望能够将 app_power_management 这个函数的内容 以及 app_module_busy 的内容提供一下

dong
Posts: 15

Re: TLSR8250 单点蓝牙无法进入休眠

这两个函数内容都没有做改动

Code: Select all

void app_power_management ()
{
#if (BLE_MODULE_PM_ENABLE)
	if((ty_system_is_sleep())&&(!app_module_busy())&&(tuya_ble_sleep_allowed_check() == true))
	{
		#if (PM_DEEPSLEEP_RETENTION_ENABLE)
			bls_pm_setSuspendMask (SUSPEND_ADV | DEEPSLEEP_RETENTION_ADV | SUSPEND_CONN | DEEPSLEEP_RETENTION_CONN);
		#else
			bls_pm_setSuspendMask(SUSPEND_ADV | SUSPEND_CONN);
		#endif

	bls_pm_setWakeupSource(PM_WAKEUP_PAD);  // GPIO_WAKEUP_MODULE needs to be wakened
}
#endif
}

=============================================================================================================================

Code: Select all

int app_module_busy ()
{
	//uint16_t tuya_task_status = tuya_ble_scheduler_queue_events_get();

module_uart_working = UART_TX_BUSY || UART_RX_BUSY; //module checks to see if UART rx and tX are all processed
module_debug_log_working = LOG_BUSY;
module_task_busy = module_uart_working || module_debug_log_working;
return module_task_busy;
}
jinyuan
Posts: 81

Re: TLSR8250 单点蓝牙无法进入休眠

1、 这种低功耗,如果广播没有启动,就无法进入休眠。(SDK默认打开广播,如果这部分没有修改,则应该没有问题)
2、app_module_busy 函数直接 return 0 看看是否能进入休眠。
3、如何判定进入低功耗?
比较简单的办法是通过telink的烧录器 ,结合BDT烧录软件, 在执行ty_system_enter_sleep()后,单机BDT软件的 PC按钮, 查看芯片PC地址,若地
址大部分情况下是0x000000 则表示芯片已经进入休眠。
比较精准的办法就是通过电流分析仪 观察电流数据来判定是否有休眠。
4、如果要让设备进入深度休眠且不带广播,则需要执行cpu_sleep_wakeup(DEEPSLEEP_MODE_RET_SRAM_LOW32K, PM_WAKEUP_PAD, 0);

dong
Posts: 15

Re: TLSR8250 单点蓝牙无法进入休眠

sdk app.c user_init_normal 函数如下, 没有改下,最后一行ty_ble_start_adv(); 为广播开启

Code: Select all

void user_init_normal(void)
{
	//random number generator must be initiated here( in the beginning of user_init_nromal)
	//when deepSleep retention wakeUp, no need initialize again
	random_generator_init();  //this is must


/*****************************************************************************************
 Note: battery check must do before any flash write/erase operation, cause flash write/erase
	   under a low or unstable power supply will lead to error flash operation

	   Some module initialization may involve flash write/erase, include: OTA initialization,
			SMP initialization, ..
			So these initialization must be done after  battery check
*****************************************************************************************/
#if (BATT_CHECK_ENABLE)  //battery check must do before OTA relative operation
	u8 battery_check_returnVaule = 0;
	if(analog_read(USED_DEEP_ANA_REG) & LOW_BATT_FLG){
		do{
			battery_check_returnVaule = app_battery_power_check(VBAT_ALRAM_THRES_MV + 200);  //2.2 V
		}while(battery_check_returnVaule);
	}
	else{
		do{
			battery_check_returnVaule = app_battery_power_check(VBAT_ALRAM_THRES_MV);  //2.0 V
		}while(battery_check_returnVaule);
	}
#endif


////////////////// BLE stack initialization ////////////////////////////////////
	ty_ble_init();

///////////////////// USER application initialization ///////////////////

#if (BLE_MODULE_PM_ENABLE)
	blc_ll_initPowerManagement_module();        //pm module:      	 optional
	blc_pm_setDeepsleepRetentionType(DEEPSLEEP_MODE_RET_SRAM_LOW32K);
	#if (PM_DEEPSLEEP_RETENTION_ENABLE)
		bls_pm_setSuspendMask (SUSPEND_ADV | DEEPSLEEP_RETENTION_ADV | SUSPEND_CONN | DEEPSLEEP_RETENTION_CONN);
		blc_pm_setDeepsleepRetentionThreshold(95, 95);
		blc_pm_setDeepsleepRetentionEarlyWakeupTiming(250);
	#else
		bls_pm_setSuspendMask (SUSPEND_ADV | SUSPEND_CONN);
	#endif

bls_pm_registerFuncBeforeSuspend( &app_suspend_enter );
#else
	bls_pm_setSuspendMask (SUSPEND_DISABLE);
#endif

blt_soft_timer_init();

ty_system_init(0);

tuya_ble_sdk_demo_init();

#if TUYA_BLE_SDK_TEST
	tuya_ble_sdk_test_init();
#endif

//    ty_system_wdt_init();
	ty_ble_start_adv(); 		//开启蓝牙广播
}

ty_system_enter_sleep()函数内容如下,就是要进入深度睡眠的

Code: Select all

uint32_t ty_system_enter_sleep(void)
{
	g_system_sleep = true;
	cpu_sleep_wakeup(DEEPSLEEP_MODE_RET_SRAM_LOW32K, PM_WAKEUP_PAD, 0);
    return 0;
}

但是执行了ty_system_enter_sleep();函数后, 指针并没有指向0; 电流监测有3300uA,
另:有开启本地串口日志;
app_module_busy 函数直接 return 0 也没能进入睡眠,是还有其它因素影响吗?

jinyuan
Posts: 81

Re: TLSR8250 单点蓝牙无法进入休眠

调用了这个接口还没进入休眠 , 那只有一种可能,就是 有某个IO被设置成唤醒口,且一直被触发。找一下程序里面有那些位置调用了这个函数:cpu_set_gpio_wakeup, 调用了这个函数的位置,检查下传入的GPIO是哪个。

dong
Posts: 15

Re: TLSR8250 单点蓝牙无法进入休眠

经验证,不能休眠的原因是开了本地日志,并闭本地日志就好!

dong
Posts: 15

Re: TLSR8250 单点蓝牙无法进入休眠

另外,用cpu_sleep_wakeup(DEEPSLEEP_MODE_RET_SRAM_LOW32K, PM_WAKEUP_PAD, 0);休眠唤醒后并没有进入app.c 文件中的user_init_normal();函数,用户任务应该怎么做?

dong
Posts: 15

Re: TLSR8250 单点蓝牙无法进入休眠

问题已解决,唤醒后应该在user_init_deepRetn()函数里重新初始化硬件

Post Reply