14. 从0学ARM Cortex-A9 看门狗入门
一、概念
看门狗的简称是WDT(Watch Dog Timer),exynos4412scp中的看门狗定时器(WDT)是一种定时装置。
1. 工作原理
由(一般需要客户编写)软件读写定时器相关的寄存器,打开看门狗,并设定计数时间(以秒或分钟计算),定时器计数计满,由软件清零,以表明系统状态正常,这时,定时器计数重新开始,反复,否则,看门狗认为系统异常或有其他特定事件发生,触发系统复位信号,或提供中断,系统正常后重复定时器计数。
这样只要软件正常运行,就不会出现复位或触发中断。当软件死机或运行出错时,由看门狗定时器对系统进行复位或触发中断,从而保证系统的正常运行。
看门狗的定时时间可以由用户设定,这样可以根据需要在指定的时间内复位系统。
2. 作用
看门狗的作用是微处理器收到干扰进入错误状态后,使系统在一定时间间隔内复位。因此看门狗是保证系统长期、可靠和稳定运行的有效措施。目前大部分的嵌入式芯片内部都集成了看门狗定时器来提高系统运行的可靠性。
4412处理器的看门狗是当系统由于噪音和系统错误而出现故障后,用于处理器的复位操作,也可以作为一个通用的16位定时器来请求中断操作。看门狗定时器产生128个PCLK周期的复位信号。主要特性有如下两个。
1)通用的中断方式的16位定时器。
2)当计数器减到0(发生溢出)时,产生128个PCLK周期的复位信号。
3. Watchdog Timer Block Diagram
看门狗模块包括一个预比例因子放大器,一个四分频的分频器,一个16位计数器。
看门狗的时钟信号源来自PCLK,为了得到宽范围的看门狗信号,PCLK先被预分频,然后再进过分频器分频。预分频比例因子和分频器的分频值,都可以由看门狗控制寄存器(WTCON)决定,预分频比例因子的范围是0~255,分频器的分频比可以是16、32、64或128。看门狗定时器时钟周期的计算如下:
式中Prescaler value 为预分频比例放大器的值;Divison_factor是四分频的分频比,可以是16、32、64或128。
4. 工作流程
一旦看门狗定时器被允许,看门狗定时器数据寄存器(WTDAT)的值就不能被自动地装在到看门狗定时器(WTCNT)中。因此,看门狗启动前要将一个初始值写入看门狗计数器(WTCNT)中。
【注意】 当4412用嵌入式ICE调试时,看门狗定时器的复位功能就不被启动,看门狗定时器能从CPU内核信号判断出当前CPU是否处于调试状态。如果看门狗定时器确定当前模式是调试模式,尽管看门狗产生溢出信号,但是仍然不会产生复位信号。
每个时钟周期都会将看门狗定时计数器WTCNT里的值减1,当计数器WTCNT里的值变为0时开始执行超时操作。
首先,判断看门狗控制寄存器里bit2 WTCON[2]设置情况, 如果为1则产生中断信号,引起系统中断, 如果为0不做任何操作,进入复位信号产生器,如果WTCON[0]位为1,则产生控制器复位信号,否则不做任何操作。每次超时操作之后,看门狗WTCON会自动加载看门狗数据寄存器WTDAT里的用户设置值,继续执行递减操作。
二、寄存器设置
1)看门狗定时器控制寄存器(WTCON)
WTCON寄存器的内容包括:
-
WDT timer:[5] 用户是否启动看门狗定时器、
-
Clock select:[4:3] 4个分频比的选择、
-
Interrupt generation:[2] 是否允许中断产生、
-
Reset enable/disable: [0] 是否允许复位操作等。
1) 使用起看门狗功能 开启看门狗复位功能、允许中断、16分频、开启看门狗定时器、Prescaler value设置为249
WDT.WTCON = (249 << 8) | (1 << 5) | (1 << 2)|(1 << 0);
2)当普通定时器使用 如果用户想把看门狗定时当做一般定时器使用,应该中断使能,禁止看门狗定时器复位。
WDT.WTCON = (249 << 8) | (1 << 5) | (1 << 2);
2) 看门狗定时器数据寄存器(WTDAT)
WTDAT用于指定超时时间,在看门狗把复位功能禁止并打开中断使能后,此时看门狗定时器就是一个普通的定时器,使用方法和普通定时器一样。
当使用复位功能后,由于WTCNT的值减到0时,系统就会复位,所以WTDAT的值装不进看门狗计数寄存器(WTCNT)中。复位后初始值为0x8000。
3) 看门狗计数寄存器(WTCNT) 喂狗用
WTCNT包含看门狗定时器工作的时候,计数器的当前计数值。WTCNT描述如下:
4) WTCLRINT
写入任意值清中断。
三、看门狗定时器的程序编写
1、看门狗软件程序设计流程
因为看门狗是对系统地复位或中断的操作,所以不需要外围的硬件电路。要实现看门狗的功能,只需要对看门狗的寄存器组进行操作,即对看门狗的控制寄存器(WTCON)、看门狗数据寄存器(WTDAT)、看门狗计数寄存器(WTCNT)的操作。
「其一般流程如下:」
-
设置看门狗中断操作,包括全局中断和看门狗中断使能及看门狗中断向量的定义,如果只是进行复位操作,这一步不用设置。
-
对看门狗控制寄存器(WTCON)的设置,包括设置预分频比例因子、分频器的分频值,中断使能和复位使能等。
-
对看门狗数据寄存器(WTDAT)和看门狗计数寄存器(WTCNT)的设置。
-
启动看门狗定时器。
void do_irq(void)
{
static int a = 1;
int irq_num;
irq_num = CPU0.ICCIAR&0x3ff; //获取中断号
switch(irq_num)
{ case 75:
printf("in the WDT interrupt!\n");
//WDT.WTCNT = 25000;//喂狗
WDT.WTCLRINT = 0;
ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 11); //清GIC中断标志位
break;
}
CPU0.ICCEOIR = CPU0.ICCEOIR&(~(0x3ff))|irq_num; //清cpu中断标志位
}
void wdt_init(void)
{
WDT.WTCON = (249 << 8) | (1 << 5) | (1 << 2)|(1 << 0);//复位使能
//WDT.WTCON = (249 << 8) | (1 << 5) | (1 << 2); //关闭复位使能
WDT.WTDAT = 25000;
ICDDCR = 1; //使能分配器
ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 11); //使能相应中断到分配器
ICDIPTR.ICDIPTR18 = ICDIPTR.ICDIPTR18 & (~(0xff << 24))|(0x1 << 24); //选择CPU接口
CPU0.ICCPMR = 255; //中断屏蔽优先级
CPU0.ICCICR = 1; //使能中断到CPU
}
int main (void)
{
wdt_init();
printf("hello reset!\n");
while(1)
{
WDT.WTCNT = 25000;//喂狗,如果一旦停止喂狗,系统就reset
mydelay_ms(100);
}
return 0;
}
上述是正确运行的代码,将WDT.WTCNT = 25000; 注释掉,就会停止喂狗,超时后系统就会reset。
推荐阅读
进群,请加一口君个人微信,带你嵌入式入门进阶。
在公众号内回复「 1024 」,即可免费获取学习资料, 期待你的关注~