深入解析:STM32——WDG看门狗

news/2025/9/22 17:26:28/文章来源:https://www.cnblogs.com/yfceshi/p/19105674

目录

一、WDG简介

二、IWDG独立看门狗

2.1.IWDG框图

2.2.IWDG键寄存器

2.3.IWDG超时时间

2.4.适用场景

三、WWDG窗口看门狗

3.1.WWDG框图

3.2.WWDG工作特性

3.3.WWDG超时时间

3.4.适用场景

四、IWDG&WWDG对比

五、使用建议

六、独立看门狗代码编程

6.1.独立看门狗配置流程:

6.2.独立看门狗库函数

6.3独立看门狗代码

七、窗口看门狗代码编程

7.1窗口看门狗初始化:

7.2窗口看门狗库函数

7.3窗口看门狗代码


一、WDG简介

  • WDG(Watchdog)看门狗

  • 看门狗可以监控程序的运行状态(监督员),当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性

  • 看门狗本质上是一个定时器,核心原理是:系统需要在规定时间内定期“喂狗”(重置计数器),如果超过这个时间未能喂狗,看门狗就会强制触发系统复位,让程序从初始状态重新开始运行,从而脱离死机状态。

  • STM32内置两个看门狗,互为补充,适用于不同场景

独立看门狗(IWDG):独立工作,对时间精度要求较低

窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用

二、IWDG独立看门狗

2.1.IWDG框图

  • 独立运行:由独立的低速内部时钟(LSI ~40kHz)驱动。这意味着即使主时钟(HCLK)发生故障(例如外部晶振失效),IWDG依然能正常工作,可靠性极高。

  • 自由运行:一旦启用,无法被软件禁用(除非复位)。这防止了软件意外或恶意禁用看门狗。

  • 简单粗暴:只有一个时间要求:必须在计数器减到0之前喂狗(重载计数器)。早喂晚喂都可以,只要别超时。

  • 时钟源:专用的LSI RC振荡器(通常约40kHz,但精度较低,需留有余量)。

  • 预分频器:8位(最大进行256分频),IWDG_PR与分频寄存器分配系数

  • 12位递减计数器:最大值2^12-1=4095,从初始值(重载值)开始向下计数,减到0产生复位信号

  • 重装载数值:正常运行时为避免复位,提前在重装寄存器IWDG_RLR写一个值,之后,在运行过程中,在键寄存器IWDG_KR写入一个特定数据,控制电路,进行喂狗,此时重装值会复制到当前计数器中,计数值回到重装值,重新自减运行。
  • 喂狗操作:手动重置计数器(递减计数器,减到0复位);程序正常运行时,为了避免复位,在计数器减到0之前,及时把计数值加大。若程序卡死,未及时加大计数值,则计数值减到0后就自动复位。
  • 状态寄存器IWDG_SR:两个更新同步位,标志电路运行状态

2.2.IWDG键寄存器

•键寄存器本质上是控制寄存器,用于控制硬件电路的工作

•在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率

写入键寄存器的值

作用

0xCCCC

启用IWDG独立看门狗

0xAAAA

IWDG_RLR中的值重新加载到计数器(喂狗)

0x5555

解除IWDG_PR和IWDG_RLR的写保护(允许访问预分频器和重载寄存器)

0x5555之外的其他值

启用IWDG_PR和IWDG_RLR的写保护(防止误操作)

2.3.IWDG超时时间

超时时间:TIWDG = TLSI × PR预分频系数 × (RL + 1)

其中:TLSI = 1 / FLSI

预分频系数(4, 8, 16, 32, 64, 128, 256)

2.4.适用场景

  • 防止硬件故障(如外部晶振停振)。

  • 应对未知的软件错误(程序跑飞、死循环)。

  • 对时间要求不严格,只需保证系统最终能复位即可的场合。

三、WWDG窗口看门狗

3.1.WWDG框图

  • 依赖于主时钟(PCLK1):由APB1时钟分频后驱动,默认36MHz。如果主时钟失效,WWDG也会失效。因此它主要用于监测软件逻辑。

  • 看门狗预分频器WDGTB:调节后面计数器的时钟频率

  • 窗口概念:喂狗必须在一个精确的时间窗口内完成。

    • 不能太早:计数器值高于窗口寄存器的值(T6:0>W6:0)时喂狗,会立即复位。

    • 不能太晚:计数器减到0x3F(0 111111)之前仍未喂狗,会复位。

    • 必须在窗口期内:计数器值低于窗口值且大于0x3F时喂狗,才是正确的。

  • 窗口值(WWDG_CFR看门狗配置寄存器 W[6:0]):定义了喂狗的上限边界。计数器值必须低于这个值且高于0x3F时喂狗才安全。

  • WDGA:窗口看门狗的激活位,=1启用窗口看门狗

  • 可产生早期中断:在即将复位(计数器减到0x40)时,可以产生一个早期唤醒中断(EWI),允许在复位前执行一些紧急日志保存或安全处理操作。

  • 时钟源:APB1时钟(PCLK1)经过固定分频(默认1, 2, 4, 8)。

  • 6位递减计数器CNT:位于控制寄存器CR内,bits [6:0] 有效。T6为复位标志位,当计数器从0x40(1 000000)减到0x3F(0 111111)时,会产生复位。bit6 (T6) 是下降沿检测位。

3.2.WWDG工作特性

•递减计数器T[6:0]的值小于0x40时,WWDG产生复位

•递减计数器T[6:0]在窗口W[6:0]外被重新装载时(过早喂狗),WWDG产生复位

•递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位

•定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位

3.3.WWDG超时时间

超时时间(最晚时间):TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)

窗口时间(最早时间):TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])

其中:TPCLK1 = 1 / FPCLK1

4096为固定分频

3.4.适用场景

  • 监测特定任务的执行周期。例如,一个任务必须每10ms执行一次,不能太快也不能太慢。WWDG可以确保该任务严格按预期的时间规划执行。

  • 需要在上复位前进行紧急处理的复杂系统

四、IWDG&WWDG对比

IWDG独立看门狗

WWDG窗口看门狗

复位

计数器减到0后

计数器T[5:0]减到0后、过早重装计数器

中断

早期唤醒中断

时钟源

LSI(40KHz)

PCLK1(36MHz)

预分频系数

4、8、32、64、128、256

1、2、4、8

计数器

12位

6位(有效计数)

超时时间

0.1ms~26214.4ms

113us~58.25ms

喂狗方式

写入键寄存器,重装固定值RLR

直接写入计数器,写多少重装多少

防误操作

键寄存器和写保护

用途

独立工作,对时间精度要求较低

要求看门狗在精确计时窗口起作用

五、使用建议

  1. IWDG用于保底:在大多数项目中,都应启用IWDG作为最后一道防线,防止系统彻底死锁。

  2. WWDG用于精密控制:在对任务执行时序有严格要求的关键应用中,使用WWDG来确保软件的健壮性。

  3. 喂狗位置:喂狗操作应放在主循环或关键任务完成的地方,确保系统正常运行时就一定能喂到狗。

  4. 中断中喂狗需谨慎:避免在高级别中断中喂狗,否则即使主程序已卡死,中断仍能正常喂狗,导致看门狗失效。

  5. 计算超时时间要留余量:尤其是LSI时钟精度较低,计算出的超时时间可能不准,设置 reload value 时要留出足够的余量。

六、独立看门狗代码编程

6.1.独立看门狗配置流程:

1.开启LSI时钟(如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG)
2.解除写保护0x5555,写入预分频器和重装寄存器(根据超时时间公式计算)
3.启动独立看门狗0xCCCC
4.在主循环,重复执行0xAAAA喂狗

6.2.独立看门狗库函数

1.写使能控制
    void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
2.写预分频器
    void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
3.写重装值
    void IWDG_SetReload(uint16_t Reload);
4.重新装载寄存器(喂狗)
    void IWDG_ReloadCounter(void);
5.启动独立看门狗
    void IWDG_Enable(void);
6.获取标志位状态
    FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);
7.标志位查询看门狗导致复位还是上电/复位键导致的复位
    FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
    void RCC_ClearFlag(void);标志位不会自动清零,需手动清零

6.3独立看门狗代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "key.h"
int main(void)
{
OLED_Init();
key_scan();
OLED_ShowString(1,1,"IWDG TEXT");
if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET)
{
OLED_ShowString(2,1,"IWDGRST");
Delay_ms(500);
OLED_ShowString(2,1,"       ");
Delay_ms(100);
RCC_ClearFlag();
}
else
{
OLED_ShowString(3,1,"RST");
Delay_ms(500);
OLED_ShowString(3,1,"   ");
Delay_ms(100);
}
/*
初始化看门狗
*/
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//开启写访问
IWDG_SetPrescaler(IWDG_Prescaler_16);
IWDG_SetReload(2499);
//若超时时间为1000ms,则喂狗时间间隔不能超过1s
//因此TIWDG=1000ms,TLSI=1/40KHz=0.025ms
//公式:TIWDG=TLSI*PR*(RL+1)
//选择16分频,最短时间0.4ms 最长时间1638.4ms
//因此RL=2500-1
IWDG_ReloadCounter();
IWDG_Enable();//启动之前,先喂一次狗,这样,启动之后的第一个喂狗周期为1s
//写完之后,不用手动进行写保护
while(1)
{
key_init();
IWDG_ReloadCounter();
OLED_ShowString(4,1,"FEED");
Delay_ms(200);
OLED_ShowString(4,1,"    ");
Delay_ms(200);
}
}

七、窗口看门狗代码编程

7.1窗口看门狗初始化:

①开启APB1时钟(PCLK1)
②配置预分频寄存器(窗口看门狗无写保护,直接写入寄存器)
③配置控制寄存器(看门狗使能位,计数器溢出标志位,计数器有效位)
④在运行过程中,不断写入重装值,就可喂狗

7.2窗口看门狗库函数

1.恢复缺省配置
    void WWDG_DeInit(void);
2.写入预分频器
    void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
3.写入窗口值
    void WWDG_SetWindowValue(uint8_t WindowValue);
4.使能中断
    void WWDG_EnableIT(void);
5.写入计数器
    void WWDG_SetCounter(uint8_t Counter);
6.使能看门狗
(递减计数器处于自由运行状态,即使开门狗被禁止递减,计数器仍继续递减。当看门狗被启用时,T6位必须被设置,以防止立即产生一个复位。 )
    void WWDG_Enable(uint8_t Counter);
7.获取标志位
  FlagStatus WWDG_GetFlagStatus(void);
8.清除标志位
  void WWDG_ClearFlag(void);

7.3窗口看门狗代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "key.h"
int main(void)
{
OLED_Init();
key_scan();
OLED_ShowString(1,1,"WWDG TEXT");
if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)==SET)
{
OLED_ShowString(2,1,"WWDGRST");
Delay_ms(500);
OLED_ShowString(2,1,"       ");
Delay_ms(100);
RCC_ClearFlag();
}
else
{
OLED_ShowString(3,1,"RST");
Delay_ms(500);
OLED_ShowString(3,1,"   ");
Delay_ms(100);
}
/*
初始化窗口看门狗
*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_SetWindowValue(21|0x40);//30ms
/*
确定超时时间(最晚时间)和窗口时间(最早时间)
超时时间50ms:TPCLK1(1/36MHz)*4096*WDGTB预分频系数*(T[5:0]+1)
WDGB=3,最小超时时间910us,最大超时时间58.25ms,在时间范围内,因此预分频系数为2^3=8
计算出T[5:0]=54,重装值=计数值T[6:0]|WDGA(1/0)
T6位必须位1,T6为复位标志位,当计数器从0x40(1 000000)减到0x3F(0 111111)时,会产生复位。
在使能时,需要首次写入重装值,在喂狗时,也要不断写入重装值
窗口时间30ms:TPCLK1*4096*WDGTB预分频系数*(T[5:0]-W[5:0])
计算出w[5:0]=21 窗口值为w[6:0]=w[5:0]|0x40
*/
WWDG_Enable(54|0x40);//50ms
while(1)
{
key_init();
//		WWDG_SetCounter(54|0x40);
OLED_ShowString(4,1,"FEED");
Delay_ms(20);
OLED_ShowString(4,1,"    ");
Delay_ms(20);
//延时不可以超过50ms
//以上代码显示结果一直触发复位,是因为使能看门狗并且第一次喂狗和下一次喂狗时间间隔太小,因此需要将喂狗代码放到延时之后
WWDG_SetCounter(54|0x40);
//时间概括:上次喂狗时间--空闲窗口30ms---喂狗区间20ms--最晚不能晚于50ms
}
}

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

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

相关文章

wxpython图形界面_01_最小基本结构

import wx# 创建应用程序对象 app = wx.App()# 创建窗口对象 frm = wx.Frame(None, title=第一个应用程序, size=(800, 600), pos=(200, 50))# 显示窗口 frm.Show()# 进入主事件循环 app.MainLoop()

做网站最小的字体是多少网站租用 凡

介绍Objects Comparer是用于对象比较的工具,c#常见的数据结构都是可以用这个三方库进行对比,比较复杂的对象也是可以比较的。简而言之,Objects Comparer 是一个对象到对象的比较器,它允许逐个成员递归得比较对象,并为某…

漳州建设银行网站首页珠海知业科技

能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的,在人们的工作生活中,也就需要互联网技术来方便人们的日常工作生活,实现工作办公的自动化处理,实现信息化,无纸化…

万网网站域名wordpress 黄蓝 现代企业

【ADB全称 Android Debug Bridge】 是Android SDK中的一个命令行工具adb命令可以直接操作管理Android模拟器或真实的Android设备(手机) 建立PC和模拟器连接 # 建立连接 adb connect 127.0.1: 模拟器端口号〈逍遥模拟器21503〉 # 验证是否连接成功 adb d…

朝阳周边网站建设办公管理软件定制

在当今信息爆炸的时代,人工智能在各行各业都发挥着越来越重要的作用,高校教育领域也不例外。最近,越来越多的高校开始陆续拥抱chatgpt(Chatbot GPT)这一人工智能技术,在学术领域会带来了怎样的变化与影响&a…

湖南网站设计外包费用制作网页可用邮件合并吗

前情:上一篇实际是让AI工具帮我总结了一下讨论的内容,这里把讨论的过程贴出来,这个讨论是为解决实际问题 前文https://blog.csdn.net/wgdzg/article/details/145039446 问题说明: 我使用 docker compose 管理我的容器&#xff0…

陈村网站设计选择seo网站排名优化

广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A) 2019年4月19日 学院 计算机科学与教育软件学院 年级、专业、班 计算机科学与技术 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验三…

做网站的第一步有没有做废品的网站

很多朋友在家中装修完时候,为了整齐和方便收纳都会把每个屋中的网口和光纤输出口集中到一起,放置到网络箱中,看起来更加整齐划一,但是装修时都不会考虑到网线要预留很长,很多时候都只留了很短的一节网线,还…

服务器总资源监控脚本

#!/bin/bash # 服务器总资源监控脚本# 功能:监测CPU个数、总内存大小、总磁盘大小 # 设置文件夹和文件路径LOG_DIR="/log"LOG_FILE="$LOG_DIR/computer.txt" # 创建日志目录(如果不存在)if [ !…

一个身体,两个身体

本文致敬刘慈欣先生的《带上她的眼睛》。 零“这次,换我带你看宇宙吧。”一 阳光依旧炽烈,透过叶片,投射在大草坪上。 那个村庄里的孩子程丽,早上八点,一如既往地打开彩电: “星桥计划即将于3017年2月27号实施,…

006_字典操作

1、创建字典、访问字典中的值、字典中添加键值对、修改字典中的值、del 永久删除字典中的键值对、get()访问字典 cars = {宝马:95,长安:92,奔驰:95,吉利:92,奥迪:95,} print(cars)# 创建一个字典 user = {} # 创建一个…

简单理解java虚拟机

简单理解java虚拟机 一、学习 JVM 的核心意义面试刚需:避免依赖死记硬背 “面试八股”,从底层理解问题本质(如 Integer 缓存、静态方法能否重写)。 基础支撑:明确代码执行逻辑,是编写高可靠性系统的前提;若不理…

网站内容页面怎么做的广州番禺人才网官网

结论:不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。 Spring 的 bean 作用域&#…

东方通中间件嵌入式监控脚本

#!/bin/bash # 东方通中间件嵌入式监控脚本# 功能:监测CPU和内存使用率,保存到/log/dftqr.txt # 设置文件夹和文件路径LOG_DIR="/log"LOG_FILE="$LOG_DIR/dftqr.txt"PROCESS_NAME="skactio…

设计网站 站什么网简单的个人主页网站制作html

目录 1.对全局变量的检测能力 2.struct类型增强 3.c中所有变量和函数都必须有类型 4.c中新增的bool类型 5.三目运算符的加强 6.const的增强 7.对枚举的增强 1.对全局变量的检测能力 C语言中同时定义两个相同的全局变量编译器并不会报错,而c中就会报重定义错…

律师网站建设模板网站源码开发

字符指针变量 在指针的类型中我们知道有一种指针叫做字符指针 它的使用情况如下&#xff1a; #include<stdio.h> int main() {char pa w;char*p1&pa;*p1 a;printf("%c\n", *p1);return 0; } 在这段代码当中&#xff0c;我们将‘w’字符的地址传到了p…

引导型网站设计个人主题网站做的步骤

文章目录 前言一、什么是Windows PE格式中的导入表&#xff1f;二、解析导入表并显示1.导入表的结构2.解析导入表3.显示导入表 前言 通过分析和解析Windows PE格式&#xff0c;并使用qt进行图形化显示 一、什么是Windows PE格式中的导入表&#xff1f; 在Windows中&#xff0…

php做网站怎么布局wordpress node.js

概述本文大部分整理自《Java并发编程的艺术》&#xff0c;温故而知新&#xff0c;加深对基础的理解程度。指令序列的重排序我们在编写代码的时候&#xff0c;通常自上而下编写&#xff0c;那么希望执行的顺序&#xff0c;理论上也是逐步串行执行&#xff0c;但是为了提高性能&a…

个人网站做商城网站宽度设计

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分&#xff0c;它提供了两个重要的功能&#xff1a;服务注册与发现和统一…

国内高清视频素材网站推荐企业网站首页开发

题目 水题系列。给出一个图&#xff0c;求他的连通分量。 科普&#xff1a;连通分量就是一个图中可以连接最多点的子图&#xff08;可以是它本身&#xff09;的点数量。 输入 5(点的数量) 1 2(表示1和2连通) 3 4 2 3 0 0(表示停止输入) 输出 4 解题思路 Er…这道题没…