系列文章目录
第二章 DW_wdt功能及使用流程介绍
前言
WDT即我们常说的看门狗,一般带CPU的系统都会配上WDT,主要原因也是因为在实际软件运行过程中,无论是硬件存在缺陷还是软件存在bug,还是随着芯片运行环境变化导致timing问题、甚至说遇到了概率性的异步问题等原因,莫名导致CPU跑飞了,也就是说CPU无法正常取指执行,进而导致一些模块无法正常运行,而这些应用场景有时候无法人为干预,所以即使CPU跑飞了,我们也想通过某个技术手段,让CPU能够回归正常,也就是我们说的重启。
WDT就是专门为这个而生的,他会定期的产生中断上报给CPU,CPU收到这个中断后要去及时处理,即喂狗。当CPU正常时,是可以识别出该中断并且喂狗的。一旦CPU异常,它可能无法正常识别该中断,也不能正常喂狗,就会导致这个中断一直无法被清除。当该中断一直不被清除,WDT模块就会认为CPU应该是忙或者出了问题了,因此,当下一轮计数周期到来时,CPU还一直无法处理中断,那么WDT就基本判断CPU挂了,因此WDT会直接输出全局复位信号,该信号会导致系统重启。
提示:以下是本篇文章正文内容,下面案例可供参考
一、使用步骤
1.定义WDT中断服务子程序
void wdt_int_handler()
{
RESTART_WDT; //重启wdt
REG32(WDT_ROI); //或者读清中断
}
一般情况下,wdt发生中断后,软件可以通过重启wdt或者读清掉中断,也就是通常所说的喂狗,让wdt模块重启。
2.定义main函数
代码如下(示例):
CLK_WDT_EN; //使能WDT模块时钟,根据RTL设计
REG32(WDT_CR) |= (0x1 <<1 ); //设置WDT模式为中断模式
REG32(WDT_CR) &= ~(0x1 << 1); //设置WDT模式为先中断后复位模式
REG32(WDT_CRR) = 0x76; //重启WDT
首先,需要先打开模块时钟使能,这样才可以进行后续WDT模块内部寄存器配置
然后,根据需求配置wdt的模式是中断还是先中断后复位,软件选择其中一种进行配置。
最后,使能WDT。
总结
如果WDT配置为先中断后复位模式,实际仿真可以发现一旦wdt的中断无法清除,那么wdt会自动load一个很大的counter值进行重新计数,当这个很大的counter值计数完成后,中断还没有得到清除,就会发起系统复位请求。
WDT主要用于CPU跑飞后,可以重启系统。正常情况下,如果CPU没有跑飞,可以正常清中断,即喂狗说明系统正常。可是一旦CPU跑飞后,就无法正确清中断,那么可以通过WDT复位来重置系统。