05:HAL-----看门狗WDT

 

目录

一:看门狗

1:WDT

2:独立看门狗 (IWDG)

A:IWDG框图

B:IWDG_KR键寄存器

C:IWDG超时时间

D:HAl库的配置

3:窗口看门狗 (WWDG)

A:WWDG框图

B:WWDG工作特性

C:WWDG超时时间

D:HAL库配置

4:独立看门狗和窗口看门狗的区别

5:数据手册

二:案例

A:独立看门狗

B:窗口看门狗


一:看门狗

1:WDT

        WDG(Watchdog)看门狗------本质就是自动复位

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

        看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器--重置不是清零)操作时,看门狗硬件电路就自动产生复位信号

        STM32内置两个看门狗     

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

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

2:独立看门狗 (IWDG)

A:IWDG框图

                                                              结构 

        它的结构和定时器是常相似的 , 只不过是,定时器溢出,产生中断 .  而看门狗定时器溢出,直接产生复位信号(IWDG复位) .  喂狗操作,其实也就是重置这个计数器(12位 递减计数器). 这是一个递减计数器,减到0之后就复位 . 

        程序正常运行时,为了避免复位 ,  就得在这个计数器(12位 递减计数器)减到0之前 , 及时地把计数值加大点-----这个操作,就是喂狗 .   如果你程序卡死了,  没有及时加大这个计数器 ,  那减到0之后,就自动复位了

                                                        独立看门狗运行逻辑

        开始 :  A : 输入时钟,是LSI,内部低速时钟(时钟频率为40KHz)--------------- B: 时钟进入预分频器进行分频(8位) ,所以它最大只能进行256分频 ;  上面这个预分频j寄存器IWDG PR, 可以配置分频系数, 这个PR和定时器的PSC (//预分频器PSC) 是一个意思 -----------------C:时钟动递减计数器 ,  每来一个时钟,自减一个数(12位, max=2^12-1=4095) .  然后,当自减到0之后-------------D: 产生IWDG复位 ; 

        正常运行时,为了避免复位 .  我们可以提前在重装载寄存器写一值,  IWDG_ RLR,和定时器的ARR(自动重装载寄存器ARR 计数目标值)是一样的 .   那当我们预先写好值之后, 在运行过程中我们在这个键寄存器里,写一个特定数据 .  控制电路,进行喂狗          这时重装值,就会复制到当前的计数器中,  这样计数器就会回到重装值,重新自减运行了

        状态奇存器IWDG_SR : 标志电路运行的状态

B:IWDG_KR键寄存器

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

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

上面说的喂狗操作 : 实际就是在键寄存器里面写入 0xAAAA

C:IWDG超时时间

超时时间(溢出时间) :如果超超过了自己设置的时间,没有喂狗系统就会自动复位   

复位条件:   计数器的值数到零时,就会复位

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

        其中:TLSI = 1 / FLSI

RL重装值-----重装载寄存器IWDG_RLR写入的值

PR预分频系数------相当于定时器的PSC (//预分频器PSC)

RL------相当于定时器的ARR(自动重装载寄存器ARR 计数目标值)是一样的

FLSI----是LSI内部低速时钟   40KHz=40 000HZ

TLSI= 1/40 000=0.000 025s = 0.025ms

                         

                                                时间的计算

以第一组为例

D:HAl库的配置

都在响应的iwdg文件里面(HAl库函数)

3:窗口看门狗 (WWDG)

A:WWDG框图

 

         T[6:0]和w[6:0]的数字是我们自己可以设置的, 下面的0x40(64)和0x3F(63)已经固定好了。

        T[6:0]: 递减计数器(第6位做位标志位) 11 1111= 127=0x7F(最大填写的数),又因为窗口下限值为63(0x3F),所以实际可设置的范围为6到127

        W[6:0]:窗口值(看门狗配置寄存器,窗口上限值)1111 1111=225=0xff       注意窗口的值不能比计数器初始值还大

                                                               喂狗

窗口看门狗没有重装寄存器 ,喂狗操作 : 这个,我们直接在CNT写入数据就行了 , 想写多少就写多少

                                                窗口看门狗运行逻辑

        开始 : A :这个时钟源是PCLK1(36MHz)---------B: 先经过一个预分频器进行分频 ,  这个和独立看门狗的预分频器,定时器的预分频器相同---------C: 分频之后的时钟,驱动这个计数器进行计数(6位递减计数器)...........

                                                        6位递减计数器

        从图上看,这里写了T6~T0, 总共是7个位 .  但是下面却写的是6位递减计数器---------因为这个计数器只有T5~T0, 这6位是有效的计数值.  最高位T6,这里用来当作溢出标志位:

        T6位等于1时,表示计数器没溢出

        T6位等于0时,表示计数器溢出

        不过对于硬件电路来说 ,  T6位其实也是计数器的一部分 , 只不过是T6位被单独拎出来 ,  当作标志位了而已.          EG: 当看门狗寄存器把数据从1111 111  减到了1000 000(16进制表示:0X40) .        此时,如果把T6位也当做计数器的一部分, 那计数器的值实际上才减一半. 但是,如果我们把T6位剥离出去,当作溢出标志位,  低6位,当作计数器.  那此时的状态就是,标志位为1,  计数器为00 0000,已经减到0了.   再减一次变为011 1111 ,这时最高位T6,由1变为0---溢出--产生复位信号

        结论:

        T6位看作是计数器的一部分,  那就是整个计数器,值减到0x40(1000 000)之后溢出;

        如果你把T6位当成溢出标志位,低6位,当作计数器, 那就是,低6位的计数值减到0之后溢

                                                                WDGA

        WDGA-------是窗口看门狗的激活位 ;  WDGA写入1,启用窗口看门狗

                                             喂狗最早时间窗口的实现流程
由这部分电路组成

        需要计算一个最早界限的计数值 ,  写入到这里的W6~W0中 .  这些值,写入之后是固定不变的 .      一旦我们执行写入CR操作时(写看门狗控制寄存器) ,这个与门开关打开,  

写入CR,其实就是写入计数器,也就是喂狗.  在喂狗时,比较器开始工作  .  一旦它比较,我们当前的计数器T6:0>窗口值W6:0,   比较结果就=1 .这个1,通过或门,也可以去申请复位-------这就是喂狗最早时间窗口的实现流程

B:WWDG工作特性

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

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

        递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位-----在溢出的前一刻发送, 也叫做死前中断----操作比如保存重要数据、关闭危险设备等等

          过早喂狗不会产生中断,中断是递减计数器等于0X4F的时候才会产生的。所以如果要在系统发生错误的时候做出一些紧急的操作,我们需要避免过早喂狗

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

C:WWDG超时时间

窗口时间(喂狗的最早时间):   

                 TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])

TPCLK1-----1/36000 000

超时时间(计数器减到零的时间):   

                TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)---T[5:0]不包含T6位

其中:

        TPCLK1 = 1 / FPCLK1

FPCLK1---36Mkz  36000 000HZ

TPCLK1-----1/36000 000

s

6位递减计数器(CNT)--------6位的计数器,最大值是2^6-1=63

D:HAL库配置

在WWDG的初始化函数中,初始化函数会自动调用Mspinit回调函数

4:独立看门狗和窗口看门狗的区别

IWDG和WWDG对比

5:数据手册

硬件看门狗:

        如果用户在选择字节中启用了“硬件看门狗”功能,在系统上电复位后,看门狗会自动开始运行;如果在计数器计数结束前,若软件没有向键寄存器写入相应的值,则系统会产生复位。

窗口看门狗:

        启动看门狗------------在系统复位后,看门狗总是处于关闭状态,设置WWDG_CR寄存器的WDGA位能够开启看门狗,随后它不能再被关闭,除非发生复位。

        

        控制递减计数器-----------递减计数器处于自由运行状态,即使看门狗被禁止,递减计数器仍继续递减计数。当看门狗被启用时,TE位必须被设置,以防止立即产生一个复位。-------也就是我们在开启的时候 ,  一定要首次给个重装值,并且T6位给1 .  以防止开的时候,立刻就复位了

二:案例

A:独立看门狗

设置溢出时间为1S, 如果在1S内没有及时喂狗系统就会复位;

#include "stm32f1xx_hal.h"IWDG_HandleTypeDef g_iwdg_handle;/*** @brief  独立看门狗初始化* @param  psc :预分频器值* @param  rlr:重装载值          * @retval 无*/
void Iwdg_Init(uint8_t psc,uint16_t rlr)
{g_iwdg_handle.Instance=IWDG;             /*基地址*/g_iwdg_handle.Init.Prescaler=psc;      /*预分频器值*/g_iwdg_handle.Init.Reload=rlr;				/*重装载值*/HAL_IWDG_Init(&g_iwdg_handle);}	/*** @brief  独立看门狗喂狗操作*/
void feed_dog(void)
{HAL_IWDG_Refresh(&g_iwdg_handle);}#include "stm32f1xx_hal.h"
#include "rcc.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "exit.h"
#include "UART.h"
#include "OLED.h"
#include "iwdg.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72);                     /* 延时初始化 */LED_Init();                        /* LED初始化 */LED_Exit_Init();OLED_Init();Uart_Init(115200);OLED_ShowString(1, 1, "Please feed the");OLED_ShowString(2, 1, "in time!!!!!");Iwdg_Init(IWDG_PRESCALER_16,2500);/*设置溢出时间为为1S,所以分频系数为16,重装载值为2500*/while(1){delay_ms(1050);feed_dog();OLED_ShowString(1, 1, "                 ");OLED_ShowString(2, 1, "                ");OLED_ShowString(1, 1, "Dog fed");}}

重装载值的计算(rlr):

公式在上面写啦.

B:窗口看门狗

#include "stm32f1xx_hal.h"
#include "led.h"
#include "delay.h"/*** @brief  窗口看门狗初始化* @param  psc :预分频器值      * @param  coun:计数器的值    T[6:0]   * @param  window_val:窗口的值    W[6:0]   * @retval 无*/
void wwdg_feed_dog(void);
WWDG_HandleTypeDef Wwdg_Init_handle;void wwdg_Init(uint32_t psc,uint8_t coun,uint8_t window_val)
{Wwdg_Init_handle.Instance=WWDG;Wwdg_Init_handle.Init.Counter=coun;         /*计数器的值*/Wwdg_Init_handle.Init.EWIMode=WWDG_EWI_ENABLE;   /*使能中断*/Wwdg_Init_handle.Init.Prescaler=psc;           /*预分频器值*/Wwdg_Init_handle.Init.Window=window_val;HAL_WWDG_Init(&Wwdg_Init_handle);
}	/*回调函数:在初始化函数中都会自调用回调函数*/
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{__HAL_RCC_WWDG_CLK_ENABLE();//HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);HAL_NVIC_SetPriority(WWDG_IRQn,2,0);HAL_NVIC_EnableIRQ(WWDG_IRQn);
}/*中断函数*/
void WWDG_IRQHandler()
{HAL_WWDG_IRQHandler(&Wwdg_Init_handle);
}/*中断处理函数,发送中断时
*HAL_WWDG_IRQHandler函数自动调用这个函数
*
*/
void  HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);	
}/*喂狗*/
void wwdg_feed_dog(void)
{HAL_WWDG_Refresh(&Wwdg_Init_handle);
}#include "stm32f1xx_hal.h"
#include "rcc.h"
#include "led.h"
#include "delay.h"
#include "OLED.h"
#include "wwdg.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72);                     /* 延时初始化 */LED_Init();                        /* LED初始化 */LED_Exit_Init();OLED_Init();wwdg_Init(WWDG_PRESCALER_8,0x7f, 0x5f);if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST)!=RESET)   /*1===>发生窗口看门狗复位*/{OLED_ShowString(1, 1,"Widnow dog Reset");__HAL_RCC_CLEAR_RESET_FLAGS();                 /*清除中断标志位*/}else{OLED_ShowString(1, 1,"Outside dog Re");OLED_ShowString(2, 1,"set!!!!");}OLED_ShowString(3, 1,"Please feed");OLED_ShowString(4, 1,"the dog!!!!");while(1){delay_ms(25);wwdg_feed_dog();OLED_ShowString(3, 1,"               ");OLED_ShowString(4, 1,"feed dog....");HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_6);	}}

关于时间的计算:

窗口时间(喂狗的最早时间):   

                 TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])

TPCLK1-----1/36000 000

        就设置计数器值为7f,窗口寄存器为5f,分频数为8,然后可由前面的公式得到窗口上限时间Twwdg=4096×8×(0x7F-0x5F)/36MHz=29.12ms,

        窗口下限时间Twwdg=4096×8×(0x7F-0x3F)/36MHz=58.25ms,

        即喂狗的窗口区间为29.12~58.25ms。

关于寄存器:

if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST)!=RESET)   /*1===>发生窗口看门狗复位*/{OLED_ShowString(1, 1,"Widnow dog Reset");__HAL_RCC_CLEAR_RESET_FLAGS();                 /*清除中断标志位*/}

在stm32f1xx hal_rcc.h文件里面 

 

代码解释:

HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
__weak void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)
HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)

可以看到他们这些函数的句柄都一样,使用使用一个即可:

WWDG_HandleTypeDef Wwdg_Init_handle;

        我们在主函数中调用WWDG初始化函数(HAL_WWDG_Init)时,初始化函数里面会自动调用回调函数。在递减计数器减到0X4F时候触发中断或者在非窗口期喂狗触发中断,我们写的中断函数中调用中断函数,中断函数里面自动调用回滚函数HAL_WWDG_EarlyWakeupCallback()。

        过早喂狗不会产生中断,中断是递减计数器等于0X4F的时候才会产生的。所以如果要在系统发生错误的时候做出一些紧急的操作,我们需要避免过早喂狗

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

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

相关文章

springboot项目学习-瑞吉外卖(4)

1.任务 这一节主要的任务是解决文件的上传和下载功能 2.文件上传 概念:将本地的图片上传到浏览器上面 点击文件上传,前端就会发送如上的请求,服务端应该根据URL和请求方法来处理请求 CommonController类: RestController Slf4j …

【第二部分--Python之基础】

一、初识 开发语言: 高级语言:Python Java PHP C# Go Ruby C ... > 字节码 低级语言:C 汇编 > 机器码 …

初始Redis关联和非关联

基础篇Redis 3.初始Redis 3.1.2.关联和非关联 传统数据库的表与表之间往往存在关联,例如外键: 而非关系型数据库不存在关联关系,要维护关系要么靠代码中的业务逻辑,要么靠数据之间的耦合: {id: 1,name: "张三…

指针知识大礼包,让你的编程之路更顺畅(一)

1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. const修饰指针 5. 指针运算 6. 野指针 7. assert断⾔ 8. 指针的使⽤和传址调⽤ 正文开始 1. 内存和地址 1.1 内存 在讲内存和地址之前,我们想有个⽣活中的案例: 假设有⼀栋宿舍楼&a…

自锁电路设计

自锁电路设计 Hi,uu们,是不是经常要用到自锁电路,通常不是使用555芯片就是用比较器来做自锁,今天我们来简单看下自锁电路的设计.图1采用了比较器构建了一个自锁电路,采用低电平复位,当需要复位的时候志需要将反向端的二极管拉低一下即可,免去 三极管控制…

springboot 大文件分片上传

springboot 大文件分片上传 constantentityvocontrollerutils大文件分片上传是一种将大文件分割成多个小文件片段,然后分别上传这些小文件片段的方法。这种方法的好处包括: 减少重新上传开销:如果网络传输中断,只需重传未上传的部分,而不是整个文件。 提高灵活性:分片大小…

【Selenium】隐藏元素的定位和操作|隐藏与isDisplay方法

一、selenium 中隐藏元素如何定位? 如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是吧~~~能定位到并不意味着能操作元素(如click,clear,send_keys) 二、隐藏元素 如下图有个输入框…

Alibaba spring cloud Dubbo使用(基于Zookeeper或者基于Nacos+泛化调用完整代码一键启动)

Quick Start Dubbo&#xff01;用更优雅的方式来实现RPC调用吧 - 掘金 dubbozookeeper demo 项目结构&#xff1a; RpcService 仅仅是提供服务的接口&#xff1a; public interface HelloService {String sayHello(String name); }DubboServer pom&#xff1a; <?xm…

EDR下的线程安全

文章目录 前记进程断链回调执行纤程内存属性修改early birdMapping后记reference 前记 触发EDR远程线程扫描关键api&#xff1a;createprocess、createremotethread、void&#xff08;指针&#xff09;、createthread 为了更加的opsec&#xff0c;尽量采取别的方式执行恶意代…

【Flutter学习笔记】10.3 组合实例:TurnBox

参考资料&#xff1a;《Flutter实战第二版》 10.3 组合实例&#xff1a;TurnBox 这里尝试实现一个更为复杂的例子&#xff0c;其能够旋转子组件。Flutter中的RotatedBox可以旋转子组件&#xff0c;但是它有两个缺点&#xff1a; 一是只能将其子节点以90度的倍数旋转二是当旋转…

2002-2023年各地级市环境规制强度数据(环保词频统计)

2002-2023年各地级市环境规制强度数据&#xff08;环保词频统计&#xff09; 1、时间&#xff1a;2002-2023年 2、来源&#xff1a;政府工作报告 3、指标&#xff1a; 行政区划代码、年份、城市、所属省份、文本总长度、仅中英文-文本总长度、文本总词频-全模式、文本总词频…

瑞_23种设计模式_职责链模式

文章目录 1 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;★★★1.1 介绍1.2 概述1.3 职责链模式的结构1.4 职责链模式的优缺点1.5 职责链模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析&#xff08;FilterCh…

软件测试 - postman高级使用

断言 概念&#xff1a;让程序代替人判断测试用例执行的结果是否符合预期的一个过程 特点&#xff1a; postman断言使用js编写&#xff0c;断言写在postman的tests中 tests脚本在发送请求之后执行&#xff0c;会把断言的结果最终在testresult中进行展示 常用的postman提供的…

C++剑指offer与高频面试题源码解答与分析

这是博主在当初秋招刷题时候记录的剑指offer第二版以及一些高频题的C源码和解法分析&#xff0c;可以说把这上面的题练好了面试不虚&#xff0c;最后也顺利帮助我拿下baidu ali meituan等多家大厂offer。整篇文章写了大概5W个字&#xff0c;也是积累了很长一段时间的作品&#…

SpringMVC | Spring MVC中的“拦截器”

目录: 一、拦截器 &#xff1a;1. 拦截器的 “概述”2. 拦截器的 “定义” (创建“拦截器”对象)3. 拦截器的 “配置” (让“拦截器”对象生效)4. 拦截器的 “执行流程”“单个拦截器”的执行流程“多个拦截器”的执行流程 二、应用案例一实现用户登录权限验证 作者简介 &#…

ssm006基于java的少儿编程网上报名系统+vue

少儿编程网上报名系统 摘 要 在国家重视教育影响下&#xff0c;教育部门的密确配合下&#xff0c;对教育进行改革、多样性、质量等等的要求&#xff0c;使教育系统的管理和运营比过去十年前更加理性化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上少儿编程网上…

利用PSR,三步实现业务快速加载

01 什么是PSR PSR是通信业界在BSS/OSS域面向产品设计和业务开通过程中提出的一个标准化信息分层解耦和映射的框架&#xff0c;按照国际电信论坛TMF推荐的SID信息框架的标准&#xff0c;主要分为产品域、服务域和资源域等三层&#xff0c;支撑通信业务的快速加载和敏捷开通。 TM…

vscode下c++的boost库安装

Boost Downloadshttps://www.boost.org/users/download/下载最新的库文件。在shell中&#xff0c;使用命令bootstrap.bat gcc生成b2.exe文件。然后是.\b2.exe toolsetgcc生成库文件&#xff0c;在stage\lib文件夹下把stage\lib文件夹中的库文件拷贝到mingw64\x86_64-w64-mingw3…

Spring Boot + MyBatis

一、配置依赖 <!-- MyBatis --> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.5.3</version> </dependency> <!-- junit测试依赖 --&g…

【C语言】【Leetcode】88. 合并两个有序数组

文章目录 一、题目二、思路再思考 一、题目 链接: link 二、思路 这题属于简单题&#xff0c;比较粗暴的做法就是直接比较两个数组&#xff0c;先把第二个数组加到第一个的后面&#xff0c;如何冒泡排序&#xff0c;这种方法简单粗暴但有效&#xff0c;可是不适用于这题&…