ARM32开发--WDGT看门狗

news2024/11/24 19:30:42

知不足而奋进 望远山而前行


目录

文章目录

前言

目标

内容

什么是看门狗

ARM中的看门狗

独立看门狗定时器

窗口看门狗定时器

独立看门狗FWDGT

初始化配置

喂狗

完整代码

窗口看门狗WWDGT

初始化配置

喂狗

完整代码

注意

总结


前言

嵌入式系统在如今的科技发展中扮演着越来越重要的角色,而其中保障系统稳定性与可靠性的机制显得尤为关键。本文将深入探讨看门狗(Watchdog)的概念、工作原理以及在 ARM 架构下的两种主要类型:独立看门狗和窗口看门狗。通过学习本文,您将对嵌入式系统中的看门狗有更深入的了解,从而提升系统的稳定性与可靠性。


目标

  • 了解什么是看门狗
  • 了解看门狗工作原理
  • 了解ARM的独立看门狗和窗口看门狗
  • 掌握看门狗初始化和喂狗

内容

什么是看门狗

看门狗(Watchdog)是一种用于监视系统运行情况的硬件设备,本质就是一个倒计时计数器。它能定时检测系统是否正常运行,并在系统出现故障或者卡死时自动重启系统,从而保证系统的稳定性和可靠性。

其基本原理是定期接收来自主控芯片的"喂狗信号",如果在规定的时间内没有接收到信号,硬件看门狗将会

触发系统复位,重新启动整个系统。

硬件看门狗特别适合用于远程或无人值守的系统设备中,它能确保系统在出现故障时及时自动重启减少停机时间并提高系统的可用性。这在一些关键的嵌入式系统、服务器、网络设备等领域非常重要。

看门狗(Watchdog)在嵌入式系统中起着至关重要的作用,它通常是一种硬件计时器或计数器,用于监控系统的运行情况。其作用和重要性包括以下几个方面:

  1. 系统健壮性和稳定性: 看门狗能够监控系统的运行状态,一旦系统出现故障、死锁或意外情况,可以通过重启系统来恢复正常运行,确保系统的稳定性和可靠性。
  2. 防止死锁和程序错误: 当程序发生死循环、意外暂停或其他异常情况时,看门狗可以检测到系统无响应的状态并执行重启操作,从而防止系统永久性死锁。
  3. 系统保护和数据完整性: 通过定期喂狗操作,可以确保系统在正常运行期间不会因软件或硬件故障而丢失关键数据,从而保护系统的数据完整性和稳定性。
  4. 实时系统保障: 对于实时系统而言,看门狗可以帮助确保系统在规定的时间内完成任务,若任务未能及时完成,可以执行重启操作以确保系统的实时性能。

看门狗在嵌入式系统中的作用和重要性体现在提高系统的稳定性、保护数据完整性、预防死锁和程序错误、保障实时系统性能等方面。它是确保嵌入式系统安全可靠运行的重要保障手段之一。

ARM中的看门狗

独立看门狗定时器

有独立时钟源(IRC32K)。即使主时钟失效,FWDGT依然能保持正常工作状态,适用于需要独立环境且对计时精度要求不高的场合。

当内部向下计数器的计数值达到0,独立看门狗会产生一个系统复位。使能独立看门狗的寄存器写保护功能可以避免寄存器的值被意外的配置篡改。

窗口看门狗定时器

用来监测由软件故障导致的系统故障。窗口看门狗定时器开启后,7位向下递减计数器值逐渐减小。计数值达到0x3F时会产生系统复位(CNT[6]位被清0)。在计数器计数值达到窗口寄存器值之前,计数器的更新也会产生复位。因此软件需要在给定的区间内更新计数器。窗口看门狗定时器在计数器计数值达到0x40会产生一个提前唤醒标志,如果使能中断将会产生中断。窗口看门狗定时器时钟是由APB1时钟预分频而来。窗口看门狗定时器适用于需要精确计时的场合。

独立看门狗FWDGT

free watchdog timer

初始化配置
static void wtd_config() {
    rcu_osci_on(RCU_IRC32K);
    
    while( SUCCESS != rcu_osci_stab_wait(RCU_IRC32K) ){  }
    
    fwdgt_config( 1000,  FWDGT_PSC_DIV64);
    
    fwdgt_enable();
}

/* confiure FWDGT counter clock: 32KHz(IRC32K) / 64 = 0.5 KHz */

独立看门狗计数时钟计算:

  • 独立看门狗具备独立晶振:32KHZ
  • FWDGT_PSC_DIVx: x为分频系数,意思是降低晶振频率。例如为64时,32khz/64 = 0.5khz = 500hz,表示的是1秒钟计数500次。
  • fwdgt_config(2 * 500, FWDGT_PSC_DIV64); 中的第一个参数就是计数值,通过分频我们可以知道1秒钟计数500次,那么我要设置为n秒,就需要 n*500的计数值。
喂狗
fwdgt_counter_reload();
完整代码

#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "Usart0.h"


void Usart0_on_recv(uint8_t* data, uint32_t len) {
    printf("recv: %s\r\n", data);
}

static void wtd_config() {
    fwdgt_config(2 * 500, FWDGT_PSC_DIV64);
    fwdgt_enable();
}

int main(void)
{
    systick_config();
    Usart0_init();

    wtd_config();

    printf("start\r\n");
    while(1) {

        delay_1ms(960); // 重启
        // delay_1ms(450); // 正常
        /* reed dog */
        fwdgt_counter_reload();
    }
}

窗口看门狗WWDGT

初始化配置
static void wtd_config() {
    rcu_periph_clock_enable(RCU_WWDGT);
    /*
     *  System clock up to 168Mhz, PCLK1=42MHz 
     *  set WWDGT clock = (PCLK1 (42MHz)/4096)/4 = 2563.5Hz (0.39ms)  
     *  set counter value to 127
     *  set window value to 80
     *  refresh window is: 0.39ms * (127-80)  < refresh window <  0.39ms * (127-0x3F) 
     */
    wwdgt_config(127, 80, WWDGT_CFG_PSC_DIV4);
    wwdgt_enable();
}

wwdgt_config(uint16_t counter, uint16_t window, uint32_t prescaler)配置的是窗口时间,计算窗口时间是需要注意几个参数的含义。

  • counter表示计数值,取值为0x00 - 0x7F
  • window表示窗口值,取值为0x00 - 0x7F
  • 窗口区间的初始值最小为0x3F
  • 窗口计数是递减的,因此是 (counter - 初始值) 为最大时间计数,(counter - 窗口区间值)为最小时间计数
  • 一个时钟计数,通过 主频/4096可以得到计数值,4096为12位向下计数器组成。
  • 窗口计数器通过分频,得到一个时钟计数,主频/4096/分频系数
喂狗
完整代码

#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "Usart0.h"

void Usart0_on_recv(uint8_t* data, uint32_t len) {
    printf("recv: %s\r\n", data);
    
	if(data[0] == 0x04){
		// 模拟卡死操作
		while(1);
	}
}

static void wtd_config() {
    rcu_periph_clock_enable(RCU_WWDGT);
    /*
     *  System clock up to 168Mhz, PCLK1=42MHz 
     *  set WWDGT clock = (PCLK1 (60MHz)/4096)/4 = 2563.5Hz (0.39ms)   
     *  set counter value to 127
     *  set window value to 80
     *  
     
	窗口开始时间-> (counter - window) * 1次计数耗时 =  (127 - 80) * 0.39ms = 18.33ms
	窗口结束时间-> (counter - 	 0x3F) * 1次计数耗时 = (127 - 63) * 0.39ms = 24.96ms
	
	需要在窗口时间内喂狗, 否则会触发重启
	18.33ms < duration < 24.96ms
    
     */
    wwdgt_config(127, 80, WWDGT_CFG_PSC_DIV4);
    wwdgt_enable();
}

int main(void)
{
    systick_config();
    Usart0_init();

    wtd_config();

    printf("start\r\n");
    while(1) {
    	// 18.33ms < 安全期 < 24.96ms
        //    delay_1ms(18);
        delay_1ms(22); // 可以
        //    delay_1ms(26);
        /* update WWDGT counter */
        wwdgt_counter_update(127);
    }
}

注意

如果计算得到的窗口期和真实的运行结果不一致,要考虑system_gd32f4xx.c里配置的系统时钟是否是168M,即打开该文件,找到__SYSTEM_CLOCK_168M_PLL_8M_HXTAL,释放其注释,保持打开状态。

参考文档:GD32F4标准外设库🌟🌟🌟


总结

本文系统地介绍了看门狗(Watchdog)在嵌入式系统中的重要作用及其工作原理。首先,我们了解了看门狗的基本概念,它是一种硬件设备,用于监视系统运行情况,并在系统故障时自动重启系统,以确保系统的稳定性和可靠性。接着,我们深入探讨了看门狗的作用和重要性,包括提高系统的稳定性、防止死锁和程序错误、保护数据完整性以及保障实时系统性能等方面。随后,针对 ARM 架构,我们详细介绍了两种主要类型的看门狗:独立看门狗和窗口看门狗,并分别给出了其初始化配置和喂狗的方法。通过本文的学习,读者将能够更好地理解看门狗在嵌入式系统中的重要性,进而提高系统的稳定性和可靠性。

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

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

相关文章

程序猿大战Python——面向对象——私有权限

私有属性 目标&#xff1a;掌握私有属性的使用。 为了更好的限制属性的访问和包含隐私&#xff0c;可以给属性设置私有权限。 当把属性设置为私有属性后&#xff0c;则该属性只能被本类直接访问。 定义私有属性语法&#xff1a; self.__属性名 设置和获取私有属性值语法&am…

云计算期末综合测试题

云计算综合测试题 单选题填空题判断题简答题 单选题 这里选择题&#xff0c;直接以填空题展示&#xff0c;并给出解析 Bigtable是&#xff08;Google&#xff09;开发的分布式存储系统 解析&#xff1a;分布式结构化数据表Bigtable是Google基于GFS和Chubby开发的分布式存储系统…

Redis 学习笔记(2)

目录 1 Redis的持久化1.1 RDB持久化方案1.2 AOF持久化方案 2 Redis架构2.1 主从复制架构2.2 哨兵集群设计2.3 哨兵集群设计 3 Redis事务机制4 Redis过期策略与内存淘汰机制4.1 过期策略4.2 内存淘汰机制 5 Redis高频面试题4.1 缓存穿透4.2 缓存击穿4.3 缓存雪崩 1 Redis的持久化…

2. 数据结构分析即索引库的crud

1. 数据库脚本 DROP TABLE IF EXISTS tb_hotel; CREATE TABLE tb_hotel (id bigint(0) NOT NULL,name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT COMMENT 酒店名称,address varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_090…

FlowUs2024重磅革新预告:RAG技术赋能『问问AI』,笔记变现新纪元等你开启!

&#x1f389; 在FlowUs的广阔天地间&#xff0c;知识的边界被无限拓展&#xff0c;引领着一场场创新与收获的庆典&#xff01;&#x1f680; 随着一年间不断的精进与革新&#xff0c;FlowUs与众多用户并肩前行&#xff0c;在追求极致体验的道路上迈出坚实步伐。步入2024年&am…

Javase.图书管理系统基本框架

图书管理系统基本框架 1.核心类介绍2. book包详解2.1 Book 类2.1.2 代码展示2.1.2 代码解析 2.2 BookList 类2.2.2 代码展示2.2.2 代码解析 2.3Book类和BookList类的联系 3. 用户角色与管理3.1 User 类3.1.1 代码展示3.1.2 代码解析 3.2 adminUser 类3.2.1 代码展示3.2.2代码解…

学生选课管理系统(JAVA课设)PS:有前端界面

1.课设要求描述 实现系统的所有功能&#xff0c;包括但不限于&#xff1a; 学生信息管理&#xff08;增加、删除、修改、查询&#xff09;课程信息管理选课操作成绩管理 2.制作思路及基础讲解 此项目主要是用于完成大二下半学期的JAVA大作业&#xff0c;也可当作课设&…

Ubuntu:解决github出现 Permission denied (publickey)的问题

因为使用的Ubuntu 长久没有使用&#xff0c;使用下载的时候突然报错&#xff0c;使用ssh key这种方式进行clone &#xff0c;pull github上面的项目&#xff0c;使用 git clone或者git pull origin master出现permission denied (publickey)&#xff0c;原因是因为ssh key过期失…

leetcode 二分查找·系统掌握 x的平方根

题目&#xff1a; 题解 这题可以使用~01~泛型查找在0~x/2的范围内查找答案。 int mySqrt(int x) {long l0,rx,mid;while(l<r){mid(lr1)>>1;if(mid*mid>x)rmid-1;else lmid;}//因为一定有答案所以不用判定是否查找失败return l;}

计算机系统基础实训六-ShellLab实验

实验目的与要求 1、让学生更加理解进程控制的概念和具体操作方法&#xff1b; 2、让学生更加理解信号的概念和具体使用方法&#xff1b; 3、让学生更加理解Unix shell程序的原理和实现方法&#xff1b; 实验原理与内容 shell是一种交互式的命令行解释器&#xff0c;能代表…

从关键新闻和最新技术看AI行业发展(2024.6.3-6.16第二十五期) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&…

Node.js 系列之 Express 框架入门实战教程

目录 1 Node.js是什么2 Express初体验3 Express 路由3.1 什么是路由3.2 路由的使用3.3 获取路由参数 4 常见响应设置4.1 express 响应方法4.2 原生响应方法 5 express 中间件5.1 中间件作用5.2 中间件类型5.3 全局中间件5.4 路由中间件 6 获取请求体数据7 路由模块化 1 Node.js…

51单片机学习记录(二)————外部中断

文章目录 前言一、中断1.中断的定义 二、51中断1.中断源2.中断的配置3.中断允许控制寄存器4.中断触发方式51中断有两种触发方式&#xff1a; 三、外部中断1.外部中断引脚2.外部中断配置&#xff08;以外部中断0为例&#xff09; 总结 前言 一个学习嵌入式的小白~ 有错误评论区…

【ARM】PK51如何将BL51链接器切换成LX51链接器

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决客户在使用PK51进行项目研发的时候&#xff0c;想要使用LX51链接器进行使用。 2、 问题场景 客户在使用51芯片进行开发的时候&#xff0c;发现工程中使用的是BL51链接器&#xff0c;而不是LX51链接器&#xff…

【非常实验】如何在移动设备上运行 Docker?

本章就从在 DevOps 中最基本但也是最强大的工具 Docker 开始。最近,我在尝试更多Termux的可能性,于是就想着试试Docker适不适合arm架构。 我用的是天玑9000芯片,而不是高通,所以显示不出来 Qualcomm。所以我决定从在手机上运行 docker 开始,但这可能吗?让我们一起来看看吧…

Node.js实现短链接(ShortLink):shortid、epxress让URL更简单

文章目录 一、短链接介绍二、插件介绍1、epxress2、shortid 三、实现方案1、安装依赖&#xff1a;2、实现原理 四、示例代码五、测试生产短链接 一、短链接介绍 短链接是指仅包含一个网址的链接形式&#xff0c;通俗一些就是将一个很长很复杂的的网址变成一个简短易记的链接。…

基于CSDN的Markdown文本编辑器的博客界面优化 | HTML | 文本标签 | 图像标签 | 个人主页引导

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张分享的内容是如何在CSDN的Markdown编辑器中实现上图的效果&#xff0c;如果觉得能帮助到你的话就点击个人主页点点关注吧❗ 文章目录 1.前言2.基础知识3.字…

游戏工厂:AI(AIGC/ChatGPT)与流程式游戏开发

游戏工厂&#xff1a;AI&#xff08;AIGC/ChatGPT&#xff09;与流程式游戏开发 码客 卢益贵 ygluu 关键词&#xff1a;AI&#xff08;AIGC、ChatGPT、文心一言&#xff09;、流程式管理、好莱坞电影流程、电影工厂、游戏工厂、游戏开发流程、游戏架构、模块化开发 一、前言…

ArcGIS批量投影转换的妙用(地理坐标系转换为平面坐标系)

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 这次文章我们来介绍一下&#xff0c;如何巧妙用要素数据集来实现要素的批量投影。不需要ArcGIS的模型构建器与解决。 例如&#xff0c;有多个要素要将CGCS_2000地理坐标系投…

单机、集群和分布式

目录 1.概述 2.单机服务器 单机版的服务器的性能&#xff0c;设计上的瓶颈&#xff1f; 3.集群 解决瓶颈1&#xff1a; 没有解决瓶颈2&#xff1a; 没有解决瓶颈3&#xff1a; 集群的优点&#xff1f; 集群的缺点&#xff1f; 4.分布式 分布式的优点&#xff1f; 分…