CC2530看门狗

看门狗介绍

看门狗(Watch Dog Timer, WDT) 是单片机的一个重要组成部分,其实质是一个计数器(看门狗定时器和普通的定时器并无本质区别),一般给看门狗一个大数,程序开始运行后,看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0,就认为程序没有正常工作,将强制整个系统复位。

例如,有个模块设备进行减一计数,例如从1000减到0,当减到0时,认为系统异常,执行相应操作。若系统正常,每隔一段时间就给重新计数,就是在值还没有减到0的时候,重新给一个值1000.即在正常情况下,设备的值始终无法减到0。

现实中因为一些外部因素,电子设备经常会跑飞或者死机(譬如极端炎热、极端寒冷、工业复杂场合等这些极端恶劣工作环境或高可靠性要求的环境)。在这种情况下我们希望设备自动复位而不需要人工干预(无人值守)。看门狗用来完成这个工作。如果看门狗不需要应用,可配置成看门狗定时器用做间隔定时,在选定时间间隔产生中断。

实验硬件资源

在这里插入图片描述

CC2530的watchdong介绍

看门狗模块具有的特性:四个可选的定时器间隔、看门狗模式、定时器模式、在定时器模式下产生中断请求。
WDT 可以配置为一个看门狗定时器或一个通用的定时器。 WDT 模块的运行由 WDCTL 寄存器控制。

看门狗模式

在系统复位之后,看门狗定时器就被禁用。要设置WDT 在看门狗模式,必须设置WDCTL.MODE[1:0]位为10 。然后看门狗定时器的计数器从0 开始递增。在看门狗模式下,一旦定时器使能,就不可以禁用定时器,因此,如果WDT 位已经运行在看门狗模式下,再往WDCTL.MODE[1:0]写入00 或10 就不起作用了。
WDT 运行在一个频率为32.768 kHz(当使用32 kHz XOSC)的看门狗定时器时钟上。这个时钟频率的超时期限等于1.9ms,15.625 ms,0.25 s 和1s,分别对应64,512,8192 和32768 的计数值设置。如果在计数器达到选定定时器的间隔值之内,执行一个看门狗清零(喂狗)操作,计数器就复位到0,并重新递增。如果没有在选定定时器的间隔值之内清零(喂狗),看门狗定时器就会复位系统(相当于重启系统)
在这里插入图片描述

定时器模式

要在一般定时器模式下设置 WDT,必须把 WDCTL.MODE[1:0]位设置为 11。定时器就开始,且计数器从 0 开始递增。当计数器达到选定间隔值,定时器将产生一个中断请求( IRCON2.WDTIF/IEN2.WDTIE)。在定时器模式下,可以通过写入 1 到 WDCTL.CLR[0]来清除定时器内容。当定时器被清除,计数器的内容就置为 0。写入 00 或 01 到 WDCTL.MODE[1:0]来停止定时器,并清除它为 0。定时器间隔由 WDCTL.INT[1:0]位设置。在定时器操作期间,定时器间隔不能改变,且当定时器开始时必须设置。在定时器模式下,当达到定时器间隔时,不会产生复位。注意如果选择了看门狗模式,定时器模式不能在芯片复位之前选择。

注意: 如果看门狗模式被选择,那只能等到芯片 reset 之后定时器模式才能被选择

寄存器

在这里插入图片描述

看门狗使用方法

  • (1)系统时钟频率选择:32KHz
    CLKCONCMD &=0x80;

  • (2)设置WDT 工作模式和定时时间间隔设置
    设置WDT 为看门狗模式,设置WDCTL.MODE[1:0]位为10
    WDCTL = 0x00;
    WDCTL = 0x08;//要设定定时时间间隔为1s,即看门狗复位的时间,设置WDVTL.INT[1:0]位为00,

  • (3)喂狗设置
    在一个看门狗时钟周期内,写入0x0A 到WDCTL.CLR[3:0],然后写入0x05 到同一个寄存器位;
    WDCTL |= 0xA0;
    WDCTL |= 0x50;

关键代码

/*****************************
看门狗 initialization function
******************************/
void Init_Watchdog(void) 
{ 
  WDCTL = 0x00; //这是必须的,打开IDLE才能设置看门狗
  WDCTL |= 0x08;时间间隔一秒,看门狗模式  
}

/*****************************
喂狗 initialization function
******************************/
void FeetDog(void) 
{ 
  WDCTL = 0xa0; 
  WDCTL = 0x50; 
}

/****************************
//主函数
*****************************/
void main()
{
  Init_Led();
  Init_Watchdog();
  
  P0_0 = 1;       //LED1-link 点亮
  P2_0 = 1;
  Delay(500);
  while(1)
  {
    P0_0 = 0;         //指示效果
    P2_0 = 0;         //LED2-data 点亮
    Delay(500);
    //通过注释测试,观察LED1/2,系统在不停复位灯会闪烁。
    FeetDog( );      //防止程序跑飞
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值