「STC8A8K64D4开发板」第2-7讲:看门狗定时器

news2025/6/3 23:44:20

第2-7讲:看门狗定时器

    1. 学习目的
  1. 了解看门狗定时器的作用。
  2. 掌握看门狗定时器的应用和使用步骤。
    1. 看门狗定时器原理
  1. 看门狗定时器的作用

看门狗定时器(WDT:Watchdog Timer)的作用是在发生软件故障时(如程序陷入死循环或者程序跑飞),强制复位单片机,让单片机重新运行程序。

看门狗定时器本质上是一个计数器,只不过这个计数器的作用是固定的,一旦计数值递增达到设定的值(向上计数)或者计数值递减到0(向下计数),即“超时”时,看门狗定时器产生复位信号,复位系统。

程序正常运行时,会在看门狗定时器“超时”前清零计数值(向上计数)或重装计数值(向下计数),俗称“喂狗”。这样就保证了看门狗定时器永不会“超时”,而一旦程序运行出现故障,无法正常“喂狗”时,看门狗定时器最终会“超时”复位系统,使系统从头开始运行。

  1. STC8A8K64D4看门狗定时器

STC8A8K64D4的看门狗功能比较简单,使用时只需配置看门狗控制寄存器“WDT_CONTR”即可。

看门狗控制寄存器:

  1. WDT_FLAG:看门狗溢出标志。

看门狗发生溢出时,硬件自动将此位置 1,需要软件清零。

  1. EN_WDT:看门狗使能位。

0:对单片机无影响。

1:启动看门狗定时器。

看门狗启动有两种方式:软件启动和硬件启动,软件启动方式只需把看门狗使能位“EN_WDT”设置为1就可以了。

WDT_CONTR |= 0x10;

硬件启动方式在使用STC-ISP软件下载时设置,如下图所示,勾选“上电复位时由硬件自动启动看门狗”选项即可。

图1:硬件启动看门狗

  1. CLR_WDT:看门狗定时器清零。

0: 对单片机无影响。

1: 清零看门狗定时器,硬件自动将此位复位。

  1. IDL_WDT:IDLE 模式时的看门狗控制位。

0:IDLE 模式时看门狗停止计数。

1:IDLE 模式时看门狗继续计数。

  1. WDT_PS[2:0]:看门狗定时器时钟分频系数。

分频系数决定了看门狗的溢出时间,其计算公式如下:

 

下面列出了12M和24M主频时,不同的分频系数对应的看门狗溢出时间。

表1:不同主频和分频系数时看门狗溢出时间

WDT_PS[2:0]

分频系数

12M 主频时的溢出时间

24M主频时的溢出时间

000

2

≈65.5毫秒

≈32.7毫秒

001

4

≈131毫秒

≈65.5毫秒

010

8

≈262毫秒

≈131毫秒

011

16

≈524毫秒

≈262毫秒

100

32

≈1.05秒

≈524毫秒

101

64

≈2.1秒

≈1.05秒

110

128

≈4.2秒

≈2.1秒

111

256

≈8.39秒

≈4.2秒

    1. 软件设计
      1. 看门狗应用步骤

使用看门狗的时候,只需配置看门狗控制寄存器“WDT_CONTR”就可以了。在配置前,我们需要确定以下几点:

  1. 确定自己的程序中需要设置多长时间的溢出时间,以此来配置看门狗定时器的分频系数。
  2. IDLE 模式时看门狗是否计数。
  3. 确定合适的喂狗时机(看门狗定时器清零“CLR_WDT”位置位即可喂狗),确保程序在正常运行时,在溢出时间内至少执行一次喂狗操作。

配置完成后,看门狗使能位“EN_WDT”设置为1启动看门狗即可。此后,若单片机软件运行出现故障,无法正常喂狗,看门狗溢出后会强制复位单片机,让单片机重新运行程序。

      1. 看门狗实验
  • 注:本节的实验是在“实验2-3-2:触摸按键检测”的基础上修改,本节对应的实验源码是:“实验2-7-1:看门狗实验”。
        1. 实验内容

配置看门狗超时时间为2.1秒,即程序运行时2.1秒不执行喂狗操作,系统复位。看门狗在IDLE 模式时看门狗定时器不计数。

为了观察到复位现象,程序启动后,D1闪烁4次,指示系统启动,之后初始化并启动看门狗,每按动一次KEY1按键执行一次喂狗,如果连续在2.1秒内按动KEY1按键喂狗,系统不会复位,如果2.1秒内不按动KEY1按键喂狗,系统会复位重新启动,可以看到D1闪烁4次。

        1. 代码编写
  1. 新建一个名称为“wdt.c”的文件及其头文件“wdt.h”并保存到工程的“Source”文件夹,并将“wdt.c”加入到Keil工程中的“SOURCE”组。
  2. 引用头文件

因为在“main.c”文件中使用了“wdt.c”文件中的函数,所以需要引用下面的头文件“wdt.h”。

代码清单:引用头文件

  1. //引用看门狗的头文件  
  2. #include    "wdt.h"  

  1. 初始化并启动看门狗

看门狗初始化函数代码清单如下,配置看门狗溢出时间为2.1秒,初始化完成后启动了看门狗。

代码清单:初始化并启动看门狗

  1. /************************************************************************************* 
  2.  * 描  述 : 初始化并启动看门狗 
  3.  * 入  参 : 无 
  4.  * 返回值 : 无 
  5.  ************************************************************************************/  
  6. void wdt_init(void)  
  7. {     
  8.     WDT_CONTR &= 0xF7;          //IDLE_WDT位置0,看门狗定时器在空闲模式下不计数  
  9.     WDT_CONTR &= 0xF8;          //配置分频系数,先清零配置位PS2~PS0,再写入配置  
  10.     WDT_CONTR |= 0x06;          //PS2~PS0配置为110,即看门狗溢出时间为2.1秒  
  11.     WDT_CONTR &= 0x7F;          //WDT_FLAG位置0,看门狗溢出标志位清零  
  12.     WDT_CONTR |= 0x20;          //EN_WDT位置1,开启看门狗定时器  
  13. }  
  1. 初始化并启动看门狗

主函数中加入系统启动指示,以方便观察系统复位。接着,调用wdt_init()函数初始化并启动WDT,之后在循环查询按键S3状态,若检测到按键S3按下后,则执行喂狗操作。

代码清单:主函数

  1. /************************************************************************** 
  2. 功能描述:主函数 
  3. 入口参数:无 
  4. 返回值:int类型 
  5.  *************************************************************************/  
  6. int main(void)  
  7. {  
  8.    ……
  9.    //闪烁指示灯D1表示系统启动,方便观察系统复位
  10.    for(i=0;i<8;i++)  
  11.    {  
  12.      led_toggle(LED_1);  
  13.      delay_ms(100);  
  14.    }  
  15.    wdt_init();                     //初始化并启动看门狗  
  16.    while(1)  
  17.    {  
  18.      temp=buttons_scan(0);              //获取开发板用户按键检测值,不支持连按  
  19.      if(temp == BUTTON1_PRESSED)        //如果按键KEY1按下  
  20.      {  
  21.         led_toggle(LED_2);              //控制用户指示灯D2翻转  
  22.         wdt_feed();                     //喂狗
  23.      }   
  24.    }  
  25. }  
        1. 硬件连接

本实验需要使用LED指示灯和按键,因此需要用跳线帽短接复用引脚的指示灯(D1和D2)和按键(KEY1),如下图所示。

图2:跳线帽短接

        1. 实验步骤
  1. 解压“…\第3部分:配套例程源码”目录下的压缩文件“实验2-7-1:看门狗实验”,将解压后得到的文件夹拷贝到合适的目录,如“D\STC8”(这样做的目的是为了防止中文路径或者工程存放的路径过深导致打开工程出现问题)。
  2. 双击“…\wdt\Project\object”目录下的工程文件“wdt.uvproj”。
  3. 点击编译按钮编译工程,编译成功后生成的HEX文件“wdt.hex”位于工程的“…\wdt \project”目录下。
  4. 打开STC-ISP软件下载程序,下载使用内部IRC时钟,IRC频率选择:24MHz。
  5. 程序运行后,可以观察到D1指示灯闪烁4次,之后熄灭,指示系统复位启动。
  1. 连续在每个2.1秒内按动KEY1按键执行喂狗操作,系统不会复位。
  2. 2.1秒内不按动KEY1按键,看门狗溢出,系统复位重新启动,可观察到D1闪烁4次。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang-语言源码级调试器 Delve

前言 Go 目前的调试器有如下几种&#xff1a; GDB 最早期的调试工具&#xff0c;现在用的很少。LLDB macOS 系统推荐的标准调试工具&#xff0c;单 Go 的一些专有特性支持的比较少。Delve 专门为 Go 语言打造的调试工具&#xff0c;使用最为广泛。 本篇简单说明如何使用 Del…

printf %.*s 原来是这样

今天看代码时&#xff0c;看到这样一个printf&#xff0c;以前没见过这样的&#xff0c;也没这样用过&#xff0c;一下子还真不知道是什么意思&#xff1a; // Response is received. Print it struct mg_http_message *hm (struct mg_http_message *) ev_data; printf("…

今年的Prime Day2.0来了!亚马逊卖家爆单必做…

亚马逊的Prime Day已经成了全行业的零售假日&#xff0c;不仅仅是消费者离不开它&#xff0c;卖家也离不开这一年一度的狂欢销售盛宴。 回看刚刚过去的Prime Day大促&#xff0c;亚马逊在各方面都获得了较为不错的成绩。 根据亚马逊官方消息&#xff0c;在2023亚马逊Prime会员…

【网络】高级IO

目录 一、五种IO模型 1、阻塞IO 2、非阻塞IO 3、信号驱动 4、IO多路转接 5、异步IO 6、总结 二、高级IO重要概念 1、同步通信与异步通信 2、阻塞 vs 非阻塞 三、非阻塞IO 1、fcntl 2、实现函数SetNoBlock 四、IO多路转接select 1、select 1.1、参数解释 1.2、…

生信豆芽菜——配对型的复杂箱线图使用说明

网站&#xff1a;http://www.sxdyc.com/visualsBoxHalfPlot 一、配对型的复杂箱线图简介 配对型的复杂箱线图原理与箱线图相同&#xff0c;常见于配对样本的数据分析中&#xff0c;在日常研究中&#xff0c;我们会碰到配对资料&#xff0c;例如同一病人治疗前后的变化&#xff…

链表数组OJ题汇总

前言&#xff1a; 在计算机科学中&#xff0c;数组和链表是两种常见的数据结构&#xff0c;用于存储和组织数据。它们分别具有不同的特点和适用场景。 本博客将深入讨论数组和链表在OJ题目中的应用。我们将从基本概念开始&#xff0c;介绍数组和链表的定义和特点&#xff0c;并…

CSDN 我的资源在哪儿?资源上传后找不到?审核是否通过?

CSDN 我的资源在哪儿&#xff1f;资源上传后找不到&#xff1f;审核是否通过&#xff1f; 你是不是很奇怪&#xff0c;资源上传后&#xff0c;找不到了&#xff01;因为他在你们的数据里面不叫“资源”&#xff0c;而是叫“下载”。反正就是怪怪的。 在哪儿查找我的资源&…

力扣221.最大正方形(动态规划)

思路&#xff1a; 思路&#xff1a;从[0,0]元素开始&#xff0c;计算每个元素对应其与[0,0]之间矩阵块中最大正方形边长情况&#xff1a;1&#xff09;matrix [ i , j ] ‘0’ --> 元素对应的最大正方形为0。情况&#xff1a;2&#xff09;matrix [ i , j ] ‘1’ -->…

Java基础入门篇——修饰符

在Java中&#xff0c;修饰符&#xff08;Modifiers&#xff09;是一种用于修改类、方法、变量和其他实体的访问权限、行为或特性的关键字。Java提供了一组修饰符&#xff0c;可以用于实现对代码的封装、继承、多态和访问控制等功能。 1、访问修饰符&#xff08;Access Modifie…

如何将视频转换成音频mp3格式?试一下这几种转换方法

MP3格式是一种被广泛使用的音频格式&#xff0c;可以在几乎所有音频播放器和设备上播放。此外&#xff0c;由于视频文件通常包含大量图像信息&#xff0c;因此其文件大小通常比相应的音频文件要大得多。将视频转换为MP3格式音频可以大大减小文件大小&#xff0c;从而节省硬盘空…

Postman接口自动化测试实战,从0到1一篇彻底打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 postman中的测试 …

python办公自动化有用吗?,python办公自动化能干啥

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python办公自动化有用吗?&#xff0c;python办公自动化电子书&#xff0c;现在让我们一起来看看吧&#xff01; 前 言 办公自动化是指利用现代化设备和技术&#xff0c;代替办公人员的部分手动或重复性业务活动&#x…

PYTHON专栏

PYTHON专栏 python基础教程 python基础教程 Python练手算法 Python练手算法 Python设计模式 Python设计模式 MySQL教程 MySQL教程 ORM框架SQLAlchemy Python ORM框架SQLAlchemy Python Web框架Django Python Web框架Django Web框架FastAPI Web框架FastAPI http库request…

Flutter系列文章-Flutter UI进阶

在本篇文章中&#xff0c;我们将深入学习 Flutter UI 的进阶技巧&#xff0c;涵盖了布局原理、动画实现、自定义绘图和效果、以及 Material 和 Cupertino 组件库的使用。通过实例演示&#xff0c;你将更加了解如何创建复杂、令人印象深刻的用户界面。 第一部分&#xff1a;深入…

三维模型OSGB格式轻量化压缩必要性分析

三维模型OSGB格式轻量化压缩必要性分析 三维模型是计算机图形学和视觉效果等领域的重要应用之一。然而&#xff0c;由于三维模型通常包含大量的几何信息、纹理信息和其他元素&#xff0c;导致其占用的存储空间和计算资源非常巨大。为了提高三维模型的处理效率和性能&#xff0…

C#实现邮箱验证码

开发环境&#xff1a;C#&#xff0c;VS2019&#xff0c;.NET Core 3.1&#xff0c;ASP.NET Core Web API&#xff0c;163邮箱 1、在163邮箱的设置中开通IMAP/SMTP的服务&#xff0c;授权成功后会弹出一个窗体&#xff08;如下图所示&#xff09;&#xff0c;上面显示了授权密码…

go重制版的海盗王gateserver网关服务端

海盗王原有的gateserver网关经常出现无故报错和掉地图的问题&#xff0c;经过反复修改都无法解决相关问题。 加上&#xff0c;原有的程序已经趋于古董级别&#xff0c;存在很大的兼容性问题。 以上&#xff0c;萌发了用go语言进行重新开发一个gateserver网关程序的想法&#xf…

科技巨头纷纷押注,Web3钱包能否成为撬动行业的支点?

出品&#xff5c;欧科云链研究院 作者&#xff5c;Hedy Bi 在PayPal推出稳定币并引发行业热议之际&#xff0c;公链Aptos昨日宣布与微软合作&#xff0c;共同探索与资产代币化、数字支付和中央银行数字货币相关的创新解决方案。尽管比尔盖茨对加密货币持摇摆态度&#xff0c;…

[小尘送书-第二期]《Power BI数据分析与可视化实战》数据清洗、数据建模、数据可视化设计与高级技法

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

F7--DDR4的读写测试-2023-08-11

1.场景 7系列的FPGA芯片不支持DDR4&#xff0c;使用DDR4需要更高性能的FPGA芯片&#xff0c;这里用到Kintex ultrascale是支持DDR4的&#xff0c;具体FPGA芯片是XCKU3P-2FFVA676I&#xff0c;DDR4的颗粒为MT40A512M16LY- 075E时钟频率为750MHz-1333MHz&#xff0c;单颗容量为1G…