一、复位功能的重要性 对于任何一个微机系统来说,系统上电复位都是开始工作的第一步。上电复位,使整个系统处于或回到默认的初始硬件状态下,以便做好工作准备。 在上电或复位后一段时间内(实际上时间很短)让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。 复位电路性能的优劣,直接影响到整个系统工作的可靠性。许多小伙伴在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、程序“走飞”等现象,这主要是单片机的复位电路设计不可靠引起的。 二、单片微机系统初始化状态(复位)单片机的引脚功能: - RST:复位信号输入端,高电平有效。
- EA:内/外程序存储器选择控制端,低电平有效。=1,访问片内程序存储器,但在PC(程序计数器)值超过0FFFH(对于8051、8751)时,即超出片内程序存储器的4K字节地址范围时,将自动转向执行外部程序存储器内的程序。=0,单片机则只访问外部程序存储器。
单片机的复位是由RESET引脚来控制的,此引脚输入高电平超过两个机器周期后,单片机即进入芯片内部复位状态,而且一直在此状态下等待,直到RESET引脚转为低电平后,才检查EA引脚是高电平或低电平,若为高电平则执行芯片内部的程序代码,若为低电平便会执行外部程序。如果RST持续为高电平,单片机就处于循环复位状态。 51单片机在系统复位时,将其内部的一些重要寄存器设置为特定的值,至于内部RAM内部的数据则不变。 单片机复位后的状态: 单片机的复位操作使单片机进入初始化状态,其中包括使程序计数器PC=0000H,这表明程序从0000H地址单元开始执行。单片机冷启动后,片内RAM为随机值,运行中的复位操作不改变片内RAM区中的内容,21个特殊功能寄存器复位后的状态为确定值,见下表。 说明:表中符号×为随机状态; A=00H,表明累加器已被清零; PSW=00H,表明选寄存器0组为工作寄存器组; SP=07H,表明堆栈指针指向片内RAM 07H字节单元,根据堆栈操作的先加后压法则,第一个被压入的内容写入到08H单元中; Po-P3=FFH,表明已向各端口线写入1,此时,各端口既可用于输入又可用于输出; IP=×××00000B,表明各个中断源处于低优先级; IE=0××00000B,表明各个中断均被关断; 需要指出的是,记住这些特殊功能寄存器复位后的主要状态,对于了解单片机的初态,编写应用程序中的韧始化部分是十分必要的。 三、复位情形启动复位一般有三种情况: 一是上电复位,在给系统(电路)通电时马上进行复位操作;在电源上电以及在正常工作时电源电压异常或被干扰时,电源电压不稳定,对单片机工作的稳定性可能带来严重的影响。因此,在电源上电时要进行复位;监视正常工作时电源电压,若电源有异常则会进行强制复位,如欠压复位。 二是手动复位,在必要时可以由手动操作,一般使用按钮来操作。比如,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,可以按下复位按钮,内部的程序自动从头开始执行。 三是自动复位,根据程序或者电路运行的需要自动地进行,如Watchdog。 从电路实现形式来看,单片机复位电路主要有四种类型: (1)微分型复位电路; (2)积分型复位电路; (3)比较器型复位电路; (4)看门狗型复位电路。 四、防止程序“走飞”采用单片机为核心组成检测与控制系统,特别是在工业现场,系统会受到各种干扰的影响,会导致程序计数值指针 ( PC)的内容改变,打乱程序的正常运行,由于偶然巧合而进入死循环,这就是我们平常说的程序“走飞”。 出现“走飞”这种情况后 ,系统将无法完成正常功能,造成整个系统的陷入停滞状态,发生不可预料的后果。这是非常有害的 ,有时甚至是非常危险的。软件设计人员在进行软件开发设计时,必须采取措施防止程序走飞或者一旦走飞马上让程序返回到指定的安全状态,使得系统能够经 住不同环境下各种干扰的考验,始终保持安全稳定运行。 目前在防止程序走飞方面的措施主要有: 1.设置监视跟踪定时器:利用定时中断来监视程序的运行状态。如果主程序正常运行一个循环周期的时间为t0,设定定时器的定时时间t1稍大于t0,在主程序运行过程中每次都要执行一次定时时间常数t1刷新操作。 这样只要程序正常运 行,定时器不会出现定时中断;当程序“走飞”的时候,不能刷新定时常数 ,定时器就会产生中 断 ,利用定时中断服务程序将系统复位。 在以前传统的8051往往没有内置看门狗,都是需要外置看门狗的,例如常用的看门狗芯片有Max813、5045、IMP706、DS1232。 看门狗型复位电路(Watchdog):自动避免程序运行异常时“走飞“,陷入死循环。 Watchdog:编写一段程序P,实现如下功能:当系统正常运行,CPU正常工作时,定时复位某个计数器CTC,使得该计数器CTC的值不超过某一规定值t0;当系统异常,CPU不能正常工作时,造成计数器CTC不能被复位,其计数会超过t0,进而产生复位脉冲送给看门狗,使得CPU恢复正常工作状态。 2.是设置软件陷阱。 当程序计数指针PC值失控,造成程序走飞而进入非程序区后 ,只要在非程序区设置拦截措施,使程序进入陷阱,然后强制使程序进入初始状态。 上述两种方法都存在一定的缺陷,一般采取结合使用的办法。 Watchdog这种复位电路的可靠性主要取决于软件设计时将定时向复位电路发出脉冲的程序P放在何处。一般是将此段程序P放在定时器CTC的中断服务子程序中。但是,有时这种设计仍然会引起程序”走飞“或工作不正常。 原因主要是:当程序“走飞”发生在中断子程序P定时器初始化以及开中断之后的话,这种“走飞”情况就有可能不能由Watchdog复位电路校正回来。因为定时器中断一直在产生,即使程序不正常,Watchdog也能被正常复位。 为了解决这个问题,提出定时器加预设的方法,即在初始化时压入堆栈一个地址,在此地址内执行的是一条关中断和一条死循环语句。在所有不被程序代码占用的地址尽可能地用子程序返回指令RET代替。这样,当程序走飞后,其进入陷阱的可能性将大大增加。而一旦进入陷阱,定时器停止工作并且关闭中断,从而使Watchdog复位电路会产生一个复位脉冲将CPU复位。 当然这种技术不适用于实时性较强的控制或处理软件。
|