看门狗与喂狗详解(转载只是为了查阅方便,若侵权,立删)

看门狗与喂狗详解(转载只是为了查阅⽅便,若侵权,⽴删)“定时器”是这样⼀种东西,从功能上说它可以让微控制器在意外状况下(⽐如软件陷⼊死循环)重新回复到系统上电状态,以保证系统出问题的时候重启⼀次。就跟我们现在⽤电脑⼀样,死机了你就按⼀下reset键重启⼀次电脑,看门狗就是负责⼲这个事⼉的。它是52增加的⼀个功能,以前Intel 8031、……、AT 89C51时代单⽚机⽚内都没有“看门狗”功能,需要我们外扩看门狗芯⽚,⽐如X5045。
  很多⼈初次接触不太理解怎么⽤,书上也讲的含含糊糊,故意说的很复杂很⽞妙(可能是现在写书⼈的通病,⽣怕写的简单的别⼈觉得他没⽔平)。其实要是说明⽩点:“看门狗”就是⼀个计数器,由于位数有限计数器能够装的数值是有限的(⽐如8位的最多装256个数、16位的最多装65536个数),从开启“看门狗”那刻起,它就开始不停的数机器周期,数⼀个机器周期就计数器加1,加到计数器盛不下了(术语叫溢出)就就产⽣⼀个复位信号,重启系统。
  注解:这⾥顺便说⼀下,⼀般教材上叫“看门狗定时器”,其实定时器还是计数器,只是计的是时钟周期,所以我为了初学者好理解叫统⼀叫“计数器”,这⾥阐明⼀下。
  明⽩了上⾯的原理,我们在设计程序时,先根据看门狗计数器的位数和系统的时钟周期算⼀下计满数需要的时间,就是说在这个时间海藻苏打水
内“看门狗”计数器是不会装满的,然后在这个时间内告诉它重新开始计数,就是把计数器清零,这个过
程叫“喂狗”,这样隔⼀段时间喂⼀次狗,只要程序正常运⾏他就永远计不满,⼀旦出现死循环之类的故障,没有及时来清零计数器,就会导致装满了溢出,他就重启系统,这就是看门狗的看门原理,其实想想傻傻的、笨笨的。
  举个例⼦说:8051 单⽚机选⽤12MHz晶振,⼀个时钟周期为1us,如果“看门狗计数器”是16位的,最⼤计数65536个,那么从0开始计到65535需要约65ms,所以我们可以在程序的50ms左右清零⼀次计数器(“喂狗”),让他重新从0开始计,再过50ms,再清,……,这样下去只要程序正常运⾏,计数器永远不会计满,也就永远不会被“看门狗”复位。当然这个喂狗的时间是⼤家⾃⼰选的,只要不超过65ms,你选多少都可以,⼀般不要喂得太勤,这样单⽚机运⾏时间浪费了,⽐如你1ms喂⼀次就太勤了,也不要说那我65ms喂⼀次,这样太边缘,这样抗⼲扰能⼒就下降了,最好是留⼀定的余量,这个就是设计者⾃⼰掌握了,我⼀般是让计到90%左右就清⼀次。
  每种单⽚机的“看门狗”实现⽅法不尽相同,但是原理都⼀样,⽽且“看门狗”都是启动了之后就不能被关闭,只能系统复位(重新断电在上电)才能关闭。设置“看门狗”的⼀般步骤如下:
  1. 设置“看门狗”相关寄存器, 启动“看门狗”;
  2.  隔⼀段时间清零⼀次,“喂狗”;
  3. 如果程序正常,⼀直运⾏;如果程序出错,没有按时“喂狗”,“看门狗”就在溢出的时候复位系统。
值得提⼀下:
  由于现在AT89S52应⽤⽐较⼴泛,所以我先说说ATMEL的看门狗;再说说本次试验⽤的STC89C52RC的看门狗;注意两个不⼀
  AT89S52单⽚机看门狗定时器是14位的,最⼤计数214=16384个数,每计16384个时钟周期就溢出⼀次。也就是说如果使⽤12M 晶振的话,⾄少应该在16.384ms内喂⼀次狗。
  STC89C5X系列单⽚机由于采⽤了“预分频技术”,它的溢出时间是=(N*Prescale*32768)/晶振频率(不要问我为什么,他们就是这么设计的,我们就这么⽤就⾏)。
其中N是单⽚机的时钟周期,STC89C5X系列单⽚机提供6时钟周期和12时钟周期两种时钟周期,可以在烧写程序时修改;
Prescale是预分频数,通过设置【看门狗控制寄存器】可以设置为2、4、8、16、32、64、128、256;怎么设置演⽰程序中有介绍;
空气过滤材料晶振频率就是系统选⽤的晶振。
  所以如果同样选择12MHz晶振,使⽤传统的12时钟周期,它最⼩的溢出时间是(12*2*32768)/(12*106)=65.536ms,最⼤溢出时间是(12*256*32768)/(12*106)≈8.38s。如果选择256分频,也就是说只要在8.38秒之内喂⼀次狗就可以了。戏谑的说:这只狗⽐较抗饿,J~~
  对于我们⽤户来说,看门狗的时间是越长越好,这样可以节省更多的单⽚机资源,尤其是对时间要求精准的系统,如果执⾏过程中我们不停地“喂狗”,那么是⽐较浪费时间的。所以STC89C5X系列单⽚机的看门狗更有优势⼀些。当然这个也是个⼈的选择,如果对时间要求的不苛刻的话,勤喂⼏次狗也没关系。
绗缝被
  下⾯我就以STC89C52RC单⽚机为例说说典型的51单⽚机的看门狗程序如何写,关于STC89C52RC单⽚机的“看门狗”定义请
看STC89C51RC-RD单⽚机使⽤说明。以下程序在Keil 2和Keil 3下调时通过,下载在本校的实验板上达到预期效果。
STC89C52RC/54RD+/58RD+/516RD+单⽚机上测试正常运⾏。
  如果没有我们的实验板,请按照下⾯的硬件原理图⾃⼰在最⼩系统上搭建⼀个实验环境也很容易。
图1. STC89C52最⼩单⽚机系统+两个指⽰灯
图2. 串⾏⼝接⼝(⽤于下载程序和测试本次试验)
view sourceprint?
001/***************************************************************************
002程序功能:本程序演⽰STC51单⽚机看门狗程序
003程序设计:燕⼭⼤学鲁信琼
004晶振选择:11.0592MHz, 如果晶振不匹配,请修改延时函数参数
005承接51单⽚机、PIC单⽚机程序、VB/VC++上位机程序、电⼦产品软硬件设计开发⼯作
006EMail: xqlu(at)ysu  QQ: 9790335
007
008由于现在AT89S52很流⾏,所以我先说说ATMEL的看门狗;再说说本次试验⽤的STC89C52RC的看门狗;注意两个不⼀样009
010★下⾯是关于ATMEL-51单⽚机看门狗的描述
01 1
【看门狗计数器】(watchdog timer)是⼀个14位的计数器,它以机器周期(晶振频率/12)增加,当计数值计满(16383/0x3FFF)了就使单⽚机软复位;
缓冲块
012当启动了【看门狗计数器】之后,我们需要在它计数没有满之前复位计数器强制它不能够溢出,这个过程称作喂狗。013
014"看门狗"原理:
01 5
1. 系统上电并不启动看门狗计数器,通过设置【看门狗重置寄存器(WDTRST SFR)】启动【看门狗计数器】,⼀般设置是给WDTRST写⼊0x1E和0xE1启动;
016  2. 【看门狗计数器】⼀旦启动不可停⽌,除⾮是硬件RST或者看门狗的软复位才能使其停⽌;017  3. 设计程序在适当的时间喂狗⼀次,使其不能计满,程序就能不间断执⾏;
01 8
4. 如果程序中出现死循环或者执⾏某⼀步超时,看门狗计数器就会计满溢出,(这个时候我们认为程序没有按照预定计划执⾏--程序跑飞),则复位系统。
019
020★下⾯是关于STC89C5XX-51单⽚机看门狗的描述
021WDT_CONTR位置0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0]
02 2
EN_WDT: 看门狗允许位,置1启动看门狗,看门狗不能⾃动启动,需要设置该位后启动,⼀旦启动不能关闭(只能系统重新上电和看门狗复位可以关闭)
023CLR_WDT:    看门狗计数器清零位,置1清零看门狗计数器,当计数器开始重新计数,硬件清零该位。
024IDLE_WDT:  单⽚机IDLE模式看门狗允许位,当IDLE_WDT=1时,单⽚机在IDLE模式(空闲模式)依然启⽤看门狗
025PS2~PS0:        看门狗定时器预分频器,下表中Prescale表⽰预分频数
026PS2    PS1    PS0    Prescale
0270      0      0      2
0280      0      1      4
0290      1      0      8
0300      1      1      16
031  1      0      0      32
032  1      0      1      64
033  1      1      0      128
034  1      1      1      256
035
036看门狗溢出时间:(N*Prescale*32768)/晶振频率,其中N表⽰指令周期数N=12表⽰12时钟周期模式;N=6表⽰6时钟周期模式037
038关于实验的注意事项:
039  1.  本次试验使⽤的是11.0592MHz晶振,设置WDT_CONTR=(0011 0100)B,32预分频,单⽚机使⽤12指令周期模式。
040计算看门狗溢出时间:[12*32*32768/(11059200)]≈1s。
041  2.  本次试验的硬件电路很简单,就是最⼩系统上增加两个LED灯,原理图见正⽂,⽤户可以很容易实现。
042***************************************************************************/
043#include
044sfr WDT_CONTR=0xE1;                //定义特殊功能寄存器:STC单⽚机看门狗控制寄存器家庭自制黄豆芽机
045#define uchar unsigned char
046#define true 1
047#define false 0
048#define WEIGOU WDT_CONTR=0x34      //看门狗启动设置和“喂狗”操作
049sbit LED=P1^6;                      //信号灯,系统正常⼯作就⼀闪⼀闪的
050sbit LED_busy=P1^7;                //⼯作灯,上电灭⼀会⼉(约800ms),然后正常⼯作的时候⼀直亮着;⽤于指⽰系统是否重启
051uchar timer0_ctr,i;
052const uchar str[]="I love MCU!";    //定义⼀句话,让他从串⼝输出,只有系统重启的时候才输出⼀次,所以也是⽤于验证看门狗有没有重启系统053
054/*************************************************************************/
055//延时函数,11.0592MHz晶振下延时约xms毫秒
056void delay_ms(unsigned xms)
057{
058    unsigned x,y;
059for(x=xms; x>0; x--)
060for(y=110; y>0; y--);
061}
062/*************************************************************************/
063
064/*************************************************************************/
065//主程序初始化函数
066void InitMain()
067{
068//初始化时两盏灯都熄灭
069    LED=1;
070    LED_busy=1;
071
072    TMOD=0x21;              //定时器0⼯作在⽅式1,作为16位定时器;定时器1⼯作在⽅式2,作为串⾏⼝波特率发⽣器073    TH0=0x4C;              //定时器0装初值:每隔50ms溢出⼀次
074    TL0=0x00;无人机首推北京天宇创通
075    IE=0x82;                //IE=(1000 0010)B, 使能定时器0中断
076    TR0=1;                  //启动定时器0
077}
078/*************************************************************************/
079
080/*************************************************************************/
081//串⾏⼝初始化程序
082void InitCOM()
083{
084    SCON=0x50;          //SCON=(0101 0000)B,波特率不加倍,允许接收
085    TH1=0xFD;          //设置波特率=9600bps
086    TL1=TH1;

本文发布于:2024-09-21 15:53:52,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/163188.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:看门狗   计数器   系统
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议