ARM32开发--WDGT看门狗

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


目录

文章目录

前言

目标

内容

什么是看门狗

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.mzph.cn/pingmian/32969.shtml

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

相关文章

JSON序列化与反序列化

目录 JSON序列化 查看JSON文件&#xff0c;设置数据模板类 ​编辑 Newtonsoft.Json下载 运行结果展示 JSON反序列化 序列化是将对象或数据结构转换为可以存储或传输的格式&#xff08;如JSON字符串&#xff09;的过程&#xff0c;而反序列化则是将这个格式的数据转换回原…

Web渗透:文件上传-后端过滤

在上一篇文件上传的内容中笔者阐述了文件上传漏洞产生的相关原理以及使用了一个pikachu靶场的例子进行演示&#xff0c;在这个例子中涉及到了前端代码对于文件上传漏洞的相关防护&#xff0c;以及站在攻击者的角度我们要如何绕过前端的防护成功进行攻击&#xff1b;但是事实上对…

Linux下手动查杀木马与Rootkit的实战指南

模拟木马程序的自动运行 黑客可以通过多种方式让木马程序自动运行&#xff0c;包括&#xff1a; 计划任务 (crontab)&#xff1a;通过设置定时任务来周期性地执行木马脚本。开机启动&#xff1a;在系统的启动脚本中添加木马程序&#xff0c;确保系统启动时木马也随之运行。替…

力扣-2663

题目 如果一个字符串满足以下条件&#xff0c;则称其为 美丽字符串 &#xff1a; 它由英语小写字母表的前 k 个字母组成。它不包含任何长度为 2 或更长的回文子字符串。 给你一个长度为 n 的美丽字符串 s 和一个正整数 k 。 请你找出并返回一个长度为 n 的美丽字符串&#…

JAVA+Netty简单实现Nginx反向代理网关功能【设计实践】

背景 本文实现一个类似于nginx或gateway的反向代理网关&#xff0c;实现思路是访客通过网络请求反向代理服务&#xff0c;代理服务连接到真实服务&#xff0c;维护访客和真实服务的数据交互。 这个实现和之前的内网穿透项目思路相似&#xff0c;只不过内网穿透是由客户端主动…

用python写一个AI Agent对接企业微信上下游协同的案例

要实现一个AI Agent对接企业微信上下游协同&#xff0c;我们可以使用Python编写一个企业微信机器人&#xff0c;用于接收和处理来自企业微信的消息。在此示例中&#xff0c;我们将使用wechatpy库来实现企业微信机器人&#xff0c;并使用requests库实现与上下游系统的通信。 首…

很冷门但真的有趣的IOS应用

Tuesday Tuesday纪念日小组件是一款功能丰富的倒数日和桌面小组件工具APP。此外&#xff0c;Tuesday软件还具有超萌小清新的风格&#xff0c;界面设计清新可爱&#xff0c;适合各种场景使用。用户可以通过小组件实现各种趣味功能&#xff0c;满足不同心情需求。 SideNotes Si…

查看显卡使用情况

查看 NVIDIA 显卡的使用情况&#xff0c;你可以使用命令行工具 nvidia-smi。这是一个非常有用的命令&#xff0c;可以提供关于你的 NVIDIA GPU 的详细信息&#xff0c;包括 GPU 的使用率、显存使用情况、GPU 时钟频率、电源使用情况、温度以及正在运行的进程等。 以下是一些基…

吴恩达机器学习 第三课 week2 推荐算法(上)

目录 01 学习目标 02 推荐算法 2.1 定义 2.2 应用 2.3 算法 03 协同过滤推荐算法 04 电影推荐系统 4.1 问题描述 4.2 算法实现 05 总结 01 学习目标 &#xff08;1&#xff09;了解推荐算法 &#xff08;2&#xff09;掌握协同过滤推荐算法&#xff08;Collabo…

2025秋招NLP算法面试真题(一)-史上最全Transformer面试题

史上最全Transformer面试题 Transformer为何使用多头注意力机制&#xff1f;&#xff08;为什么不使用一个头&#xff09;Transformer为什么Q和K使用不同的权重矩阵生成&#xff0c;为何不能使用同一个值进行自身的点乘&#xff1f; &#xff08;注意和第一个问题的区别&#…

查找和排序

目录 一、查找 1.1查找的基本概念 1.2顺序查找 1.3折半查找&#xff08;二分查找&#xff09; 1.4散列表的查找 1.4.1基本概念 1.4.2散列函数的构造方法 1.4.3解决冲突的方法 二、排序 2.1排序的基本概念 2.2插入排序 2.2.1直接插入排序&#xff1a; 2.2.2希尔排序…

linux 简单使用 sftp 和 lftp命令

目录 一. 环境准备二. sftp命令连接到SFTP服务器三. lftp命令3.1 连接FTP和SFTP服务器3.2 将文件从sftp服务器下载到本地指定目录 四. 通过WinSCP命令行从SFTP服务器获取文件到Windows 一. 环境准备 ⏹在安卓手机上下载个MiXplorer&#xff0c;用作SFTP和FTP服务器 官网: htt…

第12天:前端集成与Django后端 - 用户认证与状态管理

第12天&#xff1a;前端集成与Django后端 - 用户认证与状态管理 目标 整合Django后端与Vue.js前端&#xff0c;实现用户认证和应用状态管理。 任务概览 设置Django后端用户认证。创建Vue.js前端应用。使用Vuex进行状态管理。实现前端与后端的用户认证流程。 详细步骤 1. …

windows无法启动redis-server

Warning: no config file specified, using the default config. In order to specify a config file use D:\Code_enve\Redis\redis-server.exe /path/to/redis.conf Creating Server TCP listening socket *:6379: bind: No such file or directory以上是问题的报错信息&…

AIGC-Animate Anyone阿里的图像到视频 角色合成的框架-论文解读

Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation 论文:https://arxiv.org/pdf/2311.17117 网页:https://humanaigc.github.io/animate-anyone/ MOTIVATION 角色动画的目标是将静态图像转换成逼真的视频&#xff0c;这在在线零…

vue.js获取body高度

在mounted生命周期钩子中获取&#xff1a; export default {mounted() {this.bodyHeight document.body.offsetHeight;},data() {return {bodyHeight: 0};} }; export default {data() {return {bodyHeight: 0};},mounted() {this.bodyHeight window.innerHeight;} };expor…

如何高效地为pip换源:详细操作指南

在Python开发中&#xff0c;pip是我们不可或缺的包管理工具。然而&#xff0c;默认的官方源下载速度较慢&#xff0c;尤其是在国内使用时可能会遇到网络问题。为了提高下载速度&#xff0c;我们可以通过更换国内的镜像源来解决这一问题。本文将详细介绍如何高效地为pip换源&…

计网:网络应用层【Email应用/SMTP协议】

Email应用与SMTP协议 Email应用层的构成 客户端服务器协议 用户代理 用于读写邮件消息&#xff1b;与服务器交互&#xff0c;收发邮件消息 常见的客户端&#xff1a;Outlook&#xff0c;Foxmail&#xff08;这两个是需要下载的客户端&#xff09;&#xff0c;Web客户端&…

【论文复现|智能算法改进】一种基于多策略改进的鲸鱼算法

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 SCI二区|鲸鱼优化算法&#xff08;WOA&#xff09;原理及实现【附完整Matlab代码】 2.改进点 混沌反向学习策略 将混沌映射和反向学习策略结合&#xff0c;形成混沌反向学习方法&#xff0c;通过该方 法…

python中不同维度的Tensor向量为何可以直接相加——广播机制

文章目录 广播机制示例解释广播机制如何工作代码示例输出解释广播机制的本质 在矩阵加法中&#xff0c;如果两个张量的形状不同&#xff0c;但其中一个张量的形状可以通过广播机制扩展到与另一个张量的形状相同&#xff0c;则可以进行加法操作。广播机制在深度学习框架&#xf…