单片机的看门狗

合集下载

ST单片机:独立看门狗和窗口看门狗

ST单片机:独立看门狗和窗口看门狗

ST单片机:独立看门狗和窗口看门狗
STM32单片机中有两只看门狗,分别是独立看门狗和窗口看门狗。

这两只看门狗有什么区别,今天来看一下。

1. 时钟源的区别
▪独立看门狗使用的是内部低速时钟,其频率为40kHz,但是这个40KHz不是准确的,其大致的范围是(30-60)KHz。

该时钟与外设时钟无关,所以不受系统晶振影响。

▪窗口看门狗使用的是PCLK1的时钟,该时钟与晶振相关。

2. 喂狗时间不同
▪独立看门狗喂狗时只要下限大于0就可以,上限是0XFFF。

而窗口看门狗必须在一个区域内喂狗才可以,上限是0x7F,下限是0X40,
3. 计数器不同
▪独立看门狗的计数器是12位递减的,即最大值是0XFFF;
▪窗口看门狗的计数器是7位递减的,即最大值是0X7F;
4. 产生结果不同
▪独立看门狗时,如果超时不喂狗,则直接产生复位,程序从头执行;
▪独立看门狗会在计数器到达0X40时产生中断,在0X3F时产生复位,所以可以把独立看门狗看成是一种中断。

使用用途举例
▪独立看门狗可以用来防止程序跑飞,在程序中开启看门狗,定时喂狗,尤其在通讯中使用广泛,当逻辑处理不当,使程序一直处于发送或接收状态不退出时,这时独立看门狗可以使程序复位,程序从头执行。

▪窗口看门狗可以产生中断,利用这一特点可以用来进行数据保存,当产生窗口看门狗中断时,可以用来保存数据。

单片机看门狗的描述

单片机看门狗的描述

单片机看门狗的描述下面是关于STC89C5XX-51 单片机看门狗的描述WDT_CONTR 位置0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0]EN_WDT: 看门狗允许位,置1 启动看门狗,看门狗不能自动启动,需要设置该位后启动,一旦启动不能关闭(只能系统重新上电和看门狗复位可以关闭)CLR_WDT: 看门狗计数器清零位,置1 清零看门狗计数器,当计数器开始重新计数,硬件清零该位。

IDLE_WDT: 单片机IDLE 模式看门狗允许位,当IDLE_WDT=1 时,单片机在IDLE 模式(空闲模式)依然启用看门狗PS2~PS0: 看门狗定时器预分频器,下表中Prescale 表示预分频数PS2 PS1 PS0 Prescale0 0 0 20 0 1 40 1 0 80 1 1 161 0 0 321 0 1 641 1 0 1281 1 1256看门狗溢出时间:(N*Prescale*32768)/晶振频率,其中N 表示指令周期数N=12 表示12 时钟周期模式;N=6 表示6 时钟周期模式。

如N=12,晶振频率为12MHz,PS2~PS0 为100 时,溢出时间=(12*32*32768)/12=1048576us,差不多是1s。

例如:给WDT_CONTR 写入0 乘以34,即是激活看门狗,同时预分频数设为32。

喂狗过程也是一样的。

顺便说一下ATMEL-51 单片机的看门狗下面是关于ATMEL-51 单片机看门狗的描述【看门狗计数器】(watchdog timer)是一个14 位的计数器,它以机器周期(晶振频率/12)增加,当计数值计满(16383/0 乘以3FFF)了就使单片机软复位;当启动了【看门狗计数器】之后,我们需要在它计数没有满之前复位计数器强制。

单片机的看门狗

单片机的看门狗

引言概述:
单片机的看门狗(二)是在第一篇文章中讨论的单片机看门狗的延伸,本文将深入探讨单片机看门狗的使用场景、工作原理、设置参数、使用注意事项以及常见问题等方面的内容。

单片机看门狗是一种重要的硬件设备,在系统稳定性和可靠性方面起到关键作用,因此了解和掌握单片机看门狗的相关知识是非常有必要的。

正文内容:
一、单片机看门狗的使用场景
1.1实时系统
1.2长时间运行的设备
1.3类似于操作系统的应用
二、单片机看门狗的工作原理
2.1看门狗定时器
2.2看门狗计数器
2.3看门狗复位信号
三、单片机看门狗的设置参数
3.1看门狗定时器的预分频和计数器
3.2看门狗复位信号的触发条件
3.3看门狗溢出时间的设置
四、单片机看门狗的使用注意事项
4.1错误的看门狗设置
4.2看门狗溢出时间过短
4.3看门狗溢出时间过长
五、单片机看门狗的常见问题及解决方法
5.1看门狗复位问题
5.2看门狗延时问题
5.3看门狗定时器设置问题
总结:
单片机看门狗是一项重要的硬件设备,它在保证系统稳定性和可靠性方面起到关键作用。

本文从使用场景、工作原理、设置参数、使用注意事项以及常见问题等方面深入探讨了单片机看门狗的相关知识。

在实际应用中,我们应该根据具体情况,合理设置单片机看门狗的参数,避免错误的配置导致系统异常。

同时,我们也要注意单片机看门狗的溢出时间,不要设置过短或过长,以免影响系统的正常运行。

通过深入了解和掌握单片机看门狗的相关知识,我们可以更好地应用它,提高系统的稳定性和可靠性。

AVR单片机看门狗实验报告2013v1(有不同)

AVR单片机看门狗实验报告2013v1(有不同)
void watchdog_on(void) { WDTCR = 0x0F; // WDTCR |=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0); }
void watchdog_off(void)
{ /* Write logical one to WDTOE and WDE
这里严格要求这样的顺序*/
WDTCR = (1<<WDTOE) | (1<<WDE); /* Turn off WDT 这里严格要求这样的顺序*/
WDTCR = 0x00;
}
void Delay(void) { unsigned char i,j; for(i=200;i>0;i--)
{ for(j=100;j>0;j--); WDR(); //这里喂狗不然超过时间了
BIT 2、1、0 这三位设置看门狗溢出的间隔,在设置好的时间内不喂狗,就重启。
二、 具体例子(基于 ICCAVR7.22)
A、 打开和配置看门狗为最大时间间隔 2.2s void watchdog_on(void) { WDTCR |=(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0); }
{ } }
4.2 加入看门狗后
//ICC-AVR application builder : 2013-9-23 9:24:33 // Target : M16 // Crystal: 4.0000Mhz
#include <iom16v.h> #include <macros.h>
void port_init(void) { PORTD = 0x00; DDRD = 0xff; }

单片机看门狗(Watchdog)的工作原理及其应用

单片机看门狗(Watchdog)的工作原理及其应用

单片机看门狗(Watchdog)的工作原理及其应用2010年05月16日星期日 23:00在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环。

程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果。

所以,出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog)。

看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行。

这个时候,看门狗电路就会由于得不到单片机送来的信号。

便在它和单片机复位引脚相连的引脚上送出一个复位信号。

使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。

看门狗,又叫 watchdog timer,是一个定时器电路。

一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU 正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT 清零。

如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,是MCU复位,防止MCU死机。

看门狗的作用就是防止程序发生死循环,或者说程序跑飞。

工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。

所以,在使用有看门狗的芯片时要注意清看门狗。

51单片机的看门狗

51单片机的看门狗

“看门狗”概念及其应用在由单片机构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程序的正常运行被打断,由单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watch dog)。

加入看门狗电路的目的是使单片机可以在无人状态下实现连续工作,其工作过程如下:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过单片机的程序控制,使它定时地往看门狗芯片的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,给看门狗引脚送电平的程序便不能被执行到,这时,看门狗电路就会由于得不到单片机送来的信号,便将它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,从而单片机将从程序存储器的起始位置重新开始执行程序,这样便实现了单片机的自动复位。

通常看门狗电路需要一个专门的看门狗芯片连接单片机来实现,不过这样会给电路设计带来复杂,STC单片机内部自带有看门狗,通过对相应特殊功能寄存器的设置就可实现看门狗的应用,STC89系列单片机内部有一个专门的看门狗定时器寄存器,Watch Dog Timer 寄存器,其相应功能见下个知识点。

看门狗定时器寄存器(WDT_CONTR)STC单片机看门狗定时器寄存器在特殊功能寄存器中的字节地址为E1H,不能位寻址,该寄存器用来管理STC单片机的看门狗控制部分,包括启停看门狗、设置看门狗溢出时间等。

单片机复位时该寄存器不一定全部被清0,在STC下载程序软件界面上可设置复位关看门狗或只有停电关看门狗的选择,大家根据需要可做出适合自己设计系统的选择。

其各位的定义如表4.2.1所示。

表1看门狗定时器寄存器(WDT_CONTR)EN_WDT:看门狗允许位,当设置为“1”时,启动看门狗。

STC系列单片机看门狗

STC系列单片机看门狗
(不要问我为什么,他们就是这么设计的,我 们就这么用就行)。
其中N是单片机的时钟周期,STC89C5X系列单 片机提供6时钟周期和12时钟周期两种时钟周 期,可以在烧写程序时修改;
Prescale是预分频数,通过设置【看门狗控制 寄存器】可以设置为2、4、8、16、32、64、 128、256;怎么设置演示程序中有介绍;
次,用于判断系统是否重启

i=0;

while(str[i]!='\];

while(TI==0);

TI=0;

i++;

}
//while大循环

while(true)

{

//约每隔800ms喂一次狗,可以通过调整这里的喂
狗时间来验证看门狗是否有效

//我们设置的看门狗约1秒。所以可以用800和2000
{

//初始化时两盏灯都熄灭

LED=1;

LED_busy=1;

TMOD=0x21;
//定时器0工作在方式1,作
为16位定时器;定时器1工作在方式2,作为串行口波特率发生器

TH0=0x4C;
50ms溢出一次
//定时器0装初值:每隔

TL0=0x00;

IE=0x82;
时器0中断
//IE=(1000 0010)B, 使能定

TR0=1;
//启动定时器0
}
//串行口初始化程序
void InitCOM()
{
SCON=0x50;
//SCON=(0101
0000)B,波特率不加倍,允许接收

MSP430单片机看门狗的使用

MSP430单片机看门狗的使用

MSP430单片机看门狗的使用
1、看门狗有三种工作模式:停止模式,计时器模式,看门狗模式。

2、其中后两种模式可以选择的时钟源有:SMCLK 和ACLK。

3、使用后两种模式时要注意单片机所处的状态下看门狗能否工作,如单片
机处在LPM3 时只有ACLK 时钟,处在LPM4 下,没有时钟可以使用。

4、看门狗模式的使用方法
当看门狗计数溢出时,程序复位。

在程序中开启看门狗,在计数溢出前清空看门狗,或重置看门狗,以使其重新计数。

若程序跑飞,看门狗可能没有被清空或重置,就会溢出,使程序复位。

5、MSP430F2274 中,看门狗模式下可以计时最长为1s,若需要以更长的时间复位,可采取的方法,使用其他计数器,计数满后执行((void(*)())
RESET_VECTOR)();或计数满后往看门狗控制寄存器写个错误值或执行一条无效命令:如((void(*)())0x170)();0x170 是外围模块的一个地址,不可能是一个函数地址,所以执行此句将使程序复位。

6、看门狗的具体使用
6.1、停止模式:关闭看门狗
C 语言实现:WDTCTL = WDTPW + WDTHOLD
6.2、计时器模式:作为一个计时器使用,计数器满产生中断时执行看门狗中断函数。

C 语言实现:
主程序中开启看门狗计时器,如:WDTCTL = WDT_MDLY_8;
看门狗中断函数为:
#pragmavector=WDT_VECTOR。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。



//延时函数,11.0592MHz晶振下延时约xms毫 秒 void delay_ms(unsigned xms) { unsigned x,y; for(x=xms; x>0; x--) for(y=110; y>0; y--); }



//主程序初始化函数 void InitMain() { //初始化时两盏灯都熄灭 LED=1; LED_busy=1; TMOD=0x21; //定时器0工作在方式1,作 为16位定时器;定时器1工作在方式2,作为串行口波特率发生器 TH0=0x4C; //定时器0装初值:每隔 50ms溢出一次 TL0=0x00; IE=0x82; //IE=(1000 0010)B, 使能定 时器0中断 TR0=1; //启动定时器0 }

举个例子说:8051 单片机选用12MHz晶振, 一个时钟周期为1us,如果“看门狗计数器” 是16位的,最大计数65536个,那么从0开始 计到65535需要约65ms,所以我们可以在程序 的50ms左右清零一次计数器(“喂狗”), 让他重新从0开始计,再过50ms,再清,……, 这样下去只要程序正常运行,计数器永远不会 计满,也就永远不会被“看门狗”复位。
单片机的看门狗
-S51及STC89系列
为什么要看门狗?

你家的看门狗是做什么的?

“看门狗定时器”是这样一种东西,从功能上 说它可以让微控制器在意外状况下(比如软件 陷入死循环或跑飞)重新回复到系统上电状态, 以保证系统出问题的时候重启一次。

就跟我们现在用电脑一样,死机了你就按一下 reset键重启一次电脑,看门狗就是负责干这个 事儿的。它是52单片机增加的一个功能,以前 Intel 8031、……、AT 89C51时代单片机片内 都没有“看门狗”功能,需要我们外扩看门狗 芯片,比如X5045。
S51的看门狗

AT89S52单片机看门狗定时器是14位的,最大 计数214=16384个数,每计16384个时钟周期 就溢出一次。也就是说如果使用12M晶振的话, 至少应该在16.384ms内喂一次狗。
STC89


STC89C5X系列单片机由于采用了“预分频技 术”,它的溢出时间是=(N*Prescale*32768)/ 晶振频率 (不要问我为什么,他们就是这么设计的,我 们就这么用就行)。
/定时器0中断服务程序程序,控制信号灯闪烁。如果系统正常运行,信号灯1.5秒 闪一次 void Timer0_isr() interrupt 1 { TH0=0x4C; TL0=0x00; timer0_ctr++; if(timer0_ctr>=30) { TR0=0; timer0_ctr=0; LED=0; delay_ms(100); LED=1; TR0=1; }



其中N是单片机的时钟周期,STC89C5X系列单 片机提供6时钟周期和12时钟周期两种时钟周 期,可以在烧写程序时修改; Prescale是预分频数,通过设置【看门狗控制 寄存器】可以设置为2、4、8、16、32、64、 128、256;怎么设置演示程序中有介绍; 晶振频率就是系统选用的晶振。
STC看门狗应用举例
STC89C52最小单片机系统+两个指示灯
串行口接口(用于下载程序和测试本次试验




关于实验的注意事项: 1. 本次试验使用的是11.0592MHz晶振,设置 WDT_CONTR=(0011 0100)B,32预分频,单片机使 用12指令周期模式。 计算看门狗溢出时间: [12*32*32768/(11059200)]≈1s。 2. 本次试验的硬件电路很简单,就是最小系统上增 加两个LED灯,原理图见正文,用户可以很容易实现。 ****************************************** *********************************/




//串行口初始化程序 void InitCOM() { SCON=0x50; //SCON=(0101 0000)B,波特率不加倍,允许接收 TH1=0xFD; //设置波特率 =9600bps TL1=TH1; TR1=1; //启动定时器1 }



//while大循环 while(true) { //约每隔800ms喂一次狗,可以通过调整这里的喂 狗时间来验证看门狗是否有效 //我们设置的看门狗约1秒。所以可以用800和2000 分别做一次试验,看是否会被看门狗复位 delay_ms(800); LED_busy=0; //第一次上电约延时 800ms工作灯点亮,如果系统不重启,他将一直亮着,用于指 示系统是否重启 WEIGOU; } }

“看门狗”就是一个计数器,由于位数有限计 数器能够装的数值是有限的(比如8位的最多装 256个数、16位的最多装65536个数),从开 启“看门狗”那刻起,它就开始不停的数机器 周期,数一个机器周期就计数器加1,加到计 数器盛不下了(术语叫溢出)就就产生一个复 位信号,重启系统。
注解:

这里顺便说一下,一般教材上叫“看门狗定时 器”,其实定时器原理还是计数器,只是计的 是时钟周期,所以我为了初学者好理解叫统一 叫“计数器”,这里阐明一下。

所以如果同样选择12MHz晶振,使用传统的12 时钟周期,它最小的溢出时间是 (12*2*32768)/(12*106)=65.536ms,最大 溢出时间是(12*256*32768) /(12*106)≈8.38s。如果选择256分频,也就是 说只要在8.38秒之内喂一次狗就可以了。

对于我们用户来说,看门狗的时间是越长越好, 这样可以节省更多的单片机资源,尤其是对时 间要求精准的系统,如果执行过程中我们不停 地“喂狗”,那么是比较浪费时间的。所以 STC89C5X系列单片机的看门狗更有优势一些。 当然这个也是个人的选择,如果对时间要求的 不苛刻的话,勤喂几次狗也没关系。
注意事项:



1. 89S51的看门狗必须由程序激活后才开始 工作。所以必须保证CPU有可靠的上电复位。 否则看门狗也无法工作。 2. 看门狗使用的是CPU的晶振。在晶振停振 的时候看门狗也无效。 3. 89S51只有14位计数器。在16383个机器 周期内必须至少喂狗一次。而且这个时间是固 定的,无法更改。当晶振为12M时每16个毫秒 需喂狗一次。
//定时器0暂停,否则再次来中断会冲断程序
//定时器0重新启动
}

void main() { WEIGOU; 门狗定时器,并且启动 InitMain(); InitCOM();
//上来第一步设置看

//开机通过串口发送一次“I love MCU!”,使用串口调试助手可以查看 //由于在while大循环外边,所以只要系统不重新启动,则上电后只会发送一 次,用于判断系统是否重启 i=0; while(str[i]!='\0') { SBUF=str[i]; while(TI==0); TI=0; i++; }
看门狗的看门原理


我们在设计程序时,先根据看门狗计数器的位 数和系统的时钟周期算一下计满数需要的时间, 就是说在这个时间内“看门狗”计数器是不会 装满的,然后在这个时间内告诉它重新开始计 数,就是把计数器清零,这个过程叫“喂狗”, 这样隔一段时间喂一次狗,只要程序正常运行 他就永远计不满,一旦出现死循环之类的故障, 没有及时来清零计数器,就会导致装满了溢出, 他就重启系统,这就是

每种单片机的“看门狗”实现方法不尽相同, 但是原理都一样,而且“看门狗”都是启动了 之后就不能被关闭,只能系统复位(重新断电 在上电)才能关闭。
设置“看门狗”的一般步骤如 下:

1. 设置“看门狗”相关寄存器, 启动 “看门狗”; 2. 隔一段时间清零一次,“喂狗”; 3. 如果程序正常,一直运行;如果程序出 错,没有按时“喂狗”,“看门狗”就在溢出 的时候复位系统。
89S51的看门狗应用


在C语言中要增加一个声明语句。 在AT89X51.h声明文件中增加一行 sfr T = 0xA6; 程序代码 sfr WDTRST = 0xA6; main() { WDTRST=0x1E; WDTRST=0xE1;//初始化看门狗。




While (1) { WDTRST=0x1E; WDTRST=0xE1;//喂狗指令 } }


#include <Reg52.H> sfr WDT_CONTR=0xE1; //定义特殊 功能寄存器:STC单片机看门狗控制寄存器 #define uchar unsigned char #define true 1 #define false 0 #define WEIGOU WDT_CONTR=0x34 //看门狗启动设置 和“喂狗”操作 sbit LED=P1^6; //信号灯, 系统正常工作就一闪一闪的 sbit LED_busy=P1^7; //工作灯, 上电灭一会儿(约800ms),然后正常工作的时候一直亮着;用于指示系 统是否重启 uchar timer0_ctr,i; const uchar str[]="I love MCU!"; //定义一句话,让他从串口输出,只 有系统重启的时候才输出一次,所以也是用于验证看门狗有没有重启系统
89S52看门狗使用方法



在ATMEL的89S52系列的89S52与89C51功能相 同。指令兼容。HEX程序无需任何转换可以直 接使用。89S52比89C51增加了一个看门狗功 能。89S52的其它功能可以参见89C52的资料。 看门狗具体使用方法如下: 在程序初始化中向看门狗寄存器 (WDTRST地址是0A6H)中先写入01EH,再 写入0E1H。即可激活看门狗。
相关文档
最新文档