看门狗溢出实验 按键不停喂狗
- 格式:doc
- 大小:15.00 KB
- 文档页数:3
单片机常见错误例程分析单片机是一种集成电路,对于初学者来说,由于经验不足,常会遇到一些错误。
下面我们来分析一些单片机常见的错误例程,以及解决方法。
一、看门狗定时溢出引起的复位单片机中通常都有看门狗(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看门狗,全称为看门狗定时器(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.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单片机中,看门狗函数的实现方法是通过设置看门狗定时器的计数值,并在计时器溢出时触发中断。
在中断服务程序中,可以进行相应的处理,如重启系统等。
为了保证看门狗函数的正常运行,需要注意以下几点: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. 哇哦,最后一点啦,一定要对看门狗的功能进行充分的验证和测试,确保系统的稳定可靠呀!总之呢,独立看门狗喂狗这事儿可不能马虎,每个注意事项都得认真对待,不然出了问题可就麻烦大啦!。
“看门狗”概念及其应用在由单片机构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程序的正常运行被打断,由单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(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”时,启动看门狗。
/*-----------------------------------------------
名称:看门狗溢出实验按键不停喂狗
论坛:
编写: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);
}
}。