# 4 看门狗相关 ## 4.1 看门狗WDT在Standby后的状态
![alt text](./assets/wdt/wdt001.png)
如上代码,目前的SDK是进入standby后,watchdog不会掉电,但代码中会停掉wdt,不管睡多长时间,watchdog都不生效发生reset。
从standby醒来会走resume那个case, 会重新初始化wdt, 相当于重新开始计数。
## 4.2 Jlink关闭看WDT的方法 1,场景1,如果Hcpu和Lcpu都开启了看门狗,机器出现反复重启,无法dump内存定位问题,可以jlink关闭看门狗, 执行:
``` tools\segger\halt_all_cpu_and_disable_all_wdt_a0.bat ``` 会关闭hcpu,lcpu的WDT,并且halt 两个cpu,便于dump内存。
2,场景2:如果只想关闭Hcpu的log,并且让Hcpu继续运行
修改:halt_all_cpu_and_disable_all_wdt_a0.bat对应的halt_all_cpu_and_disable_all_wdt_a0.jlink中命令内容,如下:
``` connect #连接jlink w4 0x4004f000 0 #jlink切到Hcpu connect #连接jlink h #halt hcpu w4 0x40014018 0x51ff8621 w4 0x4001400C 0x34 w4 0x40014018 0x58ab99fc w4 0x4007c018 0x51ff8621 w4 0x4007c00C 0x34 w4 0x4007c018 0x58ab99fc g #上面操作完WDT寄存器后,go,继续运行Hcpu exit ``` 3,场景3:如果只想关闭Lcpu的log,并且让Lcpu继续运行,截取halt_all_cpu_and_disable_all_wdt_a0.jlink中命令一部分并稍加修改即可。
``` connect w4 0x4004f000 1 connect w4 0x40070000 0 h w4 0x40055018 0x51ff8621 w4 0x4005500C 0x34 w4 0x40055018 0x58ab99fc g exit ``` ## 4.3 清WDT位置在哪 1,rt_hw_watchdog_init初始化函数会通过rt_hw_watchdog_hook把rt_hw_watchdog_pet注册为一个钩子函数;
2,当系统无任务处理进入idle线程rt_thread_idle_entry后,里面就会执行上面注册在idle_hook_list中的钩子函数;
```c __ROM_USED void rt_hw_watchdog_init(void) { extern int rt_wdt_init(void); rt_wdt_init(); wdt_dev = rt_device_find("wdt"); if (wdt_dev) { rt_err_t err = rt_device_open(wdt_dev, RT_DEVICE_FLAG_RDWR); if (err == RT_EOK) { uint32_t count = WDT_TIMEOUT; rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &count); } } rt_hw_watchdog_hook(1); //注册wdt钩子函数后,会在idle线程自动清狗 } __ROM_USED void rt_hw_watchdog_pet(void) //手动清狗函数,可以调用此函数 { if (wdt_dev) { rt_device_control(wdt_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL); } } ```