蓝牙 BLE设备、蓝牙 MESH设备、蓝牙 Beacon设备、Sub-G设备等
-
luzhihui
- Posts: 33
- Joined: 2023年 Nov 15日 18:08
1)开发包全称:tuyaos-subdev-bt_3.10.0_phy6222_ble_ble-common_1.0.3.tar
2)问题现象:在APP上点击升级后,大约4秒设备就复位了,APP显示升级失败。
我首先是在3.9.0上遇到这个问题,然后我用最新的SDK一点点的移植代码,测试找问题,最终在修改主频后出现OTA失败。
修改主频位置在这里,有原本的16M改为48M后出现OTA失败。
Code: Select all
int main(void)
{
watchdog_config(WDG_2S);
#if (FLASH_PROTECT_FEATURE == 1)
hal_flash_enable_lock(MAIN_INIT);
#endif
tkl_init_first();
g_system_clk = SYS_CLK_XTAL_16M; //SYS_CLK_DBL_32M; //SYS_CLK_XTAL_16M; //SYS_CLK_DLL_64M; //SYS_CLK_DLL_48M;
g_clk32K_config = CLK_32K_RCOSC; //CLK_32K_XTAL, CLK_32K_RCOSC
drv_irq_init();
init_config();
#if (HOST_CONFIG & OBSERVER_CFG)
extern void ll_patch_advscan(void);
ll_patch_advscan();
#else
extern void ll_patch_slave(void);
ll_patch_slave();
#endif
Tags:
-
逻辑的院子
- Posts: 290
- Joined: 2022年 Sep 16日 18:15
-
Contact:
如果使用默认的主频g_system_clk = SYS_CLK_XTAL_16M不会有问题;
如果修改主频为g_system_clk = SYS_CLK_DLL_48M,由于在OTA开始之前会调用hal_system_clock_change_active接口来修改主频,该接口的参数如果与已有主频一致则会返回1,导致程序卡死,所以如果修改主频为SYS_CLK_DLL_48M,可以同时修改tkl_ota.c中的tkl_ota_start_notify接口为:
Code: Select all
OPERATE_RET tkl_ota_start_notify(UINT_T image_size, TUYA_OTA_TYPE_E type, TUYA_OTA_PATH_E path)
{
#if (HOST_CONFIG & OBSERVER_CFG)
tkl_ble_gap_scan_stop();
#endif
uint8_t st = 0;
do {
if (hw_version_is_old()) {
if (g_system_clk != SYS_CLK_DBL_32M) {
st = hal_system_clock_change_active(SYS_CLK_DBL_32M, clk_change_mod_restore);
}
} else {
if (g_system_clk != SYS_CLK_DLL_48M) {
st = hal_system_clock_change_active(SYS_CLK_DLL_48M, clk_change_mod_restore);
}
}
} while (st == 1);
return OPRT_OK;
}
-
luzhihui
- Posts: 33
- Joined: 2023年 Nov 15日 18:08
这样改也不行,目前用的tuyaos-subdev-bt_3.10.0_phy6222_ble_ble-common_1.0.3.tar这个版本SDK验证。
修改这里
Code: Select all
g_system_clk = SYS_CLK_DLL_48M; //SYS_CLK_DBL_32M; //SYS_CLK_XTAL_16M; //SYS_CLK_DLL_64M; //SYS_CLK_DLL_48M;
g_clk32K_config = CLK_32K_RCOSC; //CLK_32K_XTAL, CLK_32K_RCOSC
另外修改
Code: Select all
OPERATE_RET tkl_ota_start_notify(UINT_T image_size, TUYA_OTA_TYPE_E type, TUYA_OTA_PATH_E path)
{
extern volatile sysclk_t g_system_clk;
#if (HOST_CONFIG & OBSERVER_CFG)
tkl_ble_gap_scan_stop();
#endif
uint8_t st = 0;
do {
if (hw_version_is_old()) {
if (g_system_clk != SYS_CLK_DBL_32M) {
st = hal_system_clock_change_active(SYS_CLK_DBL_32M, clk_change_mod_restore);
}
} else {
if (g_system_clk != SYS_CLK_DLL_48M) {
st = hal_system_clock_change_active(SYS_CLK_DLL_48M, clk_change_mod_restore);
}
}
} while (st == 1);
return OPRT_OK;
}
测试使用48M依然会失败
-
luzhihui
- Posts: 33
- Joined: 2023年 Nov 15日 18:08
逻辑的院子 2024年 Jul 9日 14:48
如果使用默认的主频g_system_clk = SYS_CLK_XTAL_16M不会有问题;
如果修改主频为g_system_clk = SYS_CLK_DLL_48M,由于在OTA开始之前会调用hal_system_clock_change_active接口来修改主频,该接口的参数如果与已有主频一致则会返回1,导致程序卡死,所以如果修改主频为SYS_CLK_DLL_48M,可以同时修改tkl_ota.c中的tkl_ota_start_notify接口为:
Code: Select all
OPERATE_RET tkl_ota_start_notify(UINT_T image_size, TUYA_OTA_TYPE_E type, TUYA_OTA_PATH_E path)
{
#if (HOST_CONFIG & OBSERVER_CFG)
tkl_ble_gap_scan_stop();
#endif
uint8_t st = 0;
do {
if (hw_version_is_old()) {
if (g_system_clk != SYS_CLK_DBL_32M) {
st = hal_system_clock_change_active(SYS_CLK_DBL_32M, clk_change_mod_restore);
}
} else {
if (g_system_clk != SYS_CLK_DLL_48M) {
st = hal_system_clock_change_active(SYS_CLK_DLL_48M, clk_change_mod_restore);
}
}
} while (st == 1);
return OPRT_OK;
}
修改48M按照这样改不行,但是用SYS_CLK_DBL_32M是可以OTA成功的。
-
逻辑的院子
- Posts: 290
- Joined: 2022年 Sep 16日 18:15
-
Contact:
你打印一下这个变量,看看芯片版本
extern unsigned char chip_hw_version;