【STM32】看门狗模块

article/2025/10/23 6:34:46

🐱作者:一只大喵咪1201
🐱专栏:《STM32学习》
🔥格言:你只管努力,剩下的交给时间!
图

📃看门狗概述

什么是看门狗:

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog)

看门狗能够解决的问题:

  • 程序不能正常复位,通过看门狗发出的复位信号来复位
  • 程序跑飞或者陷入死循环等异常情况,看门狗发出复位信号,让程序重新执行,恢复正常执行顺序

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

  • 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效。独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
    图

  • 窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。 窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。

图
图
由APB1外设时钟使能寄存器(RCC_APB1ENR) 控制。

📃独立看门狗

🎲原理及相关寄存器

图

  • 纵坐标是一个计数初值,它是递减的
  • 横坐标是时间,随着时间的推移,计数值不断的减少
  • 当计数值减到0的时候,会产生一个复位信号,让单片机重新开始执行程序
  • 如果在计数值减到0之前进行一次喂狗,那么就会重新从计数初值开始递减
  • 不停的在这个区间内喂狗,计数值就永远不会减到0,永远不会产生复位信号

当程序出现异常,不按照预期的顺序执行,喂狗这一动作便不会正常执行,计数值就会减到0,就会产生复位信号,让单片机复位,重新执行程序。

图
这是独立看门狗的框图。

在供电,LSE时钟源给IDWG(独立看门狗)提供了时钟之后

图

  1. 对键寄存器(IWDG_KR)写0x5555取消写保护,意味着我们可以对独立看门狗进行操作了。

  2. 通过对预分频寄存器(IWDG_PR) 写值,来设置分频系数
    图

  3. 对键寄存器(IWDG_KR)写0xCCCC启动看门狗,此时递减计数器便从0xFFF开始递减计数了

  4. 在递减计数器减到0之前,对键寄存器(IWDG_KR)写0xAAAA进行喂狗
    图
    喂狗后,重装载寄存器(IWDG_RLR) 中的值会被赋给递减计数器,然后从这个值开始继续递减。其中,重装载寄存器(IWDG_RLR) 中的值是我们自己设定的。

我们知道了看门狗的计数原理以后,那么是计数初值是怎么计算的呢?
图
这个公式就是计算计数时间的公式

  • 通过上面预分频寄存器(IWDG_PR) 分布情况得知,寄存器中的值是0的时候,分频系数是4,值是1的时候,分频系数是8,所以有分频系数=4*2^prer,其中prer是预分频寄存器(IWDG_PR) 中的值
  • 又因为LSI的频率是40KHZ,用40除以分频系数图
    得到就是此时IWDG时钟的频率,而它的倒数,就是它计时的时长Tout。

我们定时1s时,分频系数选择4,那么此时得到的rlr也就是预分频寄存器(IWDG_PR) 中的值是625。
图

上图是不同分频系数下独立看门狗的最大以及最短计数时间。

接下来本喵告诉大家写程序的流程。
ST官方给我们提供了丰富的标准库函数,我们只需要调用库函即可,而库函数的本质就是在配置上面提到的各种寄存器。
图
这是官方提供的库函数,接下来我们就按照一定的步骤来使用它。

程序流程:

  • 取消寄存器写保护:
    IWDG_WriteAccessCmd();
  • 设置独立看门狗的预分频系数,确定时钟:
    IWDG_SetPrescaler();
  • 设置看门狗重装载值,确定溢出时间:
    IWDG_SetReload();
  • 使能看门狗
    IWDG_Enable();
  • 应用程序喂狗:
    IWDG_ReloadCounter();

看看本喵写的程序
图
该程序的效果是:

  • 按WK_UP键来喂狗,每隔1s至少喂狗一次,此时红灯1常亮
  • 如果没有按WK_UP键来喂狗,那么红灯就会闪烁,因为初始状态红灯是灭的。

至于其中的按键部分以及LED灯部分的程序,本喵在前面的文章按键控制蜂鸣器和LED灯的实验中详细讲解过如何配置。

🎲效果展示

图

📃窗口看门狗

在上面本喵就提到过,窗口看门狗的应用场景以及时钟的来源,接下来本喵给大家介绍一下窗口看门狗的具体情况。

🎲原理及相关寄存器

窗口看门狗与独立看门狗在喂狗机制上的区别就是:

  • 独立看门狗IWDG在计数初值到计数为0的区间内喂狗就不会产生复位信号
  • 窗口看门狗WWDG在计数值处于上下窗口之间的范围内喂狗就不会产生复位信号

图
这便是它的大致过程。

  • 上窗口值是一个7位的值,是我们用户可以自己设定的
  • 下窗口值是固定的,是0x3Fh
  • 喂狗只能在上下窗口之间的这个计数范围内
  • 无论是大于上窗口值还是小于下窗口值0x3Fh的时候喂狗,都会产生复位信号

这是窗口看门狗的框图。

接下来本喵介绍它的详细工作原理:

  1. WWDG是挂载在APB1总线下的外设,所以需要使能APB1时钟。
  2. 通过设置配置寄存器(WWDG_CFR)的第7位和第8位来设置分频系数。
  3. 通过设置配置寄存器(WWDG_CFR)的低7位来设置上窗口值。
  4. 配置寄存器(WWDG_CFR)中的第9位是提前唤醒中断的使能位,当它置1的时候,在计数器减到0x40h的时候进入中断。图
  5. 通过设置控制寄存器(WWDG_CR)的低7位来设定计数器的计数初值
  6. 控制寄存器(WWDG_CR)的第7位WWDG的使能位,对其写1,将WWDG打开
    图

接下来看一下复位信号和T6位信号的时序图:
图

  • 我们知道,计数值占用的是控制寄存器(WWDG_CR)的低7位,且下窗口的值是0x3Fh,写成二进制就是
  • 0111111
  • 当计数器中的值大于下窗口的值0x3Fh的时候是0x7Fh到0x40h之间,写成二进制就是
  • 1111111到0100000
  • 我们可以看到,只要计数器中的值大于下窗口的值0x3Fh,那么它的第6一定是1,也就是T6位是1,当T6成为0的时候就是0x3Fh,此时就会喂狗

所以当T6位跳变为低电平的时候,复位信号是高电平,单片机复位。

图
产生复位信号的逻辑分析:

第一条途径:

  • 将WWDG模块启动,也就是将WDGA位置1
  • 计数器中的值T6:0与上窗口中的值W6:0通过比较器进行比较,当T6:0大于W6:0时产生的结果是1,这个结构与喂狗后的结果通过与门后的结果仍然是1。
  • 上面产生的1通过或门后还是1,并且与WDGA产生的1经过与门产生复位信号

第二条途径:

  • 将WWDG模块启动,也就是将WDGA位置1
  • 当计数器中的T6位变成0以后,通过或非门变成1
  • 产生的1与WDGA产生的1经过与门后产生复位信号。

WWDG的喂狗是在中断中实现的,该模块有提前唤醒中断功能。

通过设置配置寄存器(WWDG_CFR)中的第9位为1,提前唤醒中断就会被打开,当计数器减到0x40h的时候就会进入中断,并且在中断中喂狗,让程序正常执行而不产生复位。
而状态寄存器(WWDG_SR)
图
中的中断标志位必须由软件清0。

图
这是计算计时时长的公式,以及WWDG的最长和最短定时时长,本喵就不在这里分析它了,大家拿着直接用就行。
注意:这里的4096是在PCLK1的频率上除了4096,否则的话时钟频率会太高
接下来就是怎么写程序了。
图
这是ST官方提供的WWDG的库函数,本质也是在配置上面提到过的寄存器。

程序步骤:

  • 使能看门狗时钟:
    RCC_APB1PeriphClockCmd();
  • 设置分频系数:
    WWDG_SetPrescaler();
  • 设置上窗口值:
    WWDG_SetWindowValue();
  • 开启提前唤醒中断并分组(可选):
    WWDG_EnableIT();
    NVIC_Init();
  • 使能看门狗:
    WWDG_Enable();
  • 喂狗:
    WWDG_SetCounter();
  • 编写中断服务函数
    WWDG_IRQHandler();
    中断函数中需要清除中断标志位,使用
    WWDG_ClearFlag();

看看本喵的程序:

图
该程序的效果是:

  • 喂狗成功,绿灯会不停闪烁,红灯常亮
  • 如果喂狗失败的话,绿灯不会闪烁,并且由于复位的原因,红灯也不会亮,因为红灯的初始化状态是灭。

我们的程序是成功的,所以是绿灯闪烁,红灯常亮。

🎲效果展示

请添加图片描述

📃总结

看门狗模块是俩个使用非常简单的模块,虽然我们很多程序中用不着,但是一些大型工程中为了严谨和安全,看门狗是必须使用的。希望这篇文章对大家有所帮助。


http://chatgpt.dhexx.cn/article/gTBg7cEN.shtml

相关文章

【STM32】stm32独立看门狗(IWDG)

stm32独立看门狗(IWDG) 0x01 IWDG简介0x02 IWDG主要性能0x03 IWDG寄存器配置 0x01 IWDG简介 STM32F10xxx内置两个看门狗,(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,…

STM32 看门狗详解

目录 1、IWDG 1.1 独立看门狗简介 1.2 独立看门狗的特点 1.3 独立看门狗功能描述 1.4 硬件看门狗 1.5 寄存器访问保护 1.6 调试模式 2、WWDG 2.1 简介 2.2 窗口看门狗主要特点 2.3 窗口看门狗功能说明 2.4 如何设置看门狗超时 2.5 调试模式 3、区别 1、IWDG 1.1…

手把手教你开发stm32——看门狗(基于hal库)

目录: 1.独立看门狗介绍1.1.独立看门狗简介1.2.独立看门狗功能描述1.3.独立看门狗工作框图 2.独立看门狗实验2.1.cubemx配置2.2.具体代码实现 3.独立看门狗的相关寄存器3.1.键寄存器(IWDG_KR)3.2.预分频寄存器3.3.重装载寄存器(IW…

STM32—看门狗详解入门(独立看门狗、窗口看门狗)

目录 一、什么是看门狗? 二、独立看门狗IWDG 1.特点、本质及原理 2.配置 3.main.c代码 三、窗口看门狗WWDG 1.特点、本质及原理 2.配置 3.main.c代码 四、独立看门狗与窗口看门狗的比较 一、什么是看门狗? 看门狗主要是用来监测单片机运行状态…

STM32(七)------- 独立看门狗(IWDG)

独立看门狗 介绍STM32独立看门狗简介原理功能描述IWDG关键寄存器描述键寄存器(IWDG_KR)状态寄存器(IWDG_SR)预分频寄存器(IWDG_PR)重装载寄存器(IWDG_RLR)IWDG寄存器映像和复位值 使用启动 STM32 的独立看门狗应用设计功能设计程序设计 后续 介绍 STM32独立看门狗简介 STM32 …

STM32—窗口看门狗(WWDG)

STM32—窗口看门狗(WWDG) 窗口看门狗(WWDG) STM32—窗口看门狗(WWDG)窗口看门狗(WWDG)WWDG 简介WWDG 功能框图剖析窗口看门狗时钟计数器时钟计数器窗口值计算看门狗超时时间 怎么用 WWDG独立看门狗所用到的库函数窗口看门狗操作步…

初学STM32之看门狗

初学STM32之看门狗 一、看门狗概述 1.什么是看门狗 单片机在工作中常常会受到来自外界电磁场的干扰,造成程序跑飞,而陷入死循环,程序的正常运行被打断,使得系统无法正常工作,造成整个系统陷入停滞状态。所以为了对单…

matlab 工具箱 GATBX 的安装,安装Sheffield Matlab遗传算法工具箱的建议

在通常的遗传算法学习中,可以直接对目标函数进行编写,但是当我们需要使用simulink进行仿真优化需要用到遗传算法时,我这里有两种建议:①在模型中添加sfunction然后使用自己喜欢的语言进行编写;②使用Matlab遗传算法工具…

MATLAB遗传算法工具箱的函数及实例

遗传算法(GA)是一种进化算法,是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。 遗传算法把问题参数编码为染色体,利用层层迭代的方式进行选择、…

基于Matlab遗传算法工具箱解决物流中心选址

目录 1.问题 2.建模 3.Matlab编程、求解 1.问题 物流配送中6个客户的位置坐标和配数数量如表1所示,如何设置物流配数中心使得配送量最小。 2.建模 3.Matlab编程、求解 编写目标函数min 遗传算法只能求最小值 function y fun(x)site[52 42 93 62 90 70;…

谢菲尔德遗传算法工具箱函数简介

一 谢菲尔德遗传算法工具箱的主要函数如下表所示: 二 函数介绍—创建种群 1. crtbase 1.1 功能 创建一个所有染色体中最基本的染色体**对应的向量*语法: 1.2 语法 BaseVec crtbase(Lind,Base) 1.3 输入参数 1 L…

matlab遗传工具箱ga,用遗传算法工具箱(GA)识别Bouc-Wen模型微分方程参数

本帖最后由 hgrhgr520 于 2016-3-20 14:30 编辑 Bouc-Wen模型因数字处理方便简单而得到较为广泛的应用,力可以表示为: QQ截图20160320125352.jpg (3.2 KB, 下载次数: 21) 2016-3-20 12:49 上传 利用遗传算法工具箱(GA)对Bouc-Wen模型进行参数识别。 实验数据来源于对磁流变阻…

MATLAB机器学习系列-10:遗传算法原理及其matlab遗传算法工具箱使用

遗传算法原理 基本思想 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则,它最初由美国Michigan大学的J. Holland教授于1967年提出。遗传算法是从代表问题…

2021-04-26 Matlab遗传算法工具箱的使用及实例(线性规划)

Matlab遗传算法工具箱的使用及实例(线性规划) 引言 在使用遗传算法(Genetic Algorithm,GA)之前,你得了解遗传算法是干什么的。遗传算法一般用于求解优化问题。遗传算法最早是由美国的 John holland于20世纪70年代提出,该算法是根…

遗传算法工具箱_含约束条件的遗传算法在连续催化重整优化操作中的应用

遗传算法(Genetic a lgo rithm s, GA ) 是由Hol-land 教授及其学生首先提出的一种仿照生物学中进化论思想而衍生出的优化算法。遗传算法应用于优化问题的求解, 是一个启发式随机搜索的过程, 与传统的优化搜索算法相比具有可以克服局部最优解的陷阱, 搜索得到全局最优解等特点, …

北卡罗来纳大学遗传算法工具箱

目录 北卡罗来纳大学遗传算法工具箱 gaot 重要函数如下 1.initializega函数介绍 2.ga函数介绍 3.initializega求解一元函数 注:本文的代码可用于matlab 2012a版本 北卡罗来纳大学遗传算法工具箱 gaot 重要函数如下 optimtool(matlab内部封装函数&a…

Matlab遗传算法工具箱求函数最小值

题目 先上代码 %%%%%%%%%%%%%%% %% test.m %% %% Feng1909 %% %%%%%%%%%%%%%%% function result test(a)is_max 0;x a(1);y a(2);PI 3.141592653;if is_max 0result -(sin(3*PI*x)*cos(4*PI*y)cos(5*PI*x*sin(2*PI*y)))*(1);endif is_max 1result (sin(3*PI*x)*c…

简单使用MATLAB自带的遗传算法工具箱

一、使用单变量进行参数寻优 如s = -2x ,当x在[0,1]范围内,取多少时s为最小值? 使用步骤如下: 1、建立一个function函数,命名为fu.m 2、在MATLAB命令窗口输入optimtool,接下来进行选择,选择完后,点击start。 x = 1时,s取-2(最小值) 寻优曲线图如下: 二、使用双变…

谢菲尔德遗传算法工具箱

谢菲尔德遗传算法工具箱的使用 安装工具箱下载工具箱添加路径标题 遗传算法函数ranking()函数select()函数bs2rv()函数小结 安装工具箱 谢菲尔德遗传算法工具箱作为matlab的一个函数库,可以简单实现遗传算法。我一开始学习了粒子群优化算法和鲸鱼优化算法等群智能优…

Matlab遗传算法工具箱的使用

Matlab遗传算法工具箱的使用 遗传算法(Genetic Algorithm,GA)是J.Holland教授1975年在其专著中首次发表,又经Goldberg、DeJong等研究总结形成的一种模拟进化算法,其基于生物进化和物种选择理论模拟自然界基因进化的过程…