看门狗定时器内部有一个递减计数器,当该计数器递减为0的时候,就会自动重启控制器(如下图所示),如果我们写有这样的程序,该程序在定时器计数器递减为0之前,将其递减计数器重新设置一下(喂狗),那么就不会产生重启操作。假如机器设备出现异常情况下如死机,CPU执行出错,程序跑飞等情况,CPU就会陷入非正常的执行流程,就不会去执行重置计数器的程序,当计数器递减为0时,会产生复位控制器信号,机器就会重新启动,恢复正常执行流程。这样的设计原理就解决了很多环境恶劣的情况下,对服务器进行重启的任务。上面的重置倒计数的操作通常叫做“喂狗”。
图2-42看门狗定时器
(1)用于解决远程控制器在出现电磁干扰,噪声,系统错误等外界条件造成的系统死机等不正常运行的问题
(2)它不仅可以产生复位信号,还可以通过设置,产生定时的中断信号
看门狗定时器从单片机时代就开始广泛使用,是嵌入式产品中的一大特色,很明显上述用途如果我们都用不到,就没有必要打开看门狗的功能,在miniOS操作系统里我们不使用它来定时产生中断,也不用它来自动重启异常的开发板(因为出现异常的可能性几乎可以忽略),因为实现miniOs的第一步就是关闭看门狗,在开始裸板驱动之前,先来了解S3C2440 看门狗定时器。
图2-43 S3C2440看门狗定时器工作原理
名词解释:
PCLK(Peripherals Clock): APB(Advanced Peripherals Bus)高级外围设备总线上外设的工作时钟频率,它主要为开发板上的外围低速设备提供工作时钟,如串口,I2C等,
8-bit Prescaler:8位分频器,由程序来控制对PCLK进行分频,它由WTCON寄存器来控制设置。
MUX:多路复合器,它支持多种时钟源,通过设置它来选择一种时钟频率,看门狗控制器里会产生四种时钟频率,分别是1/16,1/32,1/64,1/128的已分频时钟,可以通过WTCON寄存器第3,4位进行选择设置。
WTCNT:看门狗递减寄存器,一旦看门狗使能,WTCNT里的数据(由WTDAT寄存器在使能之前设置)就开始在输入时钟频率下递减。
Interrupt:中断信号,由WTCON寄存器的第2位控制是否产生中断信号。
Reset Signal Generator:Reset信号产生器,默认情况下当递减寄存器里的倒计数为0时,会产生通过Reset信号产生器产生Reset信号,让控制器重启,可以由WTCON寄存器的第0位进行设置。
当看门狗使能时,外围时钟PCLK为看门狗定时器的输入时钟,MINI2440在没有开启时钟时,采用外部晶振(又叫高频振荡器,它每秒钟产生固定频率时钟)提供的12MHz输入时钟频率,PCLK首先进入8位分频器Prescaler,其对PCLK进行分频,可以理解为对PCLK的除法运算,这样PCLK的时钟频率就变成PCLK/Prescaler value,其中分频器Prescaler的值可以在一定范围内自定义,然后经过分频的时钟经过除数因子选择器,这是在分频器的基础上再次对时钟信号进行降频,通过除数因子选择器,选择一个除数因子,然后经过MUX复合器,这时输入时钟变成PCLK/ Prescaler value/除数因子,得到我们想要的输入时钟, 每个时钟周期都会将看门狗定时计数器WTCNT里的值减1,当计数器WTCNT里的值变为0时开始执行超时操作,首先,判断看门狗控制寄存器里bit2 WTCON[2]设置情况,如果为1则产生中断信号,引起系统中断,如果为0不做任何操作,进入复位信号产生器,如果WTCON[0]位为1,则产生控制器复位信号,否则不做任何操作。每次超时操作之后,看门狗WTCON会自动加载看门狗数据寄存器WTDAT里的用户设置值,继续执行递减操作。
表2-5看门狗定时器控制寄存器 (WTCON)
寄存器名 | 地址 | 是否读写 | 描述 | 复位默认值 |
WTCON | 0X53000000 | R/W | 看门狗定时器控制寄存器 | 0x8021 |
WTCON | 位 | 描述 | 初始值 |
Prescaler value | [15:8] | 8位分频器预设值,有效范围0~255(28 - 1) | 0x80 |
Reserved | [7:6] | 保留,正常情况下必须为00 | 00 |
Watchdog timer | [5] | 看门狗定时器使能位 0 = 无效,1 = 有效 | 1 |
Clock select | [4:3] | 选择除数因子来决定输入时钟 00 = 16,01 = 32 10 = 64,11 = 128 | 00 |
Interrupt generation | [2] | 中断使能位 0 = 无效,1 = 有效 | 0 |
Reserved | [1] | 保留,正常情况下该位必须为0 | 0 |
Reset enable/disable | [0] | 复位使能位 1:看门狗定时器超时,发出CPU复位信号 0:看门狗定时器复位无效 | 1 |
表2-6看门狗定时器数据寄存器 (WTDAT)
寄存器名 | 地址 | 是否读写 | 描述 | 复位默认值 |
WTDAT | 0x53000004 | R/W | 看门狗定时器数据寄存器 | 0x8000 |
WTDAT | 位 | 描述 | 初始值 |
Count Reload value | [15:0] | 该值在超时后,自动载入计数寄存器 | 0x8000 |
注:WTDAT寄存器用于指定计数寄存器的初始值,也就是它的超时时间,系统上电之后硬件自动的将0x8000的初始值载入到WTCNT里,在发生了第一次超时操作时,WTDAT的值才会载入到WTCNT寄存器。
表2-7看门狗定时器计数寄存器 (WTCNT)
寄存器名 | 地址 | 是否读写 | 描述 | 复位默认值 |
WTCNT | 0x53000008 | R/W | 看门狗定时器计数寄存器 | 0x8000 |
WTCNT | 位 | 描述 | 初始值 |
Count value | [15:0] | 看门狗定时器的当前计数值 | 0x8000 |
通过对上面寄存器描述分析,可以得出以下结论:
l 通过设置WTCON[5]来设置看门狗定时器的使能
l 在开启看门狗定时器后,通过设置WTCON[15:8]和[4:3]位来设置看门狗控制器的工作时钟频率,具体看门狗的递减时间间隔可以通过下面的公式算出:
t_watchdog = 1/( PCLK / (Prescaler value + 1) / Division_factor )
注: t_watchdog:看门狗控制器递减时间间隔(单位秒)
PCLK:APB总线工作时钟(单位Hz)
Prescaler value: 8位分频器预设值
Division_factor:除数因子
l 通过设置WTCON[2] 和WTCON[0]位,来使能产生中断和复位信号
l 通过设置WTDAT来设置计数值