Page 2 of 3

Re: 涂鸦T5,硬件看门狗开发

Posted: 2025年 Jul 14日 18:29
by 13160058813

修改了下,做了一个定时器,定时去线程里面喂狗的。
结果一直erase的


Re: 涂鸦T5,硬件看门狗开发

Posted: 2025年 Jul 15日 16:31
by 愚者千虑必有一得

你这个是在升级?这个是我们的升级过程。


Re: 涂鸦T5,硬件看门狗开发

Posted: 2025年 Jul 16日 11:05
by 13160058813

1、我们安装了硬件看门狗,升级过程中一直重启,喂不了狗的,附件是log
2、升级过程中是进入其它什么模式?为什么喂狗不可以?


Re: 涂鸦T5,硬件看门狗开发

Posted: 2025年 Jul 16日 13:51
by 一线长天

1、我们安装了硬件看门狗,升级过程中一直重启,喂不了狗的,附件是log
硬件看门狗的喂狗间隔默认多少时间?固件重启后,硬件看门狗的喂狗间隔是否会被重置为很短?

2、升级过程中是进入其它什么模式?为什么喂狗不可以?
升级下载时,SDK会持续喂狗的。但下载完成后会进入BOOT,而这个时候是不会喂狗的。因此在准备重启的时候(tkl-reset接口),请关闭硬件看门狗。

3、硬件看门狗需要在每次上电/重启时需要默认关闭,由SDK在初始化看门狗时再开启。


Re: 涂鸦T5,硬件看门狗开发

Posted: 2025年 Jul 16日 17:19
by 13160058813

1、间隔1.6s,平时都没有问题的,都可以正常的,就是在升级的过程中,存在喂不了狗的,我们这个是外部独立看门狗的,没有关闭功能的。
2、这个T5芯片内部有硬件看门狗吧?芯片内部的看门狗是带有关闭功能的。


Re: 涂鸦T5,硬件看门狗开发

Posted: 2025年 Jul 16日 17:29
by 一线长天

那这样的话,还是建议不要使用外部硬件看门狗电路了。
T5本身就有芯片级看门狗电路(可以开启与关闭,默认开启),可以达到同样效果的


Re: 涂鸦T5,硬件看门狗开发

Posted: 2025年 Jul 17日 10:53
by 13160058813

T5本身就有芯片级看门狗电路-----------T5这是软件看门狗吧?有硬件看门狗?


Re: 涂鸦T5,硬件看门狗开发

Posted: 2025年 Jul 17日 11:07
by 一线长天

T5内置的是硬件看门狗,专用的看门狗电路


Re: 涂鸦T5,硬件看门狗开发

Posted: 2025年 Jul 17日 16:11
by 13160058813

1、app_main 中
static void __feed_wdg(void *arg)
{
#define WDT_TIME 30000
TUYA_WDOG_BASE_CFG_T cfg = {.interval_ms = WDT_TIME};
tkl_watchdog_init(&cfg);

Code: Select all

while (1) {
    tkl_watchdog_refresh();
    tkl_system_sleep(WDT_TIME / 2);
}

} 这个是博通的喂狗吧?是属于软狗吧?

2、tuya_devos_health里面有一个喂狗时间的设置,这个是软狗还是硬狗?

3、硬件看门狗在哪里?相关代码封装起来了是吧?


Re: 涂鸦T5,硬件看门狗开发

Posted: 2025年 Jul 17日 16:19
by 一个网友

您好,
这里是喂狗操作,操作的硬狗,流程参考如下
tkl_watchdog_refresh ---> bk_wdt_feed ---> wdt_hal_init_wdt ---> wdt_ll_set_period

Code: Select all

static inline void wdt_ll_set_period(wdt_hw_t *hw, uint32_t period)
{
#if CONFIG_NMI_WDT_EN
	uint32_t nmi_wdt_clk_div = sys_hal_nmi_wdt_get_clk_div();

uint32_t multi = 1;
switch(nmi_wdt_clk_div) {
case 0:  //wdt_clk = src_clk/2
	multi = 16;
	break;
case 1:  //wdt_clk = src_clk/4
	multi = 8;
	break;
case 2:  //wdt_clk = src_clk/8
	multi = 4;
	break;
case 3:  //wdt_clk = src_clk/16
	multi = 2;
	break;
default:
	multi = 1;
	break;
}

period = period * multi;
if (period > WDT_F_PERIOD_M) {
	period = WDT_F_PERIOD_M;
}
#endif

hw->global_ctrl.soft_reset = 1;

uint32_t ctrl_val = (period & WDT_F_PERIOD_M) | (WDT_V_KEY_1ST << WDT_F_KEY_S);
REG_WRITE(WDT_R_CTRL, ctrl_val);

ctrl_val = (period & WDT_F_PERIOD_M) | (WDT_V_KEY_2ND << WDT_F_KEY_S);
REG_WRITE(WDT_R_CTRL, ctrl_val);
}