关于STC15F2K60S2看门狗的应用
1.STC15F2K60S2系列单片机的内部结构图
STC15F2K60S2系列单片机的内部结构框图如下图所示,STC15F2K60S2系列单片机中包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时器、IO口、高速A/D转换、看门狗、UART高速异步串行通信口1/串行通信口2,CCP/PWM/PCA,一组高速同步串行端口SPI,片内高精度R/C时钟及高可靠复位等模块,STC15F2K60S2系列单片机几乎包含了数据采集和控制中的所有单元模块。
2.目的:
在工业控制/汽车电子/航空航天等需要高可靠行的系统中,为了防止“系统在异常情况下,受到干扰,MCU/CPU程序跑飞,导致系统长时间异常工作”,通常是引进看门狗,如果MCU/CPU不在规定的时间内按要求访问看门狗,就认为MCU/CPU处于异常状态,看门狗就会强迫MCU/CPU复位,使系统重新从头开始按规律执行用户程序。看门狗复位状态结束后,不影响特殊功能寄存器IAP_ONTR中SWBS/IAP_ONTR.6位的值,单片机根据复位前SWBS/IAP_ONTR.6的值选择是从用户应用程序区启动,还是从系统ISP监控程序区启动。如果看门狗复位前SWBS/IAP_ONTR.6的值为0,则看门口复位状态结束后单片机从系统ISP监控程序区启动。看门狗复位是热启动复位中的软复位之一。
工作原理:看门狗实际上是一个定时器或计数器,简称WDT。单片机运行工作中,看门狗会对单片机机器周期脉冲不停计数,当单片机程序陷入死循环时,单片机程序如果不能及时对看门狗的定时器复位,看门狗就会在其定时器计满溢出时产生一个复位信号,从而使系统重启。
看门狗应用时,首先确定看门狗计数器的位数,然后参考计数脉冲周期计算出看门狗计数溢出所需的时间T,喂狗程序 喂狗时间要小于T,这样隔一段时间喂一次狗,只要程序正常运行,看门狗定时器就不会溢出。一旦出现程序死循环故障,喂狗程序失败,不能对看门狗定时器及时清零,就会导致计时器溢出,重启系统。
3.特殊寄存器:
STC15系列单片机内部也引进了此看门狗功能,使单片机系统可靠性设计变得更加方便/简洁。为此功能,我们增加如下特殊功能寄存器WDT_CONTR:
WDT_CONTR:看门狗(Watch—dog—Timer)控制寄存器
SFR name |
Address |
bit |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
WDT_CONTR |
0C1H |
name |
WDT_FLAG |
_ |
EN_WDT |
CLR_WDT |
IDLE_WDT |
PS2 |
PS1 |
PS0 |
WDT_FLAG: 看门狗溢出标志位,当溢出时,该位由硬件置1,可用软件将其清零。
EN_WDT: 看门狗允许位,当设置为“1”时看门狗启动。
CLR_WDT: 看门狗清“0”位,当设为“1”时,看门狗重新计数。硬件将自动清“0”此位。
IDLE_WDT: 看门狗“IDLE”模式位,当设置为“1”时,看门狗定时器在“空闲模式”计数,当清”0”该位时,看门狗定时器在“空闲模式”时不计数。
PS2,PS1,PS0:看门狗定时器分频值,如下表所示
PS2 |
PS1 |
PS0 |
Pre_scale预分频 |
WDT overflow Time @20MHz |
0 |
0 |
0 |
2 |
39.3ms |
0 |
0 |
1 |
4 |
78.6ms |
0 |
1 |
0 |
8 |
157.3ms |
0 |
1 |
1 |
16 |
314.6ms |
1 |
0 |
0 |
32 |
629.1ms |
1 |
0 |
1 |
64 |
1.25s |
1 |
1 |
0 |
128 |
2.5s |
1 |
1 |
1 |
256 |
5s |
看门狗溢出时间 = (12 *Pre—scale*32768)/Oscillatorfrequency
设时钟为12MHz
看门狗溢出时间 = (12 *Pre—scale*32768)/12000000= Pre—scale*393216/12000000
PS2 |
PS1 |
PS0 |
Pre_scale预分频 |
WDT overflow Time @12MHz |
0 |
0 |
0 |
2 |
65.5ms |
0 |
0 |
1 |
4 |
131.0ms |
0 |
1 |
0 |
8 |
262.1ms |
0 |
1 |
1 |
16 |
524.2ms |
1 |
0 |
0 |
32 |
1.0485s |
1 |
0 |
1 |
64 |
2.0971s |
1 |
1 |
0 |
128 |
4.1943s |
1 |
1 |
1 |
256 |
8.3886s |
设时钟为11.0592MHz
看门狗溢出时间 = (12 *Pre—scale*32768)/11059200 = Pre—scale*393216/11059200
PS2 |
PS1 |
PS0 |
Pre_scale预分频 |
WDT overflow Time @11.0592MHz |
0 |
0 |
0 |
2 |
71.1ms |
0 |
0 |
1 |
4 |
142.2ms |
0 |
1 |
0 |
8 |
284.4ms |
0 |
1 |
1 |
16 |
568.8ms |
1 |
0 |
0 |
32 |
1.1377s |
1 |
0 |
1 |
64 |
2.2755s |
1 |
1 |
0 |
128 |
4.5511s |
1 |
1 |
1 |
256 |
9.1022s |
4.程序:
用LED灯的亮表示程从头序运行,用延时函数改变两次喂狗时间间隔。
/****************************测试程序******************************/
#include
sbit led = P0^0;
sfr WDT_CONTR = 0xel;/*定义STC单片机中新加入的看门狗程序*/
void delay(unsigned int x)/*定义延时函数*/
{
while(x--);
}
void main(void)
{
WDT_CONTR = 0x35;/*设置模式计数器值*/
led = 1;
delay(20000);
led = 0;
while(1)
{
WDT_CONTR = 0x35;
delay(50000);
}
}
(1)程序开始后,点亮发光二极管后延时一段时间熄灭,延时不能过长,若两次喂狗时间间程序运行时间大于看门狗溢出时间,看门狗将复位单片机,可调节这个时间,让看门狗是否复位。
(2)喂狗时使用和设定看门狗寄存器同样的语句,只要看门狗寄存器中CLR—WDT位置“1”,看门狗定时器重新计数,由硬件自动将其清零。
(3)演示为发光二极管亮后熄灭不会再亮,这说明程序没被复位,while循环中看门狗被正常喂狗,若将WDT_CONTR= 0x35;去掉程序将会不停复位,因为看门狗定时器溢出复位。