09、W601看门狗
一、什么是看门狗
“看门狗”会产生一个周期性中断,系统软件在中断产生后要清除其中断标志,若超过其设定时间未清除,则会产生一个硬复位信号对系统进行复位
主要特性:
- 提供定时功能
- 提供复位功能
- 提供定时中断
二、W601看门狗功能表述
1、定时功能
设置定时值到寄存器 WD_LD 后,设置 WDG_CTRL 的 BIT0 为 1 启动定时器,WDG 模块定时时间到会产生定时中断,通知程序处理。如果寄存器 WD_CLR 的 BIT0 不清除,则会周期产生定时中断。WD_LD 的值以 APB 时钟单位为基准,APB 的时钟从 160M 时钟分频出来
2、复位功能
设置芯片定时值 WD_LD 后,启动定时和复位功能(设置 WDG_CTRL 的 BIT1/BIT0),WDG 模块启动倒计时,定时时间到,WDG 会产生定时中断,同时如果 WD_CLR 的 BIT0 不清除,则芯片会在定时时间的下一个周期产生复位信号。
三、代码实现
看门狗的主要寄存器
接下来就是配置这几个寄存器
void tls_watchdog_init(u32 usec)
{
tls_sys_clk sysclk;
tls_sys_clk_get(&sysclk);
tls_irq_enable(WATCHDOG_INT);
tls_reg_write32(HR_WDG_LOAD_VALUE, sysclk.apbclk * usec); /* 40M dominant frequency: 40 * 10^6 * (usec / 10^6) */
tls_reg_write32(HR_WDG_CTRL, 0x3); /* enable irq & reset */
}
上面就配置好了看门狗了,现在我们利用按键中断来进行“喂狗”,没触发一次按键中断我们就清除看门狗中断标志,这样程序就不会复位了。
void keyup_callback(void *arg)
{
if(tls_get_gpio_irq_status(WM_IO_PA_08))
{
tls_clr_gpio_irq_status(WM_IO_PA_08);
log_i("keyup is succceed");
tls_watchdog_clr();
}
}
四、实验现象
忽略上面的时间,当按下按键的时候,程序是正常执行的,当停止按按键,看门狗中断就触发了……
试验成功。