zigbee笔记:六、看门狗定时器(Watch Dog)

一、看门狗基础

1、看门狗功能:

        由于单片机的工作常常会受到来自外界电磁场的干扰,造成各种寄存器和内存的数据混乱,会导致程序指针错误等,程序运行可能会陷入死循环。程序的正常运行被打断,由单片机控制的系统无法继续正常工作,导致整个系统的陷入停滞状态。此时往往需要重启,使得程序回归正常的运行状态。看门狗就是为了预防程序运行混乱和陷入死循环的情况, 当发生情况时,能够重启统。

2、看门狗本质:

        看门狗本质是一个定时器。看门狗定时器正常工作时自动计数,程序正常运行时定期将其复位清零(称为“喂狗”),如果系统在某处卡死或跑飞,该定时器将溢出(未及时“喂狗”),看门狗定时器就为系统产生一个复位信号,使系统复位,然后重新恢复正常的工作状态。

二、cc2530 看门狗

        1、cc2530看门狗资源

        cc2530的看门狗定时器包括一个 15 位计数器,它的频率由 32kHz 时钟源提供。看门狗(WDT)可以配置为一个看门狗定时器或一个通用的定时器,但用户不能获得 15 位计数器的内容。具有四个特性:

  • 四个可选的定时器间隔
  • 看门狗模式
  • 定时器模式
  • 在定时器模式下产生中断请求

        (1)看门狗模式:WDT运行在一个频率为32.768KHz(当使用32KHz XOSC)的看门狗定时器时钟上,当软件在选定时间间隔内不能清除WDT时,计数器达到选定定时器的间隔值后,看门狗定时器就为系统产生一个复位信号,系统复位。

        (2)定时器模式:WDT运行在一个频率为32.768KHz(当使用32KHz XOSC)的看门狗定时器时钟上,可以被配置为一个间隔定时器,有四个超时期限可以配置1.9ms,15.625ms,0.25s,1s。这样可以用于在选定的时间间隔产生中断。

        2、寄存器

        WDT可以配置为一个看门狗定时器或一个通用的定时器,运行模式由WDCTL寄存器控制。

        (1)WDCTL.MOED[1:0]该位用于启动WDT处于看门狗模式还是定时器模式。

        (2)WDCTL.INT[1:0]该位选择定时器间隔定义为32 kHz振荡器周期的规定数,有4个时间间隔供选择。

        (3)WDCTL.CLR[3:0]当运行在定时器模式,定时器可以通过写1到CLR[0](不管其他3位)被清除为0x0000(但是不停止);当运行在看门狗模式,写入 0xA 到 WDCTL.CLR[3:0],然后在一个看门狗周期写入 0x5 到同一个寄存器位,定时器计数就可以被清除(计数归零)。

        3、看门狗模式

        在系统复位之后,看门狗定时器就默认被禁用。要设置 WDT 在看门狗模式,必须设置 WDCTL.MODE[1:0]位为 10 。然后看门狗定时器的计数器从 0 开始递增。

        在看门狗模式下,计数器达到选定定时器的间隔值,看门狗定时器就为系统产生一个复位信号。如果在计数器达到选定 定时器的间隔值之前,执行了一个看门狗清除序列,计数器就复位到 0,重新计数。
        看门狗清除:在一个看门狗时钟周期内,写入 0xA 到 WDCTL.CLR[3:0],然后写入 0x5 到同一个寄存器位。如果这个序列没 有在看门狗周期结束之前执行完毕,看门狗定时器就为系统产生一个复位信号。

   使用代码如下所示:


#include <ioCC2530.h>#define uint unsigned int
#define uchar unsigned char//定义控制LED灯的端口
#define LED1 P1_0
#define LED2 P1_1    //定义LED2为P11口控制//函数声明
void Delayms(uint xms);        //延时函数
void InitLed(void);        //初始化P1口/****************************
//延时函数
*****************************/
void Delayms(uint xms)   //i=xms 即延时i毫秒
{uint i,j;for(i=xms;i>0;i--)for(j=587;j>0;j--);
} //初始化LED灯
void InitLed(void)
{P1DIR |= 0x03;    //P1_0、P1_1定义为输出P1INP |= 0X03;    //打开下拉 LED1 = 0;         //LED1灯熄灭LED2 = 0;        //LED2灯熄灭
}//初始化看门狗
void Init_Watchdog(void) 
{ WDCTL = 0x00; //这是必须的,打开IDLE才能设置看门狗WDCTL |= 0x08; //00001000设置看门狗模式,选择时间间隔一秒
}//喂狗函数,即看门狗清除
void FeetDog(void) 
{ 
//在一个看门狗时钟周期内,写入 0xA 到 WDCTL.CLR[3:0],然后写入 0x5 到同一个寄存器位。WDCTL = 0xa0; WDCTL = 0x50; 
}void main(void)
{InitLed();        //调用初始化函数Init_Watchdog();LED1=1;while(1){         LED2=~LED2;           //仅指示作用。Delayms(300);LED1=0;//通过注释测试,观察LED1,系统在不停复位。FeetDog();//防止程序跑飞}
}

        注意:在看门狗模式下,一旦定时器使能,就不可以禁用定时器,因此,如果 WDT 位已经运行在看门狗模式下 ,再往 WDCTL.MODE[1:0]写入 00 或 10 就不起作用了。

        4、普通定时器模式

        当我们的程序不需要看门狗时,WDT可以被设置为一般的定时器使用,把 WDCTL.MODE[1:0]位设置为 11,WDT被设置为一般定时器模式,定时器间隔由 WDCTL.INT[1:0]位设置。定时器就开始后从 0开始计数,当计数器达到选定间隔值,定时器将产生一个中断请求(IRCON2.WDTIF/IEN2.WDTIE)。
        在定时器模式下,可以通过写入 1 到 WDCTL.CLR[0]来清除定时器内容。当定时器被清除,计数器的内容就置为 0。写入 00 或 01 到 WDCTL.MODE[1:0]来停止定时器,并清除它为 0。

        使用代码如下所示:通过看门狗定时器实现LED灯1s周期性闪烁

#include<iocc2530.h>#define LED P1_1void initLED()
{P1SEL &=~0X1B;P1DIR |=0x1B; P1 &=~0X1B;
}void initWDT()
{WDCTL =0X0C; //00001100   配置看门狗模式以及间隔时间IEN2 |=0X20;  //看门狗的中断控制为5   0010 0000EA=1;         //打开总中断
}#pragma vector = WDT_VECTOR 	//WDT中断服务函数
__interrupt void WDT_more()
{WDTIF=0;            //清除标志位LED=~LED;
}void main()
{initLED();initWDT();while(1){}
}


        注意:在定时器操作期间,定时器间隔不能改变,且当定时器开始时必须设置。在定时器模式下,当达到定时器间隔时,不会产生复位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/369456.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven设置阿里云镜像源(加速)

一、settings.xml介绍 settings.xml是maven的全局配置文件&#xff0c;maven的配置文件存在三个地方 项目中的pom.xml&#xff0c;这个是pom.xml所在项目的局部配置文件用户配置&#xff1a;${user.home}/.m2/settings.xml全局配置&#xff1a;${M2_HOME}/conf/settings.xml 优…

QT实现GIF动图显示(小白版,可直接copy使用)

需要你自己提前设置好动图的位置&#xff0c;本例中存放于"/Users/PLA/PLA/PLA.gif widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMovie> #include <QLabel>class Widget : public QWidget {Q_OBJECTpublic:explicit Wid…

六西格玛项目实战:数据驱动,手机PCM率直线下降

在当前智能手机市场日益竞争激烈的背景下&#xff0c;消费者对手机质量的要求达到了前所未有的高度。PCM&#xff08;可能指生产过程中的某种不良率或缺陷率&#xff09;作为影响手机质量的关键因素&#xff0c;直接关联到消费者满意度和品牌形象。为了应对这一挑战&#xff0c…

系统工程与信息系统基础(下)

目录 政府信息化和电子政务 企业信息化和电子商务 基本的逻辑和流程 信息化的概念 信息化的目的和涉及得三类创新 信息化需求的三个层次 企业信息化的方法 信息系统战略规划——方法 BI&#xff08;商业智能&#xff09; 数据挖掘 数据湖 BPR&#xff08;业务流程重…

物联网工业级网关解决方案 工业4G路由器助力智慧生活

随着科技的飞速发展&#xff0c;无线通信技术正逐步改变我们的工作与生活。在这个智能互联的时代&#xff0c;一款高性能、稳定可靠的工业4G路由器成为了众多行业不可或缺的装备。工业4G路由器以其卓越的性能和多样化的功能&#xff0c;助力我们步入智慧新纪元。 一、快速转化&…

TikTok马来西亚直播网络怎么配置?

TikTok是一款全球流行的社交媒体应用&#xff0c;在东南亚地区拥有大量用户。在马来西亚这个多元化的国家&#xff0c;配置高效稳定的直播网络对TikTok的运营至关重要。 配置马来西亚直播网络的必要性 广泛的地理覆盖&#xff1a;马来西亚包括大片陆地和众多岛屿&#xff0c;网…

CenterOS7安装java

CenterOS7安装java #进入安装目录 cd /usr/local/soft/java#wget下载java8 #直接进入官网选择相应的版本进行下载&#xff0c;然后把下载链接复制下来就可以下载了 #不时间的下载链接不一样 wget http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c9…

Vue报错:Module not found: Error: Can‘t resolve ‘less-loader‘ in ‘文件地址‘

原因&#xff1a;Webpack无法找到 less-loader 模块&#xff0c;但在<style langless></style>中进行使用。less-loader 是一个Webpack的加载器&#xff0c;它用于将less文件编译成CSS。如果Webpack无法解析这个加载器&#xff0c;它就无法处理less文件&#xff0c…

ELK日志实时监控

目录 一、ELK/EFK简介 1.1 什么是ELK/EFK? 1.2 常见架构 1、Elasticsearch Logstash Kibana 2、Elasticsearch Logstash Filebeat Kibana 3、Elasticsearch Logstash Filebeat Kibana Redis 4、Elasticsearch Fluentd Filebeat Kibana 1.3 基本流程 二、…

PEFT - 安装及简单使用

LLM、AIGC、RAG 开发交流裙&#xff1a;377891973 文章目录 一、关于 PEFT二、安装1、使用 PyPI 安装2、使用源码安装 三、快速开始1、训练2、保存模型3、推理4、后续步骤 本文翻译整理自&#xff1a;https://huggingface.co/docs/peft/index 一、关于 PEFT &#x1f917;PEFT…

论文导读 | 综述:大模型与推荐系统

最近&#xff0c;预训练语言模型&#xff08;PLM&#xff09;在自然语言处理领域取得了巨大成功&#xff0c;并逐渐引入推荐系统领域。本篇推文介绍了最近的两篇预训练语言模型和推荐系统结合的综述&#xff1a; [1] Pre-train, Prompt, and Recommendation: A Comprehensive …

鼠标自动点击器怎么用?鼠标连点器入门教程!

鼠标自动点击器是适用于Windows电脑的自动执行鼠标点击操作的工具&#xff0c;主要用于模拟鼠标点击操作&#xff0c;实现鼠标高速点击的操作。通过模拟鼠标点击&#xff0c;可以在用户设定的位置、频率和次数下自动执行点击动作。 鼠标自动点击器主要的应用场景&#xff1a; …

2024年7月5日 (周五) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 《乐高地平线大冒险》为何不登陆…

专题三:Spring源码中新建module

前面我们构建好了Spring源码&#xff0c;接下来肯定迫不及待来调试啦&#xff0c;来一起看看大名鼎鼎ApplicationContext 新建模块 1、基础步骤 1.1 自定义模块名称如&#xff1a;spring-self 1.2 选择构建工具因为spring使用的是gradle&#xff0c;所以这边需要我们切换默认…

【Linux开发】基于ALSA库实现音量调节

基于ALSA库实现音量调节 ALSA库实现音量调节1、使用alsamixer工具查看音频接口2、完整代码2.1、snd_mixer_open2.2、snd_mixer_attach、2.3、snd_mixer_selem_register2.4、snd_mixer_load2.5、snd_mixer_first_elem/snd_mixer_elem_next2.6、snd_mixer_selem_get_playback_vol…

【Spring Boot】统一数据返回

目录 统一数据返回一. 概念二.实现统一数据返回2.1 重写responseAdvice方法2.2 重写beforeBodyWriter方法 三. 特殊类型-String的处理四. 全部代码 统一数据返回 一. 概念 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维&#xff0c;简单…

【原创图解 算法leetcode 146】实现一个LRU缓存淘汰策略策略的数据结构

1 概念 LRU是Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0c;是一种常见的缓存淘汰算法。 其核心思想为&#xff1a;当内存达到上限时&#xff0c;淘汰最久未被访问的缓存。 2 LeetCode LeetCode: 146. LRU缓存 3 实现 通过上面LRU的淘汰策略可知&#…

【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树

目录 1 -> 底层结构 2 -> AVL树 2.1 -> AVL树的概念 2.2 -> AVL树节点的定义 2.3 -> AVL树的插入 2.4 -> AVL树的旋转 2.5 -> AVL树的验证 2.6 -> AVL树的性能 1 -> 底层结构 在上文中对对map/multimap/set/multiset进行了简单的介绍&…

【遇坑笔记】Node.js 开发环境与配置 Visual Studio Code

【遇坑笔记】Node.js 开发环境与配置 Visual Studio Code 前言node.js开发环境配置解决pnpm 不是内部或外部命令的问题&#xff08;pnpm安装教程&#xff09;解决 pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。 vscode 插件开…

爆!Java高级特性之Stream API详解

爆&#xff01;Java高级特性之Stream API详解 Java 8引入的Stream API可以说是一个革命性的特性,让我们告别了又臭又长的for循环,迎来了函数式编程的春天。今天就让我们来一起深入了解这个让人又爱又恨的Stream API吧! 什么是Stream? Stream就像一个高级的迭代器,允许我们以…