STM32实战总结:HAL之看门狗

news2025/1/16 8:01:03

在由单片机构成的微型计算机系统中,单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环;或者因为用户配置代码出现BUG,导致芯片无法正常工作。出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 

简单说:看门狗的本质就是定时计数器,计数器使能之后一直在累加,而喂狗就是重新写入计数器的值,使计数器重新累加。

如果在一定时间内没有接收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)

 STM32中的看门狗

在STM32中的看门狗具体是什么样的呢?

STM32F10xxx内置两个看门狗,独立看门狗和窗口看门狗。

STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗、窗口看门狗)可以用来检测和解决由软件错误引起的故障。当计数器达到给定的超时值时,触发一个中断(仅适用窗口看门狗)或者产生系统复位。

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。因为是独立于主时钟的,所以这就是为什么被称为独立看门狗。

窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。

注意二者的异同:

✔都是为了保证CPU程序在跑飞时可以进行处理;

IWDG比WWDG更精确,IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序;

✔窗口看门狗严格限定喂狗时间段,独立看门狗则是只要没有到时间,都能喂狗。

独立看门狗

根据内部看门狗时钟频率,装载寄存器定一个时间值,比如是1000,那么独立看门狗就会按照时钟频率,从1000开始向下每隔一个时钟周期减1,如果在减到0之前,你用程序代码重新向向下计数器里面写1000(喂狗),那么定时器会重新从1000开始向下递减。如果在减到0的时候,你还没有喂狗(用新的数值覆盖计数器),就会产生复位信号。

在51单片机中,就只有独立看门狗。

IWDG主要性能

● 自由运行的递减计数器

● 时钟由独立的RC振荡器提供(可在停止和待机模式下工作)

● 看门狗被激活后,则在计数器计数至0x000时产生复位

独立看门狗框图如下:

注意:

如果我们要做低功耗模式,就要关闭独立看门狗,因为停机或者待机模式下不会喂狗,但是独立看门狗仍然正常工作,会导致系统复位而退出低功耗模式。

MX配置

关键代码

/* Includes ------------------------------------------------------------------*/
#include "MyApplication.h"

/* Private define-------------------------------------------------------------*/

/* Private variables----------------------------------------------------------*/

/* Private function prototypes------------------------------------------------*/  
static void FeedDog(void);

/* Public variables-----------------------------------------------------------*/
MyIWDG_t MyIWDG = 
{
	TRUE,
	
	FeedDog
};    

/*
	* @name   FeedDog
	* @brief  喂狗
	* @param  None
	* @retval None      
*/
static void FeedDog(void)
{
	HAL_IWDG_Refresh(&hiwdg);
}
/********************************************************
  End Of File
********************************************************/

窗口看门狗

根据系统时钟频率,装载一个初始值到向下计数器(假设还是1000),并且设置一个窗口值(小于装载到计数器的初始值,假设是500),窗口看门狗一般会定死窗口下线值是64。计数器从1000开始向下减,在减到500之前(1000到500间),是不允许你去喂狗的,一旦喂狗,就会产生复位信号。只有计数器值减到穿窗口值之后(500到64),才允许你去喂狗。当计数器减到下限值(64到0之间),如果喂狗,也会产生复位信号,当减到0之后,自动产生复位信号。所以窗口看门狗实际上就是设置一个窗口(上下限),在这个范围内,你才允许你去喂狗,只要不在这个范围之内,都会复位。

窗口看门狗中断:

并且窗口看门狗还可以使能中断,如果使能了提前唤醒中断,系统出现问题,喂狗函数没有生效,那么在计数器由减到0x40  (0x3f+1)  的时候,便会先进入中断,之后才会复位,你也可以在中断里面喂狗 。

HAL库独立窗口狗函数库讲解:

看门狗初始化:

HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);

喂狗:

HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg);

看门狗中断处理函数:

HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg);


看门狗中断回调函数:

 __weak HAL_WWDG_EarlyWakeupCallback(hwwdg);

MX配置

参数从上到下为:

  • 分频系数;
  • 窗口值;
  • 初始值;
  • 使能提前唤醒中断;

关键代码

/* Includes ------------------------------------------------------------------*/
#include "MyApplication.h"

/* Private define-------------------------------------------------------------*/

/* Private variables----------------------------------------------------------*/

/* Private function prototypes------------------------------------------------*/  
static void FeedDog(void);

/* Public variables-----------------------------------------------------------*/
MyWWDG_t MyWWDG = 
{
	TRUE,
	
	FeedDog
};    

/*
	* @name   FeedDog
	* @brief  喂狗
	* @param  None
	* @retval None      
*/
static void FeedDog(void)
{
	HAL_WWDG_Refresh(&hwwdg);
}
/********************************************************
  End Of File
********************************************************/
/**
  * @name   HAL_WWDG_EarlyWakeupCallback
  * @brief  窗口看门狗提前唤醒中断回调函数
  * @param  hwwdg : pointer to a WWDG_HandleTypeDef structure that contains
  *                the configuration information for the specified WWDG module.
  * @retval None
  */
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
  //喂狗
	if(MyWWDG.FeedDog_Flag == TRUE)
	{
		printf("喂狗\r\n");
		MyWWDG.FeedDog();
	}
}

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

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

相关文章

java面试强基(14)

Java 中 IO 流分为几种? 按照流的流向分,可以分为输入流和输出流;按照操作单元划分,可以划分为字节流和字符流;按照流的角色划分为节点流和处理流。 Java IO 流共涉及 40 多个类,这些类看上去很杂乱,但实…

[附源码]计算机毕业设计springboot病房管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

跨国并购数据库:SDC跨国数据库、Thomson数据库、A股上市公司并购数据库等多指标数据(4W+)

(1)SDC跨国数据库 1、数据来源:WRDS沃顿数据库Thomson Reuters SDC - Mergers and Acquisitions板块 2、时间跨度:1982年1月1日至2020年12月31日 3、区域范围:全国 4、指标说明: 数据的所有并购方都为…

DDD 与 EDA- 核心逻辑提炼方法论

在【DDD与应用架构】一文中我们说过,应用架构的存在就是为了把一团混沌的代码变得有秩序,好管理。我们保持最核心逻辑不变,就可以保持系统的稳定与发展。领域驱动设计的作者 Eric Evans 说:“为了使领域模型成为有价值的资产&…

华夏天信携手华为云开天aPaaS,打造安全、高效、节能的主煤流运输系统

摘要:基于开天aPaaS集成工作台,主煤流运输系统如何实现多源异构数据融合、皮带物料和人员违章的智能感知,以及皮带的智能控制。灵活架构、高效集成、快速开发!本文分享自华为云社区《华夏天信携手华为云开天aPaaS,打造…

SSM三大框架之MyBatis总结【动力节点老杜】

文章目录JDBC的缺点MyBatis一、基础概念二、开发第一个mybatis程序1.resources目录:2.开发步骤3.从 XML 中构建 **SqlSessionFactory**4.mybatis中有两个主要的配置文件:5.关于第一个程序的小细节6.关于mybatis的事务管理机制。(深度剖析&…

springboot+jsp高校学生宿舍管理系统-宿管带前端

本系统采用从上往下的步骤开发,基本功能如下: 本课题要求实现一套宿舍管理系统,系统主要包括个人中心、学生管理、宿管管理、报修信息管理、费用缴纳管理、留言板管理、论坛管理、系统管理等功能; 管理员用例图如下所示&#xff1…

抖音达人探店有用吗?算不算过时呢

其实我看到这个问题的时候也曾怀疑探店的方式真的对当下年轻人有作用吗?会不会有人怀疑探店达人和商家是串通好的?毕竟在有利益链的情况下,我们还能否相信仅仅靠一个视频就能知晓事物的孰好孰坏?今天就来为大家分析下抖音达人探店…

xss-labs/level7

我们如同一下构造那样 <script>alert(xss)</script> 产生以下回显 接着查看源代码 发现第一个输出点被转义了 没有利用价值了 第二个输出点则是可以发现script关键字直接给干没了 氧化钙!!! 似此 如何处之&#xff1f; 我们猜测后台服务器还是对一些特殊字符进…

软件测试全套教程,软件测试自学线路图

目录 一、背景&#xff1a; 二、行动&#xff1a; 三、软件测试实战具体路线&#xff1a; 第0阶段 &#xff1a;软件测试行业和个人匹配度分析 第1阶段&#xff1a;软件行业前景分析大纲解读 第2阶段&#xff1a;软件测试基础知识 第3阶段&#xff1a;需求分析阶段 第4…

[附源码]计算机毕业设计springboot大学生考勤管理系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

LVS-NAT模式实验案例

1 环境&#xff1a; 共四台主机 一台&#xff1a; internet client&#xff1a;192.168.10.8/24 GW:无 仅主机 一台&#xff1a;lvs eth1 仅主机 192.168.10.18/16 eth0 NAT 192.168.100.18/24 两台RS&#xff1a; RS1: 192.168.100.28/24 GW&#xff1a;192.168.100.18 NAT …

SpringCloud 网关 Gateway

哈喽~大家好&#xff0c;这篇来看看SpringCloud 网关 Gateway。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【】 &#x1f949;与这篇相关的文章&#xff1a; SpringCloud Sentinel 使用SpringCloud S…

手把手教你构建一个前端路由

涉及知识点&#xff1a;location对象、history对象 文章目录基础概念什么是路由如何实现前端路由涉及问题前端路由实现方式1. hash方式2. history方式3. debug&#xff1a;本地起服务报错扩展&#xff1a;封装路由类Routerhashhistory基础概念 什么是路由 路由是一组映射关系…

深度学习入门(9)神经网络Affine与Softmax层的计算图表示方式及其误差反向传播的代码实现

《深度学习入门》系列文章目录 深度学习入门 (1)感知机 深度学习入门&#xff08;2&#xff09;神经网络 深度学习入门&#xff08;3&#xff09;神经网络参数梯度的计算方式 深度学习入门&#xff08;4&#xff09;【深度学习实战】无框架实现两层神经网络的搭建与训练过程 深…

MySQL 进阶篇1.0 索引 SQL优化 视图 锁

01-课程介绍 02-存储引擎-MySQL体系结构 03存储引擎-简介 查询建表语句 --默认存储引擎:InnoDBshow create table account; 查询当前数据库支持的存储引擎show engines; 04存储引擎-InnoDB介绍 开关为"ON": 表示每个innodb引擎的表都有一个idb表共享文件 …

Focal Self-attention for Local-Global Interactions in Vision Transformers

目录 Abstract 1. Introduction 2. MEthod 2.1 Model architecture 2.2 Focal self-attention 2.2.1 Window-wise attention 2.2.2 Complexity analysis 2.3 Model configuration 3. Related work 4. Experiments 4.1 Image classification on ImageNet-1K 4.…

26. [Python GUI] PyQt5中拖放详解之拖放动作

PyQt5的拖放动作 1. 什么是拖放动作 拖放动作是指用户希望怎样处理拖放的数据&#xff0c;比如移动、复制、还是创建由目标到源的链 接等。 拖放动作由 Qt::DropAction 枚举描述&#xff1a; 2. 可能的拖放动作&#xff0c;实际的拖放动作&#xff0c;建议的拖放动作 可能的…

有什么制作网页的工具软件好用呢?

我们进行制作网页之前&#xff0c;都会找一些制作网页的工具软件&#xff0c;俗语有说“工欲善其事&#xff0c;必先利其器&#xff0c;所以找一款好的的工具软件可以对制作网页的过程提供很大帮助。那么有什么制作网页的工具软件呢&#xff1f; 制作网页的方式有哪些&#xff…

如何计算神经网络参数的个数?

目录 1. 卷积层 2. 分类层 3. 计算 LeNet 网络的参数个数 神经网络随着层数的加深&#xff0c;网络参数的个数会越来越多&#xff0c;小的网络有成千上万个参数&#xff0c;大的可以达到千万个网络参数。 所以应该如何计算神经网络参数的个数&#xff1f; 图像分类的神经网…