涂鸦T5,硬件看门狗开发

Wi-Fi 设备、蜂窝设备、WuKongAI、开发板、TuyaOS 移植等


13160058813
Posts: 41

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

Attachments
硬件安了看门狗,升级一直重复erase.txt
(218.46 KiB) Downloaded 11 times
愚者千虑必有一得
Posts: 700

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

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

13160058813
Posts: 41

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

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

User avatar
一线长天
Posts: 78

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

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

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

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

13160058813
Posts: 41

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

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

User avatar
一线长天
Posts: 78

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

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

13160058813
Posts: 41

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

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

User avatar
一线长天
Posts: 78

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

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

13160058813
Posts: 41

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

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、硬件看门狗在哪里?相关代码封装起来了是吧?

一个网友
Posts: 21
Location: ⭐星星⭐

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

您好,
这里是喂狗操作,操作的硬狗,流程参考如下
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);
}

努力写bug……

Post Reply