【STM32】WDG看门狗(学习笔记)

 学习来源----->江协科技STM32

WDG简介

  1. WDG(Watchdog)看门狗
  2. 看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
  3. 看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
  4. STM32内置两个看门狗
  5. 独立看门狗(IWDG):独立工作,对时间精度要求较低
  6. 窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用

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

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。

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

IWDG主要性能

● 自由运行的递减计数器

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

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

    IWDG框图  

     

    1. 核心模块组成

    • 寄存器模块
      • 预分频寄存器(IWDG_PR):配置 8 位预分频器参数,对输入时钟(LSI)进行分频,调整计数器计数频率。
      • 重装载寄存器(IWDG_RLR):存储 12 位重装载数值,用于初始化 12 位递减计数器的计数初值。
      • 键寄存器(IWDG_KR):写入特定命令(如启动看门狗、喂狗操作),控制看门狗功能的开启与重置。
      • 状态寄存器(IWDG_SR):记录看门狗状态标志(如计数器溢出标志),供软件查询。
    • 时钟与计数模块
      • LSI 时钟输入:采用 40 kHz 的低速内部时钟(LSI)作为独立看门狗的时钟源,确保在主时钟故障时仍能工作。
      • 8 位预分频器:对 LSI 时钟分频,输出给 12 位递减计数器,扩展计数周期。
      • 12 位递减计数器:根据预分频后的时钟递减计数,当计数到 0 时触发 IWDG 复位。

    2. 工作流程

    1. 初始化配置:通过 IWDG_PR 设置预分频系数,通过 IWDG_RLR 设置重装载值,通过 IWDG_KR 写入命令启动看门狗。
    2. 计数与喂狗:计数器在预分频时钟驱动下递减,若系统正常运行,需定期通过 IWDG_KR 执行 “喂狗”(写入特定值),重新装载计数器初值,避免计数到 0。
    3. 复位触发:若未及时喂狗,计数器递减至 0 时,触发 IWDG 复位信号,强制系统重启。

    3. 供电特性

    图中红色标注强调:独立看门狗功能位于 VDD 供电区,即使系统进入停机或待机模式,仍能正常工作,确保在低功耗模式下也能监控系统状态,提升可靠性。

     IWDG键寄存器

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

    写入键寄存器的值

    作用

    0xCCCC

    启用独立看门狗

    0xAAAA

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

    0x5555

    解除IWDG_PRIWDG_RLR的写保护

    0x5555之外的其他值

    启用IWDG_PRIWDG_RLR的写保护

    键寄存器(IWDG_KR)是独立看门狗(IWDG)的核心控制寄存器,通过写入特定指令码实现以下功能:

    1. 启动看门狗:向 IWDG_KR 写入 0xCCCC,激活独立看门狗,使能内部 12 位递减计数器开始工作。
    2. 喂狗操作(重装载计数器):系统正常运行时,需定期写入 0xAAAA,触发计数器重新装载重装载寄存器(IWDG_RLR) 中的初始值,避免计数器递减至 0 引发复位。
    3. 寄存器写使能:写入 0x5555 可临时使能对 预分频寄存器(IWDG_PR) 和 重装载寄存器(IWDG_RLR) 的写权限,允许修改预分频系数或重装载值,完成配置后写权限自动关闭,保障寄存器配置的安全性。

    IWDG_KR 通过特定指令码实现对看门狗的启动、喂狗及寄存器配置控制,是软件与硬件看门狗交互的关键接口。

     IWDG超时时间

    写程序的时候超时时间要设置多少,要根据自己的项目来设置 ,如果没有特别要求,卡死后过个一两秒再复位也不影响的话,那这个超时时间可以设置大一点

    • 超时时间:TIWDG = TLSI × PR预分频系数 × (RL + 1)
    • 其中:TLSI = 1 / FLSI 

     

    WWDG简介

    窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

    WWDG功能描述

    如果看门狗被启动(WWDG_CR寄存器中的WDGA位被置’1’), 并且当7位(T[6:0])递减计数器从0x40翻转到0x3F(T6位清零)时,则产生一个复位。如果软件在计数器值大于窗口寄存器中的数值时重新装载计数器,将产生一个复位。

     WWDG工作特性

    1.  递减计数器T[6:0]的值小于0x40时,WWDG产生复位
    2. 递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位
    3. 递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位
    4. 定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位

    该窗口看门狗时序图展示了计数器递减过程、刷新窗口限制及复位触发逻辑,具体解读如下:

    1. 计数器递减过程

    • T [6:0] 递减计数器:从初始值开始持续递减,横坐标为时间,纵坐标为计数器值。
    • 关键阈值
      • W [6:0](窗口值):预设的上限阈值,定义 “不允许刷新” 与 “刷新窗口” 的分界。
      • 0x3Fh:计数器的下限阈值(T6 位变为 0),若此时未完成喂狗,触发复位。

    2. 刷新窗口限制

    • 不允许刷新区间:计数器值 > W[6:0] 时,若执行 “喂狗”(刷新计数器),会触发复位。这是因为此时刷新属于 “窗口外操作”,违背时序要求。
    • 刷新窗口区间:计数器值处于 W[6:0] ~ 0x3Fh 时,允许通过写寄存器更新计数器(合法喂狗),避免计数器递减至 0x3Fh 触发复位。

    3. T6 位与复位触发

    • T6 位变化:当计数器递减至 0x3Fh 时,T6 位从 1 变为 0。
    • 复位逻辑:若计数器到达 0x3Fh 仍未喂狗,硬件触发复位信号,强制系统重启,确保程序异常时恢复运行

     WWDG超时时间

    要根据自己的项目要求来设置,确定想要设置的超时时间(最晚时间)和窗口时间(最晚时间)

    超时时间:     

    • TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)

    窗口时间:     

    • TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])
    • 其中:TPCLK1 = 1 / FPCLK1 =1/36MHz

     计算方法和IDWG看门狗一样

     IWDG和WWDG对比

    IWDG独立看门狗

    WWDG窗口看门狗

    复位

    计数器减到0

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

    中断

    早期唤醒中断

    时钟源

    LSI40KHz

    PCLK136MHz

    预分频系数

    483264128256

    1248

    计数器

    12

    6位(有效计数)

    超时时间

    0.1ms~26214.4ms

    113us~58.25ms

    喂狗方式

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

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

    防误操作

    键寄存器和写保护

    用途

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

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

     独立看门狗程序

    初始化IWDG 

     ①开启LSI时钟(但是不需我们手动开启)

     

    ②写入键值0x5555解除写保护,然后再写入预分频值和重装载值

    ③写入键寄存器0xCCCC启动独立看门狗

    ④然后再主循环执行喂狗操作 

    int main(void)
    {OLED_Init();						//OLED初始化Key_Init();							//按键初始化OLED_ShowString(1, 1, "IWDG TEST");/*判断复位信号来源*/if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)	//如果是独立看门狗复位{OLED_ShowString(2, 1, "IWDGRST");			//OLED闪烁IWDGRST字符串Delay_ms(500);OLED_ShowString(2, 1, "       ");Delay_ms(100);RCC_ClearFlag();							//清除标志位}else											//否则,即为其他复位{OLED_ShowString(3, 1, "RST");				//OLED闪烁RST字符串Delay_ms(500);OLED_ShowString(3, 1, "   ");Delay_ms(100);}/*IWDG初始化*/IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);	//独立看门狗写使能IWDG_SetPrescaler(IWDG_Prescaler_16);			//设置预分频为16IWDG_SetReload(2499);							//设置重装值为2499,独立看门狗的超时时间为1000msIWDG_ReloadCounter();							//重装计数器,喂狗IWDG_Enable();									//独立看门狗使能while (1){Key_GetNum();								//调用阻塞式的按键扫描函数,模拟主循环卡死IWDG_ReloadCounter();						//重装计数器,喂狗OLED_ShowString(4, 1, "FEED");				//OLED闪烁FEED字符串Delay_ms(200);								//喂狗间隔为200+600=800msOLED_ShowString(4, 1, "    ");Delay_ms(600);}
    }

    独立看门狗超时时间计算上面草稿有写,如果不懂就跳转视频看看:超时时间计算

    相关函数: 

     void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)//启用或禁用对IWDG_PR和IWDG_RLR寄存器的写访问

    参数说明
    IWDG_WriteAccessIWDG_PR和IWDG_RLR寄存器写访问的新状态

     void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)//设置IWDG预分频值

    参数说明
    IWDG_Prescaler指定IWDG预分频器值

    void IWDG_SetReload(uint16_t Reload)//设置IWDG 重装值 

    参数说明
    Reload指定IWDG的重装值,该参数必须为0 ~ 0x0FFF之间的数字

     void IWDG_ReloadCounter(void)//用重新加载寄存器中定义的值重新加载IWDG计数器

    void IWDG_Enable(void)//启用IWDG(开启对IWDG_PR和IWDG_RLR寄存器的写保护)

    FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)//检查是否设置了指定的RCC标志 

    参数说明
    RCC_FLAG指定要检查的标志

     窗口看门狗

    WWDG初始化 

    ①开启窗口看门狗ABP1的时钟

    ②配置各个寄存器(设置预分频和设置窗口值)

    ③写入控制寄存器CR(包含看门狗使能位,计数器标志溢出位,计数器有效位)

    ④最后,再运行过程中向计数器写入想要的计数重装值

    int main(void)
    {OLED_Init();						//OLED初始化Key_Init();							//按键初始化OLED_ShowString(1, 1, "WWDG TEST");/*判断复位信号来源*/if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)	//如果是窗口看门狗复位{OLED_ShowString(2, 1, "WWDGRST");			//OLED闪烁WWDGRST字符串Delay_ms(500);OLED_ShowString(2, 1, "       ");Delay_ms(100);RCC_ClearFlag();							//清除标志位}else											//否则,即为其他复位{OLED_ShowString(3, 1, "RST");				//OLED闪烁RST字符串Delay_ms(500);OLED_ShowString(3, 1, "   ");Delay_ms(100);}/*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);	//开启WWDG的时钟/*WWDG初始化*/WWDG_SetPrescaler(WWDG_Prescaler_8);			//设置预分频为8WWDG_SetWindowValue(0x40 | 21);					//设置窗口值,窗口时间为30msWWDG_Enable(0x40 | 54);							//使能并第一次喂狗,超时时间为50mswhile (1){Key_GetNum();								//调用阻塞式的按键扫描函数,模拟主循环卡死OLED_ShowString(4, 1, "FEED");				//OLED闪烁FEED字符串Delay_ms(20);								//喂狗间隔为20+20=40msOLED_ShowString(4, 1, "    ");Delay_ms(20);WWDG_SetCounter(0x40 | 54);					//重装计数器,喂狗}
    }
    

     超时时间和窗口时间计算和独立看门狗一样:计算步骤

     相关函数:

     void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)//设置WWDG预分频器

    参数说明
    WWDG_Prescaler指定WWDG预分频器

    void WWDG_SetWindowValue(uint8_t WindowValue)//设置WWDG窗口值 

    参数说明
    WindowValue指定要与下计数器进行比较的窗口值,该参数必须小于0x80

     void WWDG_SetCounter(uint8_t Counter)//设置WWDG计数器值

    参数说明
    Counter看门狗计数器的值,该参数必须为0x40 ~ 0x7F之间的数字

     void WWDG_Enable(uint8_t Counter)//启用WWDG窗口看门狗并加载计数器值

    参数说明
    Counter看门狗计数器的值,该参数必须为0x40 ~ 0x7F之间的数字

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

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

    相关文章

    Java 数据库连接池

    HikariCP 老外开源的。 Spring Boot 2 之后默认选择的连接池。 号称性能最快的数据库连接池。 为什么性能好呢? ● 字节码级别的优化-尽量的利用 JIT 的内联手段 ● 字节码级别的优化-利用更容易被 JVM 优化的指令 ● 代码级别的优化-利用改造后的 FastList 代替…

    Spring Boot中@Valid 与 @Validated 注解的详解

    Spring Boot中Valid 与 Validated 注解的详解 引言Valid注解功能介绍使用场景代码样例 Validated注解功能介绍使用场景代码样例 Valid与Validated的区别结论 引言 在Spring Boot应用中,参数校验是确保数据完整性和一致性的重要手段。Valid和Validated注解是Spring …

    C++搜索

    功能扩展说明: 图类封装:将图数据结构封装为类,提高代码复用性 最短路径查找:基于BFS实现未加权图的最短路径查找 路径重构:通过parent数组回溯构建完整路径 异常处理:当路径不存在时返回空向量 复杂度分析…

    2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

    本来想刷省赛题呢,结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但,又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 一、子2023-&#xff…

    CSS学习笔记6——网页布局

    目录 一、元素的浮动属性、清除浮动 清除浮动的其他方法 1、使用空标签清除浮动影响 2、使用overflow属性清除浮动 3、使用伪元素清除浮动影响 原理 overflow属性 二、元素的定位 1、相对定位 2、绝对定位 ​编辑 3、固定定位 z-index层叠等级属性 一、元素的浮动…

    sqlalchemy:将mysql切换到OpenGauss

    说明 之前python的项目使用的mysql,近期要切换到国产数据库OpenGauss。 之前的方案是fastapisqlalchemy,测试下来发现不用改代码,只要改下配置即可。 切换方案 安装openGauss-connector-python-psycopg2 其代码工程在:https:…

    uniapp 获取dom信息(封装获取元素信息工具函数)

    在uniapp开发中,需要获取到dom的信息,需要用到uniapp的指定方式 uni.createSelectorQuery(),但是每次需要用到的时候都需要很长一段的繁琐代码,本篇文章将呈现获取dom信息方法封装,话不多说,上菜&#xff1…

    Linux之数据链路层

    Linux之数据链路层 一.以太网1.1以太网帧格式1.2MAC地址1.3MTU 二.ARP协议2.1ARP协议工作流程2.2ARP协议格式 三.NAT技术四.代理服务4.1正向代理4.2反向代理 五.四大层的学习总结 一.以太网 在我们学习完了网络层后我们接下来就要进入数据链路层的学习了,在学习完网…

    MySQL的基础语法2(函数-字符串函数、数值函数、日期函数和流程函数 )

    目录 一、字符串函数 1.常见字符串函数 ​编辑 2.字符串函数的基本使用 3.字符串函数的数据库案例演示 二、数值函数 1.常见数值函数(如下): 2.数值函数的基本使用 3.数值函数的数据库案例演示 三、日期函数 1.常见的日期函数 2.日…

    全新版租赁商城小程序源码系统 源码开源支持二开+图文搭建教程

    在互联网商业的浪潮中,租赁业务凭借其独特的优势,正逐渐成为市场的新宠。对于开发者而言,快速搭建一个功能完备的租赁商城小程序,不仅能满足市场需求,还能为自己的业务拓展带来新的机遇。分享一款全新版租赁商城小程序…

    Cent OS7+Docker+Dify

    由于我之前安装了Dify v1.0.0,出现了一些问题:无法删除,包括:知识库中的文件、应用、智能体、工作流,都无法删除。现在把服务器初始化,一步步重新安装,从0到有。 目录 1、服务器重装系统和配置…

    OSI 七层模型和四层模型(TCP/IP 模型)

    文章目录 前言一、OSI 七层模型二、TCP/IP 四层模型三、运行协议及设备1. OSI 七层模型2. TCP/IP 四层模型3. 运行协议4. 各类设备的作用 总结 前言 OSI 七层模型和四层模型(TCP/IP 模型)是两种常见的网络协议分层架构,它们的主要区别如下&a…

    AI的未来:机遇、挑战与发展方向

    📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 人工智能(AI)已经成为当今世界最具革命性的技术之一,它正在深刻改变各个行业&#x…

    javascript实现一个函数,将字符串中的指定子串全部替换为另一个字符串的原理,以及多种方法实现。

    大白话javascript实现一个函数,将字符串中的指定子串全部替换为另一个字符串的原理,以及多种方法实现。 在JavaScript里,要是你想把字符串里的指定子串都替换成另外一个字符串,有不少方法可以实现。下面我会详细介绍实现的原理&a…

    硬件基础--16_公式梳理

    公式梳理 欧姆定律: IU/R 1.欧姆定律有局限性,仅适用于纯电阻电路(或者说纯电阻元器件,纯电阻设备) 2.纯电阻电路:消耗的电能仅转化为热能,没有其他形式的能量转换。 功率计算:PUI 1.导出公式:PU2 /R 2.导出公式:PI2 R 焦耳定律:QI2 Rt 1.导…

    npm i 出现的网络问题

    npm i 出现的网络问题 解决方案: npm config list 查看.npmrc文件中是否配置了proxy删除.npmrc文件中的proxy,保存。重新执行npm i命令。 顺便说说解决这个问题的心里路程 每次安装vue的环境的时候,经常遇到npm安装一些插件或者是依赖的时…

    使用vue cli 5.0 在vscode中运行vue命令报错

    1、运行 vue -- version 报错 2、在cmd 命令行 执行 vue --version 正常 3、在终端中输入 get-ExecutionPolicy,查看当前权限 4、执行 set-executionpolicy remotesigned 命令设置为可用模式,但是报错 5、使用管理员打开power shell 执行 G…

    瑞芯微 RKrga接口 wrapbuffer_virtualaddr 使用笔记

    一、源码 官方在librga中给了很多 demo 以供参考&#xff0c;例如 imresize 操作&#xff1a; /** Copyright (C) 2022 Rockchip Electronics Co., Ltd.* Authors:* YuQiaowei <cerf.yurock-chips.com>** Licensed under the Apache License, Version 2.0 (the &qu…

    Spring MVC:从历史演变到实战入门

    1. Java Web的发展历史与MVC模式 1.1 Model I与Model II的演进 Model I&#xff08;JSPJavaBean&#xff09; 作为早期Java Web开发的主流模式&#xff0c;其核心架构如下&#xff1a; graph LR A[客户端] --> B[JSP页面] B --> C{业务逻辑} C --> D[JavaBean] D -…

    AI赋能,防御无界:群联云防护如何颠覆传统DDoS防御格局?

    一、AI驱动的动态防御体系 智能流量调度 群联云防护通过AI算法实时分析流量特征&#xff0c;动态分配清洗节点。当检测到攻击时&#xff0c;系统能在秒级内将流量切换至备用节点&#xff0c;避免单点过载。相较传统高防IP依赖静态规则&#xff0c;群联的调度策略可减少50%的误封…