STC8H系列—2.软硬复位与看门狗控制教程

一、前言:

   STC8H系列属于增强型C51单片机,相信实力其青出蓝而胜于蓝,传统的51单片机有专门RST脚,对于STC8系列RST脚与P5.4脚功能复用,通过操作内部寄存器可以实现通用IO口与专用复位脚的转换,同时RST脚的复位实现原理是通过检测比对输入的电压值,当输入的电压值小于设定值时可以产生复位,也可以产生中断。软复位的实现通过操作复位寄存器中的SWRST位来实现系统的复位。看门狗其本质也是一类硬复位,当计时时间到达后,未清零相应的标志位硬件立即实现复位。

二、知识简介:

   1、硬复位:

硬复位通过配置RSTCFG寄存器来实现功能,其中当P54RST置1时开启硬复位引脚RST,同时设置LVDS的4类门槛电压值,当ENLVR置0时即实再硬复位,置0时作低电压检测,并产生中断6。

   2、软复位:

软件复位系统通过IAP_CONTR寄存器的SWRST位来实现,当置位SWRST时,系统当即复位,这里有必要提一下SWBS这个控制位,当SWBS置1时,重起后系统从ISP区引导(进入下载区),当SWBS置0时,重起后系统从用户程序区开始引导开始引导。

   3、看门狗:

   看门狗实质上一类异常处理机制,由于某类未知原因导致系统运行异常,异常产生后在未得人为干涉的前,硬件自我救赎一套机制。

看门狗的起动分为软起动和硬起动,硬起动即下载时勾选中看门狗,软起动即操作WDT_CONTR.EN_WDT位,使能看门狗,同时设置定时计数WDT_PS的值。无论是硬软起动看门狗都需要“喂狗”【在设置的时间内清除标志位CLR_WDT及重赋初值】。

三、实验平台搭建:

   1、MCU:STC-打狗棒系列核心实验板 V2.3

   2、实验板平台:德飞莱LY-51s

   3、硬件连接表:

     K1----->P20   开启硬件复位

      K2----->P21   软件复位

      K3----->P22   看门狗

      K4----->P23   开启LVD 3.3V中断

      LED----->P00   指示灯

四、测试源代码:

#include <STC8H.h>

#include "intrins.h"

sbit Led=P0^0;

sbit Led1=P0^1;

#define RSTFLAG  (*(unsigned char volatile xdata *)0xfe99) //声明复位标志寄存器

void Delay1ms(unsigned char x);//当主时钟频率为12M,1ms延时为基准

void init_IO();//初始化IO

void Lvd_Isr() interrupt 6  //掉电前中断

{

    PCON&=~0x20;//清除LVDF标志

    Led1=1;

}

void main()

{

      P_SW2 |= 0x80;  //扩展寄存器XFR访问使能

      init_IO();

      Delay1ms(20);//加延时让复位后灯明显

      Led=0;

      PCON&=~0x20;//清除LVDF标志

      WDT_CONTR=0x2D;//开启软看门狗,2s复位1次

     RSTFLAG|=0x04;//清除复位标志,否则直接进入ISP模式

   while(1)

    {

       if(P20==0)//开启硬件复位键RST(P5_4)脚

       {

         RSTCFG=0x50;  //开启硬复位

         RSTFLAG|=0x04;//清除复位标志,否则直接进入ISP模式

       }

       if(P21==0)//自定义脚P21具有软件复位功能

       {

         IAP_CONTR|=0x20;//开启软复位

         //IAP_CONTR|=0x60;//软复位后直接进入ISP模式

       }

       if(P22==1)

       {

         WDT_CONTR=0x3D;//喂狗,置位CLR_WDT,和清除标志位WDT_FLAG

       }

       if(P23==0)//LVD

       {

          RSTCFG=0x03; //开启低压3.3V

          PCON&=~0x20;//清除LVDF标志

           ELVD=1;//开低压中断

           EA=1;//开总中断

       }

       

      }

}

void init_IO()

{

   //RSTCFG=0x50  开启RST键进入ISP模式

   P0M1 = 0x00;   P0M0 = 0x00;   //设置P0口为准双向口

   P1M1 = 0x00;   P1M0 = 0x00;   //设置P1口为准双向口

   P5M1 = 0x00;   P5M0 = 0x00;   //设置P5口为准双向口

}

void Delay1ms(unsigned char x)    //@12.000MHz

{

   unsigned char i, j;

   i = 16;

   j = 147;

   while(x--)

   {

      do

      {

        while (--j);

      } while (--i);

   } 

}

猜你喜欢

转载自blog.csdn.net/qq_21082985/article/details/131997670
今日推荐