4 看门狗相关

4.1 看门狗WDT在Standby后的状态


alt text

如上代码,目前的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中的钩子函数;

__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);
    }
}