看门狗溢出实验 按键不停喂狗
《嵌入式系统原理与应用》实验报告04-看门狗实验
签名:
日期:
成绩
WDFEED=0x55;
}
void FeedDog(void)
{
WDFEED=0xaa;
WDFEED=0x55;
}
int main (void)
{
uint32 dly;
PINSEL0=0x00;
PINSEL1=0x00;
IO0DIR=led;
IO0SET=led;
for(dly=0;dly<500000;dly++);
1.实验效果截图
2.源程序
#include "config.h"
#define key (1<<20)//set the button to be P0.20
#define led (1<<7)
void WDT_Init(uint32 time)
{
WDTC=time;
WDMOD=0x03;
WDFEED=0xaa;
二、实验设备(环境)及要求
硬件:PC机;
软件:PC机操作系统windows XP,Proteus软件,ADS1.2
三、实验内容与步骤
实验内容:
运行程序时,LED灯闪烁一下,并启动看门狗;当按键按下时,停止喂狗,此时会引起看门狗复位;复位之后,程序重新运行,此时LED灯又闪烁了一下。
四、实验结果与数据处理
《嵌入式系统原理与接口技术》实验报告
实验序号:4实验项目名称:看门狗实验
学 号
XXXX
姓 名
XXX
专业、班
计算机科学与技术
实验地点
1-416
指导教师
XXX
实验时间
单片机常见错误例程分析
单片机常见错误例程分析单片机是一种集成电路,对于初学者来说,由于经验不足,常会遇到一些错误。
下面我们来分析一些单片机常见的错误例程,以及解决方法。
一、看门狗定时溢出引起的复位单片机中通常都有看门狗(Watchdog)定时器,用于监控系统运行。
如果在程序中没有及时喂狗,导致看门狗定时器溢出,会引起复位。
解决方法:1.在主程序中设定喂狗的指令,以避免看门狗定时溢出。
2.在适当的位置设置看门狗使能的指令,保证看门狗定时器能正常工作。
3.尽量避免在中断服务程序中关闭看门狗定时器,以免因为中断响应过慢导致看门狗复位。
二、中断服务程序执行时间过长当中断服务程序执行时间过长时,会导致主程序无法继续正常运行。
这种情况下,单片机很可能无法响应其他外部事件。
解决方法:1.在中断服务程序中尽量减少对资源的占用,避免复杂的运算和长时间的延时操作。
2.将必要的数据交给主程序处理,减少中断服务程序的工作量。
3.合理设置中断优先级,确保重要的中断能及时响应。
三、电源噪声导致系统不稳定单片机对电源的稳定性要求较高,如果电源存在噪声,则可能导致系统不稳定,甚至崩溃。
解决方法:1.在供电线路上添加合适的滤波电容,以减小电源噪声。
2.使用稳压电源,保证电源输出的稳定性。
3.合理布线,避免电源和信号线的干扰。
四、编程错误编程错误是单片机常见的错误之一、例如,写入错误的寄存器地址、错误的命令、错误的数据等。
解决方法:1.熟悉单片机的手册,了解相关寄存器、命令和数据的使用方法。
2.仔细检查编程代码,避免拼写错误和语法错误。
3.使用调试工具,例如仿真器、逻辑分析仪等,进行实时调试。
五、外围设备连接错误单片机通常需要与外围设备进行通信,如果连接错误,可能导致通信失败或者数据传输错误。
解决方法:1.确保电路连接正确,检查信号线、电源线等的连接是否松动、接触不良。
2.根据外围设备的手册,仔细查阅相关接口的使用说明书,确保连接方式正确。
3.使用示波器、逻辑分析仪等工具,对通信信号进行监测和分析,找出错误原因。
详解多任务看门狗及喂狗方法
详解多任务看门狗及喂狗方法展开全文看门狗分硬件看门狗和软件看门狗。
硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零(俗称“喂狗”),因此程序正常工作时,定时器总不能溢出,也就不能产生复位信号。
如果程序出现故障,不在定时周期内复位看门狗,就使得看门狗定时器溢出产生复位信号并重启系统。
软件看门狗原理上一样,只是将硬件电路上的定时器用处理器的内部定时器代替,这样可以简化硬件电路设计,但在可靠性方面不如硬件定时器,比如系统内部定时器自身发生故障就无法检测到。
当然也有通过双定时器相互监视,这不仅加大系统开销,也不能解决全部问题,比如中断系统故障导致定时器中断失效。
看门狗本身不是用来解决系统出现的问题,在调试过程中发现的故障应该要查改设计本身的错误。
加入看门狗目的是对一些程序潜在错误和恶劣环境干扰等因素导致系统死机而在无人干预情况下自动恢复系统正常工作状态。
看门狗也不能完全避免故障造成的损失,毕竟从发现故障到系统复位恢复正常这段时间内怠工。
同时一些系统也需要复位前保护现场数据,重启后恢复现场数据,这可能也需要一笔软硬件的开销。
图1:(a) 多任务系统看门狗示意图;(b) 相应的看门狗复位逻辑图在单任务系统中看门狗工作原理如上所述,容易实现。
在多任务系统中情况稍为复杂。
假如每个任务都像单任务系统那么做,如图1(a)所示,只要有一个任务正常工作并定期“喂狗”,看门狗定时器就不会溢出。
除非所有的任务都故障,才能使得看门狗定时器溢出而复位,如图1(b)。
而往往我们需要的是只要有一个任务故障,系统就要求复位。
或者选择几个关键的任务接受监视,只要一个任务出问题系统就要求复位,如图2(a)所示,相应的看门狗复位逻辑如图2(b)所示。
在多任务系统中通过创建一个监视任务TaskMonitor,它的优先级高于被监视的任务群Task1、Task2...Taskn。
TaskMonitor在Task1~Taskn正常工作情况下,一定时间内对硬件看门狗定时器清零。
第二十二篇 看门狗WDT
第二十二篇看门狗WDT看门狗,全称为看门狗定时器(WatchDog Timer),是用来解决CPU的程序跑飞问题的定时器。
CPU在运行时,由于某种外界的电磁干扰等,CPU可能会进入程序死循环之中(程序跑飞了),为解决这个问题,看门狗应运而生,启动看门狗定时器之前需要对其设定一个合理的初值,启动后定时器开始计数,一旦计数器溢出,看门狗就会向CPU发送复位信号,使CPU复位,所以程序中应当按时使其重装初值(俗称“喂狗”),避免系统复位,这样,一旦程序跑飞,看门狗得不到及时重装初值(喂),就会系统复位,离开死循环状态。
LPC2103的WDT有四个寄存器:★WDMOD——Watchdog Mode register,看门狗模式寄存器WDMOD[0]——看门狗中断中断使能位WDMOD[1]——看门狗复位使能位WDMOD[2]——看门狗时间溢出标志WDMOD[3]——看门狗中断标志其他位——保留★WDTC——Watchdog Timer Constant register,看门狗定时器常量寄存器,32位,它决定着定时器的溢出时间,最小为0xFF,即使往里写入小于0xFF的值,结果仍是0xFF。
★W DTV——Watchdog Timer Value register,看门狗定时器值寄存器,是当前的定时器值,每个4*Tpclk周期,其值减一,到0则溢出。
★WDFEED——Watchdog Feed sequence register,看门狗喂狗寄存器,顺序向其写入“0xAA”和“0x55”则WDTV被WDTC的值重装,即喂狗,还有:每次使能看门狗后,也要顺序向其写入“0xAA”和“0x55”,才能启动看门狗定时器。
下面是程序:由于实际中很难做到程序跑飞的现象,所以用其他方式来模拟停止喂狗。
//***************************************************************//看门狗实验//复位后,LED1闪烁一次,然后周期性及时喂狗,LED2随之闪烁//按住KEY键(P0.16为低电平),禁止喂狗,以使系统复位#include<LPC2103.h>#define LED1 1<<18#define LED2 1<<19#define KEY 1<<16void delay(unsigned int i){while(i--);}int main(){IODIR=LED1; // LED1设定为输出引脚IOCLR=LED1;delay(3000000); //LED1闪烁一次IOSET=LED1;WDMOD=0X3; //看门狗使能并允许复位WDTC=600000; //看门狗常数(最大不喂狗时间间隔),T=Tpclk*4*WDTCWDFEED=0XAA; //第一次喂狗(0XAA,0X55)启动看门狗WDFEED=0X55;while(1){while((IOPIN&(KEY))==0); //如果该按键被按住(低电平),则程序停在这里IODIR=LED2; // LED2设定为输出引脚IOSET=LED2;delay(300000); //LED2闪烁IOCLR=LED2;delay(300000);WDFEED=0XAA; //按时喂狗WDFEED=0X55;}}//***************************************************************仿真结果:复位后LED1闪烁一次(表明刚复位过),然后LED2闪烁(表明正常喂狗),按住KEY(停止喂狗),LED2不闪烁,LED1闪烁(表明不断复位)。
15-看门狗实验
第15章看门狗15.1概述接触过c51的朋友,对看门狗的概念应该不陌生吧?看门狗在某种程度上有软件复位的意义。
比起c51,AVR的看门狗更简单,而且很听话。
本章笔记可能会比较短,毕竟配置看门狗,就几个动作而已。
15.2关于看门狗的寄存器看门狗的操作其本上有"开狗","喂狗","关狗"这三个步骤。
开狗的意思是初始化看门狗并且使能它;喂狗的意思是复位看门狗;关狗动作就是不使能看门狗。
而配置看门狗的寄存器就只有一个而已。
看门狗定时器控制寄存器WDTCR该寄存器的功能如名字般,使能|不使能看门狗,设置喂狗的最长时间。
WDTOE位,该位的存在时为了关闭看门狗。
必须附和使用WDE位。
WDE位,看门狗使能位。
该位置一时启动看门狗。
WDP0~2,喂狗时间配置位。
具体的配置如下图。
该寄存器的每一个位如果不配合使用,说真的意义很小。
15.3"开狗","喂狗","关狗""开狗"-启动看门狗的具体步骤如下:1.配置喂狗时间。
2.使能看门狗。
(以上的动作可以在一个指令完成)C语言的写法://看门狗启动函数void WDT_ON(){WDTCR=0x0f;//WDE=1-看门狗使能,WDP0:1:2=1:1:1-2秒喂狗。
}"关狗"-关闭看门狗的具体步骤如下:1.WDTOE位和WDE位同时置一。
2.WDE位置零。
C语言的写法://看门狗关闭函数void WDT_OFF(){WDTCR|=BIT(WDTOE)|BIT(WDE);//制造4个周期关闭时间WDTCR&=~BIT(WDE);//关闭看门狗}为什么关闭看门狗需要同时置一WDTOE和WDE位呢?具体我也不是很清楚,但是根据手册说:当WDTOE和WDE一同置一时,会产生4个有效的关闭周期。
如果在这四个周期内,将WDE位设置位0,那么久会成功关闭看门狗。
52单片机看门狗函数
52单片机看门狗函数52单片机是一种常用的微控制器,它具有强大的功能和广泛的应用领域。
在许多嵌入式系统中,看门狗函数是一项重要的功能,用于保证系统的稳定性和可靠性。
看门狗函数是一种用于监控系统运行状态的机制,它可以在系统出现故障或死锁时自动重启系统,从而避免系统长时间处于不正常的状态。
52单片机的看门狗函数是一种硬件看门狗,通过定时器和中断来实现。
在使用52单片机的看门狗函数时,首先需要初始化看门狗定时器,并设置定时器的计数值。
通过设置计数值,可以控制看门狗定时器的溢出时间,并决定系统在多长时间内需要喂狗一次。
在系统正常运行时,需要定期喂狗,以防止看门狗定时器溢出。
喂狗的方法是在规定的时间内定时发送喂狗信号,这样看门狗定时器会被重置,系统会继续正常运行。
如果系统出现故障或死锁,无法定时喂狗,看门狗定时器就会溢出。
一旦看门狗定时器溢出,会触发看门狗中断,系统将自动重启,从而恢复到正常的工作状态。
通过使用52单片机的看门狗函数,可以有效地提高系统的可靠性和稳定性。
在一些对系统可靠性要求较高的应用中,如工业控制、医疗设备等,看门狗函数是必不可少的一项功能。
看门狗函数的实现原理是通过定时器和中断来实现的。
定时器用于计时,当计时器溢出时,会触发中断。
通过设置定时器的计数值,可以控制看门狗定时器的溢出时间。
在52单片机中,看门狗函数的实现方法是通过设置看门狗定时器的计数值,并在计时器溢出时触发中断。
在中断服务程序中,可以进行相应的处理,如重启系统等。
为了保证看门狗函数的正常运行,需要注意以下几点:1.合理设置看门狗定时器的计数值,以满足系统的实际需求。
计数值过小会导致系统频繁重启,计数值过大会导致系统响应速度下降。
2.在系统正常运行时,需要定期喂狗,以防止看门狗定时器溢出。
喂狗的方法可以是定时发送喂狗信号,也可以是在关键的代码段中插入喂狗指令。
3.在中断服务程序中,需要进行相应的处理,如重启系统等。
同时,还需要注意中断服务程序的优先级和执行时间,以免影响系统的正常运行。
看门狗——精选推荐
看门狗看门狗,⼜叫 watchdog timer,是⼀个定时器电路, ⼀般有⼀个输⼊,叫喂狗,⼀个输出到MCU的RST端,MCU正常⼯作的时候,每隔⼀端时间输出⼀个信号到喂狗端,给 WDT 清零,如果超过规定的时间不喂狗,(⼀般在程序跑飞时),WDT 定时超过,就回给出⼀个复位信号到MCU,是MCU复位. 防⽌MCU死机. 看门狗的作⽤就是防⽌程序发⽣死循环,或者说程序跑飞。
⼯作原理:在系统运⾏以后也就启动了看门狗的计数器,看门狗就开始⾃动计数,如果到了⼀定的时间还不去清看门狗,那么看门狗计数器就会溢出从⽽引起看门狗中断,造成系统复位。
所以在使⽤有看门狗的芯⽚时要注意清看门狗。
硬件看门狗是利⽤了⼀个定时器,来监控主程序的运⾏,也就是说在主程序的运⾏过程中,我们要在定时时间到之前对定时器进⾏复位如果出现死循环,或者说PC指针不能回来。
那么定时时间到后就会使单⽚机复位。
TMS320F2812中涉及到看门狗的寄存器有:系统控制与状态寄存器SCSR,此寄存器包括看门狗覆盖位和看门狗中断使能/⽆效位。
⼀般系统复位时,看门狗模块使能。
F2812的看门狗模块有关寄存器:看门狗计数器寄存器(WDCNTR)15~8:Reserved7~0:WDCNTR 包含WD计数器的当前值,8位计数器以WDCLK速率连续增加。
如果计数器溢出,看门狗会初始化复位状态。
如果⽤⼀个有效的组合写WDKEY寄存器,那么计数器复位成0。
看门狗复位密钥寄存器(WDKEY)15~8:Reserved7~0:WDKEY 紧跟着OXAA写⼊OX55将清除WDCNTR位。
写⼊任何其他值则会⽴即使看门狗复位。
看门狗控制寄存器(WDCR)15~8:Reserved7:WDFLAG 看门狗复位状态标志位;6:WDDIS 向该位写1将使看门狗模块⽆效;写其他值⽴即复位。
5~3:⽆论何时执⾏写此寄存器的操作,⽤户必须总是将这些位写成1,0,1。
写其他值⽴即复位。
看门狗的使用
看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。
在很多单片机中都内置了看门狗,看门狗本身是一个定时器,当定时器溢出时即进行系统复位,因此需要在程序中对看门狗定时器进行清零,即常说的喂狗。
由于我用过AVR的单片机,和AVR的相比,MSP430的看门狗要灵活的多,首先默认看门狗是开着的,因此如果不使用看门狗的话要关闭,指令如下:WDTCTL = WDTPW + WDTHOLD如果打开看门狗则需要在程序中清零,指令如下:WDTCTL=WDTPW+WDTCNTCL从头文件的定义中可以看出主要有两种方式,一种就是当做普通的定时器使用,一种才是作为看门狗,另外就是时钟源可选,选择8M或者32K的晶振来获得不同的延时,通过上面可以看出看门狗定时器最大的时间可以到1S,在程序中可以灵活的利用看门狗定时器实现想要的功能。
下面介绍两个典型应用:1、在动态数码管显示中的应用,具体代码可以参考我之前的笔记,部分代码如下:WDTCTL = WDT_ADLY_1_9; // 设置内部看门狗工作在定时器模式,1.9ms中断一次//可以去看头文件中具体的配置,这里使用的手表晶振64分频计算可得是1.9msIE1 |= WDTIE; // 使能看门狗中断__interrupt void watchdog_timer(void){}这个程序主要是将看门狗定时器当做普通定时器使用,1.9ms刚好适合动态扫描间隔,在看门狗中断中对数码管进行动态扫描,这样使用相对于开一个定时器来说要有所方便。
因此在需要的定时与看门狗定时器的几个时间相同时可以考虑使用看门狗。
2、普通延时WDTCTL = WDT_ADLY_1000; //间隔定时器,定时1000ms//延时2sfor(i = 0; i< 3; i++){IFG1 &= ~WDTIFG;while(!(IFG1 & WDTIFG));IFG1 &= ~WDTIFG;}这个程序同样是将看门狗当普通定时器使用,在主程序中读取中断标志位,实现延时效果,上面的程序为什么是延时2S自己分析。
独立 看门狗 喂狗 注意事项
独立看门狗喂狗注意事项嘿呀!以下就是关于独立看门狗喂狗注意事项啦!1. 哎呀呀,首先要清楚喂狗的时间间隔呢!这个间隔可不能太长也不能太短呀,太长了可能导致看门狗超时复位,太短了又浪费系统资源,到底多长合适,得根据具体的应用场景好好琢磨琢磨呀!2. 哇,一定要保证喂狗操作的准确性呀!要是喂狗的代码写错了,那可就麻烦大啦!3. 嘿,注意系统的异常情况哟!比如说系统死机、死循环啥的,这时候喂狗可能就不正常了,得提前做好应对措施呢!4. 哎呀呀,多考虑一下系统的时钟稳定性哟!时钟不准,喂狗的时间也就不准啦!5. 哇,在多任务系统中,要确保每个任务都能按时喂狗呀,可别出现有的任务忘记了的情况哟!6. 嘿呀,对于不同的工作模式,喂狗的策略可能也得变一变呢!7. 哎呀,还得注意喂狗操作会不会被其他中断或者高优先级任务打断呀,如果被打断了可不好!8. 哇哦,在程序升级或者修改的时候,可别把喂狗相关的代码改坏了哟!9. 嘿,要对看门狗的状态进行实时监测呀,一旦发现异常能及时处理!10. 哎呀呀,还有还有,考虑一下电源波动对喂狗的影响呢!11. 哇,不同的硬件平台,喂狗的方式和注意事项也可能不一样哟,要仔细研究!12. 嘿呀,注意看门狗的复位阈值,别超过了哟!13. 哎呀,对于一些关键的代码段,要确保在执行过程中能正常喂狗呀!14. 哇,在低功耗模式下,喂狗的方式可能需要特殊处理呢!15. 嘿,多做一些测试,看看在各种极端情况下,喂狗是不是都能正常工作呀!16. 哎呀呀,跟其他硬件模块的交互会不会影响到喂狗,这也得考虑考虑哟!17. 哇,代码的优化可不能影响到喂狗的功能和稳定性呀!18. 嘿呀,对于一些实时性要求高的系统,喂狗的及时性就更重要啦!19. 哎呀,注意看门狗的初始化设置,可别弄错了参数哟!20. 哇哦,最后一点啦,一定要对看门狗的功能进行充分的验证和测试,确保系统的稳定可靠呀!总之呢,独立看门狗喂狗这事儿可不能马虎,每个注意事项都得认真对待,不然出了问题可就麻烦大啦!。
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”时,启动看门狗。
rtwatchdog 用法
rtwatchdog 用法
RTWatchdog是一种实时操作系统(RTOS)中的看门狗定时器,用于检测和恢复系统故障。
下面是RTWatchdog的基本用法:
初始化:在系统启动时,需要对RTWatchdog进行初始化。
这通常包括设置看门狗定时器的溢出时间、选择触发方式(中断或复位)以及选择相应的看门狗定时器通道。
使能:在系统运行期间,需要使能RTWatchdog。
通过配置相关的寄存器或调用API函数,使能看门狗定时器。
喂狗:在系统运行期间,需要定期喂狗以避免看门狗定时器溢出。
这通常通过在中断服务程序或任务中调用相应的API函数来实现。
检测故障:当看门狗定时器溢出时,系统会触发相应的故障处理机制。
这可以是中断处理程序或复位操作,具体取决于在初始化时选择的触发方式。
故障恢复:在故障处理机制中,系统会尝试恢复故障。
这可能包括重新初始化系统、加载备份数据或执行其他恢复操作。
需要注意的是,RTWatchdog的具体用法可能因不同的RTOS和硬件平台而有所不同。
因此,在使用RTWatchdog时,建议参考相关的RTOS文档和硬件手册,以了解具体的用法和配置选项。
7.看门狗实验
5.2 窗口看门狗源文件
void WWDG_IRQHandler(void)
{ WWDG_SetCounter(WWDG_CNT);
WWDG_ClearFlag();
LED1=!LED1;
}
5.3 窗口看门狗主程序
回到主界面,在 main.c 文件里面编写如下代码:
#include "led.h" #include "delay.h"
}
delay_ms(10);
}
}
4. WWDG简介
4.1 WWDG主要性能
可编程的自由运行递减计数器 条件复位:
1.当递减计数器的值小于0x40, (若看门狗被启动)则产生复位。
2.当递减计数器在窗口外被重新装载, (若看门狗被启动)则产生复位。 见0。 如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤 醒中断(EWI),它可 以被用于重装载计数器以避免WWDG复位。
2.2 IWDG功能描述(STM32参考手册 P317)
在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗; 此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾 0x000时,会产生一个复位信号(IWDG_RESET)。无论何时,只要在键 寄存器IWDG_KR中写入0xAAAA, IWDG_RLR中的值就会被重新加 载到计数器,从而避免产生看门狗复位 。
2.3 IWDG相关寄存器
键寄存器IWDG_KR: 0~15位有效
预分频寄存器IWDG_PR:0~2位有效。具有写保护功能,要操作先取消 写保护
重装寄存器IWDG_RLR:0~11位有效。具有写保护功能,要操作先取 消写保护。 状态寄存器IWDG_SR:0~1位有效
浅析仿真、编程中的看门狗问题
浅析仿真、编程中的看门狗问题身为一名合格的电子攻城狮,你可以不知道“二哈”为何物,可以不知道“泰迪”有多神奇,但是有只宠物你一定得知道,那就是——“看门狗”。
如果你是想来看萌萌哒宠物,可能小编要让你失望一下了,这里是ZLG致远电子,是电子工程师的天堂,自然不能掉了档次。
我们一直致力于传播专业、实用的电子知识,今天为大家带来的是关于“看门狗(watch dog)”不得不说的秘密。
异常事件描述在研发初期,嵌入式工程师都需要在线仿真、调试产品,在这个过程中,有很多工程师在使用仿真器工具(以AK100Pro为例)过程中会遇到的一些异常:●下载程序一半后进度条停止不前,直至提示下载失败;●能够顺利进入仿真模式,不久就不能跟踪调试了,单片机自主跑起来了;……出现上述现象的原因有很多,今天我们就从“看门狗”的角度来分析一下单片机到底发生了什么。
什么是“看门狗”在嵌入式系统中,单片机可能会受到外界电、磁等干扰,造成程序异常,从而使系统陷入瘫痪状态。
为了防止此类现象发生,便出现了用于监控单片机运行状态的芯片--watch dog,中文译为“看门狗”。
看门狗芯片输出端接单片机复位引脚,当在设定的时间间隔内没有收到单片机的脉冲信号(喂狗信号),看门狗内部定时器溢出,拉低复位引脚从而使得芯片复位。
目前很多单片机已经内置了内部看门狗电路,原理与外部看门狗类似。
图 1 看门狗典型电路通过下面几个我们在技术支持过程中遇到的问题,并总结了行之有效的解决办法。
1、内部看门狗客户采用STM32研发产品,需要为原有的代码增加看门狗程序,然而在用AK100Pro仿真调试时,发现程序在断点处停下来后一会儿,芯片居然自己全速跑起来了。
单片机分为内核和外设,仿真调试过程中,在断点处停下来后,芯片内核是停止的,而外设则可以选择性的继续运行,如内部看门狗。
内核停止,无法喂狗,导致看门狗将芯片复位。
那么如何解决呢?有两种方法可以实现:一个是在用户程序中对相关寄存器进行初始化如下图所示。
AVR内部看门狗实验
AVR内部看门口实验。
1、看门口实验。在主程序中周期喂狗,通过按下按键让程序无限循环,从
而启动看门狗。
2、内部1 M晶振,程序采用单任务方式,软件延时。
3、进行此实验请插上JP1、JP3的所有8个短路块,JP7(LED_EN)短路
块。
4、通过此实验可了解看门狗的设置及看门狗的喂狗等。
1S*/while (1) {
delay_ms(250);
WDR();/*喂ห้องสมุดไป่ตู้*/
PORTB–(1 << 0);/*PB0电平取反*/
while(PINA != 0xFF);/*检测按键*/
}
}
*/
#include“iom16v.h”
#include
/*延时函数*/
void delay_ms(unsigned char i){
unsigned char a, b;
for (a = 1; a < i; a++) {
for (b = 1; b; b++) {
;
}
PORTD = 0xFF;
PORTB = 0x00;
WDR();/*喂狗*/
delay_ms(250);
WDR();/*喂狗*/
delay_ms(250);
PORTB = 0xFF;
WDTCR |= ((1 << WDTOE) | (1 << WDE));/*启动时序*/
WDTCR=((1<<WDE)|(1<<WDP2)|(1<<WDP1));/*设定周期为
看门狗
端口初始化程序如下:
片不带喂狗端口
方式1中所采用的是带WDI端口的看门狗芯片,但有些芯片是不带WDI端口的,这时看门狗用于电源检测,当低于设定电压时,输出复位信号,使系统复位。第二种方法也采用2812的引脚配合方式,但不需要时时刻刻喂狗。图3为所采用的看门狗芯片MAX708。图4为MAX708与2812的接口电路。
{
EALLOW;
SysCtrlRegs.WDCR= 0x0068;//0110 1000
EDIS;
}//使看门狗无效
void KickDog(void)
{
EALLOW;
SysCtrlRegs.WDKEY = 0x0055;
SysCtrlRegs.WDKEY = 0x00AA;
这里利用while(1)的死循环等待看门狗的计数器超过设定值,然后WDRST信号输出低电平;而WDRST接到XRS上,所以整个系统复位,重新开始执行程序。
看门狗程序如下:
结 语
第一种和第二种方式基于硬件的实现,更加可靠些,第三种方式则可以节约电路板的空间和成本。需要注意的是,采用软件看门狗时调用喂狗程序的间隔不能大于设定值。
TMS320F2812(以下简称2812)是TI公司2000系列的新型DSP芯片,具有32位低功耗定点处理器,最高主频150 MHz,有强大的操作能力和快速的中断响应处理能力。片内有18 K字高速RAM,128 K字的可加密Flash ROM。片上还集成了丰富的片内外设.有SPI、SCI、eCAN和McB—SP等多个串口外围设备,16通道的12位模数转换器(ADC),2个事件管理器(EVA、EVB),56个独立的可编程、多用途通用I/O口(GPIO)。该DSP芯片集成了大量工业控制领域应用的外设接口,能大大简化电路设计,同时它也具有足够的处理能力,是应用于控制领域的一款高性能DSP处理器。
实验6--看门狗错误喂狗产生中断实验
实验报告班级学号姓名同组人实验日期室温大气压成绩实验题目:看门狗错误喂狗产生中断实验一、实验目的:1、通过本实验进一步掌握对ARM7.0软件和EasyJTAG仿真器的使用,以及进一步熟悉EasyARM2131开发板硬件结构,掌握各引脚功能和接线。
2、通过实验,进一步掌握看门狗的相关原理及方框图。
3、通过实验,进一步了解看门狗出现错误或者是不完整的喂狗时产生复位或使能的功能,并且掌握看门狗的喂狗过程及其错误喂狗产生的中断的功能。
二、实验仪器:装有ADS1.2及EasyJTAG仿真器的计算机一台、ARM7开发板一块三、实验原理(一)具有如下特性:(二)结构如下:(三)寄存器描述:四、实验程序及结果:#include "config.h"#define BEEP 1 << 7// P0.7控制蜂鸣器BEEP,低电平蜂鸣#define WDT 0// WDT中断号#define LED2 1 << 17 // P0.17控制LED2,低电平点亮#define KEY1 1 << 16// P0.16连接KEY1void DelayNS (uint32 dly){uint32 i;for ( ; dly>0; dly--)for (i=0; i<50000; i++);}/********************************************************************************************** ************** 函数名称:WDT_Int()** 函数功能:看门狗中断服务程序** 入口参数:无** 出口参数:无*********************************************************************************************。
STM32看门狗实验
1.分析和学习固件库 2.理解固件库的结构 3.通过 stm32f10x_iwdg.c/.h 文件,熟悉 IWDG(独立看门狗)的控制和工作原理 4.复习按键中断的使用方法
实验要求:
1.使用 LED 灯 LED1 来指示程序是否重启(IWDG) 2.使用按键 WAKEUP 来不断地喂狗,并用 LED4 灯指示
最适合应用于要求看门狗运行时,完全独立与主应用之外的项目
硬件电路分析:
这里的核心是在 STM32 内部进行,并不需要外部电路。但是考虑到指示当前状态和喂狗等操作,我们需要 2 个 IO 口,一 个用来输入喂狗信号,另外一个用来指示程序是否重启。喂狗我们采用板上的 WAKEUP 键来操作,而程序重启,则是通过 LED4 来指示的。LED4 和 WAKEUP 的连接在前面跑马灯实验已经介绍了,这里我们不再多说
/* Check the parameters */ assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); IWDG->KR = IWDG_WriteAccess; } 可以看出,该函数的作用就是把输入参数传递到 IWDG_KR 中去. 在 stm32f10x.h 中我们找到输入参数的定义,如下所示 #define IWDG_WriteAccess_Enable ((uint16_t)0x5555) #define IWDG_WriteAccess_Disable ((uint16_t)0x0000) #define IS_IWDG_WRITE_ACCESS(ACCESS) (((ACCESS) == IWDG_WriteAccess_Enable) || \
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗 的时钟并不是准确的 40Khz,而是在 30~60Khz 之间变化的一个时钟,只是我们在估算的时候,以 40Khz 的频率来计算, 看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。 通过对 LSI 进行校准可获得相对精确的看门狗超时时间。有关 LSI 校准的问题,详见数据手册 LSI 时钟一节。
看门狗溢出实验 按键不停喂狗
/*-----------------------------------------------名称:看门狗溢出实验按键不停喂狗论坛:编写:shifang日期:2009.5修改:无内容:通过按键喂狗防止溢出复位看门狗演示程序在16383个机器周期内必须至少喂狗一次标准A T89s52单片机试验通过。
------------------------------------------------*/#include <reg52.h>sfr WDTRST = 0xA6;sbit K1 = P3^0;sbit K2 = P3^1;sbit LED1=P1^1;sbit LED2=P1^2;void DelayUs2x(unsigned char t);//us级延时函数声明void DelayMs(unsigned char t); //ms级延时/*------------------------------------------------主函数------------------------------------------------*/main(){LED1=0;DelayMs(100);LED1=1;DelayMs(100);TMOD=0x01;TH0=0xc6; //定时16msTL0=0x66;EA=1;ET0=1;WDTRST=0x1e; //在程序初始化中激活看门狗。
WDTRST=0xe1; //先送1E,后送E1if(K1==0){TR0=1;}while(1){if(K2==0){TR0=0;}LED2=1;LED1=1;DelayMs(100);LED2=0;DelayMs(100);}}/*------------------------------------------------定时器中断函数------------------------------------------------*/void T ime0(void) interrupt 1{TH0=0xc6; //定时16msTL0=0x66;WDTRST=0x1e; //喂狗指令WDTRST=0xe1;}/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}。
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〞时,启动看门狗。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*-----------------------------------------------
名称:看门狗溢出实验按键不停喂狗
论坛:
编写:shifang
日期:2009.5
修改:无
内容:通过按键喂狗防止溢出复位看门狗演示程序在16383个机器周期内必须至少喂狗一次
标准A T89s52单片机试验通过。
------------------------------------------------*/
#include <reg52.h>
sfr WDTRST = 0xA6;
sbit K1 = P3^0;
sbit K2 = P3^1;
sbit LED1=P1^1;
sbit LED2=P1^2;
void DelayUs2x(unsigned char t);//us级延时函数声明void DelayMs(unsigned char t); //ms级延时
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
LED1=0;
DelayMs(100);
LED1=1;
DelayMs(100);
TMOD=0x01;
TH0=0xc6; //定时16ms
TL0=0x66;
EA=1;
ET0=1;
WDTRST=0x1e; //在程序初始化中激活看门狗。
WDTRST=0xe1; //先送1E,后送E1
if(K1==0)
{
TR0=1;
}
while(1)
{
if(K2==0)
{
TR0=0;
}
LED2=1;
LED1=1;
DelayMs(100);
LED2=0;
DelayMs(100);
}
}
/*------------------------------------------------
定时器中断函数
------------------------------------------------*/
void T ime0(void) interrupt 1
{
TH0=0xc6; //定时16ms
TL0=0x66;
WDTRST=0x1e; //喂狗指令
WDTRST=0xe1;
}
/*------------------------------------------------
uS延时函数,含有输入参数unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}。