CC2530基础实验:(12)看门狗

  目录

        前言

        、实验相关理论与寄存器

        、源码分析


前言

        看门狗是在软件跑飞的情况下 CPU 自恢复的一个方式,当软件在选定的时间间隔内不能置位看门狗定时器(WDT), WDT 就复位系统。看门狗可用于电噪声,电源故障或静电放电等恶劣工作环境或高可靠性要求的环境。如果系统不需要应用到看门狗,则 WDT 可配置成间隔定时器,在选定时间间隔内产生中断。 WDT 的特性如下: 4 个可选择的时间间隔看门狗定时器模式下产生中断请求时钟独立于系统时钟, WDT 包括一个 15 位定时/计数器,它的频率由 32.768KHz 的晶振决定。
        该实验过程及结果是:初始化看门狗并设置 1s 种的喂狗期限,如果整个工程执行过程中超过 1s 并且没有喂狗,看门狗 timer 就会产生一个系统 reset 信号让系统重置。 D1 默认是熄灭状态, 正常工作时应该一直是点亮, 由于没有喂狗,系统一直重启, 所以一熄一亮造成 D1 闪烁;如果喂狗,则 D1 和 D2 常亮。

一、实验相关理论与寄存器

1.看门狗概述

        在 CPU 可能受到一个软件颠覆的情况下,看门狗定时器( WDT)用作一个恢复的方法。当软件在选定时间间隔内不能清除 WDT 时, WDT 必须就复位系统。看门狗可用于受到电气噪音、电源故障、静电放电等影响的应用,或需要高可靠性的环境。如果一个应用不需要看门狗功能,可以配置看门狗定时器为一个间隔定时器, 这样可以用于在选定的时间间隔产生中断。
        看门狗定时器的特性如下:
        ● 四个可选的定时器间隔
        ● 看门狗模式
        ● 定时器模式
        ● 在定时器模式下产生中断请求
        WDT 可以配置为一个看门狗定时器或一个通用的定时器。 WDT 模块的运行由 WDCTL 寄存器控制。看门狗定时器包括一个 15 位计数器,它的频率由 32kHz 时钟源规定。注意用户不能获得 15 位计数器的内容。在所有供电模式下,15 位计数器的内容保留,且当重新进入主动模式,看门狗定时器继续计数。

2.看门狗模式

        在系统复位之后,看门狗定时器就被禁用。要设置 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,继续递增。看门狗清除的序列包括在一个看门狗时钟周期内,写入 0xA 到WDCTL.CLR[3:0],然后写入 0x5 到同一个寄存器位。如果这个序列没有在看门狗周期结束之前执行完毕,看门狗定时器就为系统产生一个复位信号。当看门狗模式下, WDT 使能,就不能通过写入 WDCTL.MODE[1:0]位改变这个模式,且定时器间隔值也不能改变。
        在看门狗模式下, WDT 不会产生一个中断请求。

3.定时器模式

        要在一般定时器模式下设置 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 之后定时器模式才能被选择

        相关寄存器WDCTL如下表所示:

寄存器描述
WDCTL(0xC9)
看门狗定时器
控制

Bit[7:4]

清除定时器。当 0xA 跟随 0x5 写到这些位,定时器被清除(即加载 0)。注意定时器仅写入 0xA 后,在 1个看门狗时钟周期内写入 0x5 时被清除。当看门狗定时器是 IDLE 位时写这些位没有影响。当运行在定时器模式,定时器可以通过写 1 到 CLR[0](不管其他 3位)被清除为 0x0000(但是不停止)。

Bit[3:2]模式选择。该位用于启动WDT处于看门狗模式还是定时器模式。当处于定时器模式,设置这些位为IDLE将停止定时器。注意:当运行在定时器模式时要转换到看门狗模式,首先停止WDT,然后启动WDT处于看门狗模式。当运行在看门狗模式,写这些位没有影响。
00: IDLE          01: IDLE(未使用,等于00设置)
10:看门狗模式 11: 定时器模式
Bit[1:0]定时器间隔选择。这些位选择定时器间隔定义为32kHz振荡器周期的规定数。注意间隔只能在WDT处于IDLE时改变,这样间隔必须在定时器启动的同时设置。
00: 定时周期× 32,768 (~1 s)当运行在32 kHz XOSC
01: 定时周期× 8192 (~0.25 s)
10: 定时周期× 512 (~15.625 ms)
11: 定时周期× 64 (~1.9 ms)

按照表格寄存器内容,我们对 WDCTL 具体配置可如下:
喂狗配置:

WDCTL = 0x00; //打开 IDLE 才能设置看门狗
WDCTL |= 0x08; //定时器间隔选择,间隔一秒

停止喂狗:

WDCTL = 0xa0; //清除定时器。当 0xA 跟随 0x5 写到这些位,定时器被清除
WDCTL = 0x50;

二、源码分析

main.c文件如下

/****************************************************************************
* 文 件 名: main.c
* 描    述: 打开看门狗后,得记得喂狗,不然系统就会不停地复位了
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar; //节省运算空间
typedef unsigned int  uint;

#define LED1 P1_0       // P1.0口控制LED1
#define LED2 P1_1       // P1.1口控制LED2

/程序入口函数
void main(void)
{
    InitLed();		//调用初始化函数
    Init_Watchdog();

    while(1)
    {         
        DelayMS(300);
        LED1 = 0;
               
        //FeetDog();     //注释FeetDog函数时系统不断复位,LED1灯闪烁
        //打开FeetDog的注释,喂狗系统将不再主动复位,D1和D2灯不闪烁长亮

    }
}

/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时 16M时约为535,系统时钟不修改默认为16M
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x03;      //P1.0、P1.1定义为输出
    LED1 = 1;           //默认LED灯为熄灭状态
    LED2 = 1;
}


void Init_Watchdog(void) 
{ 
    WDCTL = 0x00;       //打开IDLE才能设置看门狗
    WDCTL |= 0x08;      //定时器间隔选择,间隔一秒
}

void FeetDog(void) 
{ 
    WDCTL = 0xa0;       //清除定时器。当0xA跟随0x5写到这些位,定时器被清除
    WDCTL = 0x50; 
    LED2 = 0;           //系统不复位LED2灯长亮
}



  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
内容涵盖了TI协议栈工具的使用、基础实验、组网演练和项目实战,从入门到进阶再到应用,全面扫盲。可以说是网上唯一涵盖内容最全的ZigBee学习电子书。 基于TI公司的CC2530芯片及其协议栈Z-stack,开发环境是IAR。也是国内资料最全、最流行的方案。所有相关软件和工具使用方法都在 《ZigBee实战演练》中详细讲述。为了让大家更好地了解网蜂的教程和资源,下面我们对pdf文档和实例代码等资源来一个简单的介绍: 1、CC2530集成了增强型C8051内核,可以理解成单片机+无线模块的组合,我们可以使用IAR开发自己的软件代码。为此,我们实验代码分三部分,分别是:基础实验(含点亮第一个LED、按键、外部中断、定时器、串口通讯、AD控制(自带温度计)、睡眠唤醒、看门);组网演练(含Zigbee 协议栈简介、无线点灯、信号传输质量检测、协议栈工作原理介绍、协议栈中的串口实验、一小时实现无线数据传输、串口透传,打造无线串口模块)和项目实战(含组网状态实时显示系统、无线IC卡考勤机、串口通讯助手==Zigbee聊天助手、无线互联:ZigBee+GPRS、室内定位系统等),部分内容还在不断完善升级中。其中组网实验全部基于TI自带协议栈实现,其中一小时实现无线数据传输、串口透传,打造无线串口模块更是网蜂团队在Z-stack中提取的精华。务求让大家尽快上手,领略ZigBee魅力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值