14:STM32-----看门狗

news2024/11/30 4:19:31

目录

一:看门狗

1:WDG

2:独立看门狗 (IWDG)

A:IWDG框图

B:IWDG_KR键寄存器

C:IWDG超时时间

3:窗口看门狗 (WWDG)

A:WWDG框图

B:WWDG工作特性

C:WWDG超时时间

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

5:数据手册

二:案例

A:独立看门狗

1:连接图

2:步骤

3:函数介绍

3:代码

B:窗口看门狗

1:连接图

2: 步骤

3:代码


一:看门狗

1:WDG

        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

                                                时间的计算

以第一组为例

3:窗口看门狗 (WWDG)

A:WWDG框图

                                                               喂狗

窗口看门狗没有重装寄存器 ,喂狗操作 : 这个,我们直接在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复位-----在溢出的前一刻发送, 也叫做死前中断----操作比如保存重要数据、关闭危险设备等等

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

C:WWDG超时时间

超时时间(喂狗的最晚时间):     

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

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

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

其中:

        TPCLK1 = 1 / FPCLK1

FPCLK1---36Mkz  36000 000HZ

TPCLK1-----1/36000 000

s

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

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

IWDG和WWDG对比

5:数据手册

硬件看门狗:

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

窗口看门狗:

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

        

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

二:案例

A:独立看门狗

1:连接图

2:步骤

1:开启时钟LSI,内部低速时钟(时钟频率为40KHz)------(如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG。)---所以开启时钟的代码不需要我们书写

2: 解除写保护-----IWDG_KR键寄存器

3 : 写入预分频和重装值

4 : 启动独立看门狗----IWDG_KR键寄存器

3:函数介绍

在stm32f10x_iwdg.h文件里面的独立看门狗函数

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
void IWDG_SetReload(uint16_t Reload);
void IWDG_ReloadCounter(void);
void IWDG_Enable(void);
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);

IWDG_WriteAccessCmd : 写使能保护

/**
  * @brief  Enables or disables write access to IWDG_PR and IWDG_RLR registers.
  * @param  IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers.
  *   This parameter can be one of the following values:
  *     @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers
  *     @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers
  * @retval None
  */
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)
{
  /* Check the parameters */
  assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess));
  IWDG->KR = IWDG_WriteAccess;
}

在IWDG_KR键寄存器里面写入   使能还是不使能

#define IWDG_WriteAccess_Enable     ((uint16_t)0x5555)
#define IWDG_WriteAccess_Disable    ((uint16_t)0x0000)

IWDG_SetPrescaler : 设置预分频系数----在预分频寄存器IWDG_PR里面写入

IWDG_SetReload : 设置重装值----在重装载寄存器IWDG_RLR里面写入

IWDG_ReloadCounter : 喂狗

/**
  * @brief  Reloads IWDG counter with value defined in the reload register
  *   (write access to IWDG_PR and IWDG_RLR registers disabled).
  * @param  None
  * @retval None
  */
void IWDG_ReloadCounter(void)
{
  IWDG->KR = KR_KEY_Reload;
}

在IWDG_KR键寄存器写入

#define KR_KEY_Reload    ((uint16_t)0xAAAA)
#define KR_KEY_Enable    ((uint16_t)0xCCCC)

IWDG_Enable : 启动独立看

/**
  * @brief  Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled).
  * @param  None
  * @retval None
  */
void IWDG_Enable(void)
{
  IWDG->KR = KR_KEY_Enable;
}
/* KR register bit mask */
#define KR_KEY_Reload    ((uint16_t)0xAAAA)
#define KR_KEY_Enable    ((uint16_t)0xCCCC)

IWDG_GetFlagStatus : 查看中断标志位

3:代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
int main(void)
{
	OLED_Init();
	Key_Init();
	
	OLED_ShowString(1, 1, "IWDG TEST:");
	if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET)
	{
		/*独立看门狗复位现象
		RCC_FLAG_IWDGRST---看门狗复位标志位
		*/
		
		OLED_ShowString(2, 1, "IWDG TEST:");
		Delay_ms(500);
		OLED_ShowString(2, 1, "           ");
		Delay_ms(100);
		RCC_ClearFlag();
	}
	else
	{
		/*32自带的复位按键现象*/
		
		OLED_ShowString(4, 1, "RTC:");
		Delay_ms(500);
		OLED_ShowString(4, 1, "           ");
		Delay_ms(100);
	}
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//解除写保护
	IWDG_SetPrescaler(IWDG_Prescaler_16);  //写入预分频器的值
	IWDG_SetReload(2499);//1000=0.025*16*(重装载寄存器+1)最长喂狗时间
	IWDG_ReloadCounter();//喂狗
	IWDG_Enable();//启动看门狗就是在键寄存器里面写入0XCCCC 
	//也就是0X5555之外的值,也就是开启写保护 , 所以我们不写写开启写保护了;
	while (1)
	{		
			Key_GetNum();
			IWDG_ReloadCounter();//喂狗
			Delay_ms(800);
	}
}

B:窗口看门狗

1:连接图

2: 步骤

1 : 开启窗口看门狗时钟---PCLK1(36MHz)

2: 配置寄存器--比如,预分频,和窗口值

3: 写入控制奇存器CR

3:代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
int main(void)
{
	OLED_Init();
	Key_Init();
	
	OLED_ShowString(1, 1, "WWDG TEST:");
	if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST)==SET)
	{
		/*独立看门狗复位现象
		RCC_FLAG_WWDGRST---窗口门狗复位标志位
		*/
		
		OLED_ShowString(2, 1, "WWDG TEST:");
		Delay_ms(500);
		OLED_ShowString(2, 1, "           ");
		Delay_ms(100);
		RCC_ClearFlag();
	}
	else
	{
		/*32自带的复位按键现象*/
		
		OLED_ShowString(4, 1, "RTC:");
		Delay_ms(500);
		OLED_ShowString(4, 1, "           ");
		Delay_ms(100);
	}
	//1: 开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
	//2: 配置寄存器 
	WWDG_SetPrescaler(WWDG_Prescaler_8); //预分频器的值
	//WWDG_SetWindowValue()
	WWDG_Enable(0x40 | 53);//把T6位当作标志位来计算的0x40--T6位置1
	/*
	超时时间(喂狗的最晚时间)
	TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)---T[5:0]不包含T6位
	超时时间50ms=1/36000 KHZ  * 4096 *8 *(T[5:0] + 1)
	*/
	WWDG_SetWindowValue(0x40 | 21);  //30ms
	/*
	窗口时间(喂狗的最早时间): 

	TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])
	30=1/36000KHZ*4096*8*(53-W[5:0])
	
	*/
	while (1)
	{		
			Key_GetNum();
			Delay_ms(38);
			WWDG_SetCounter(0x40 | 53);
		/*
		窗口看门狗没有重装寄存器 ,喂狗操作 
		这个,我们直接在CNT写入数据就行了 想写多少就写多少
		*/
			
	}
}

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

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

相关文章

网络爬虫——urllib(2)

前言🍭 ❤️❤️❤️网络爬虫专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Python网络爬虫_热爱编程的林兮的博客-CSDN博客 前篇讲解了urllib的基本使用、一个类型六个方法与下载相关内容&#xff0…

《深入浅出OCR》第二章:OCR技术发展与分类

✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 👨‍💻面向对象: 本篇前言知识主要介绍深度学习知识,全面总结知知识…

Python3数据科学包系列(一):数据分析实战

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 认识下数据科学中数据处理基础包: (1)NumPy 俗话说: 要学会跑需先…

C++核心编程--多态篇

4.7、多态 4.7.1、多态的基本概念 多态是C面向对象三大特征之一 多态分为两类 静态多态:函数重载和运算符重载属于静态多态,复用函数名动态多态:派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早…

Eclipse 主网即将上线迎空投预期,Zepoch 节点或成受益者?

目前,Zepoch 节点空投页面中,模块化 Layer2 Rollup 项目 Eclipse 出现在其空投列表中。 配合近期 Eclipse 宣布了其将由 SVM 提供支持的 Layer2 主网架构,并将在今年年底上线主网的消息后,不免引发两点猜测:一个是 Ecl…

springcloud:四、nacos介绍+启动+服务分级存储模型/集群+NacosRule负载均衡

nacos介绍 nacos是阿里巴巴提供的SpringCloud的一个组件,算是eureka的替代品。 nacos启动 安装过程这里不再赘述,相关安装或启动的问题可以见我的另一篇博客: http://t.csdn.cn/tcQ76 单价模式启动命令:进入bin目录&#xff0…

某房产网站登录RSA加密分析

文章目录 1. 写在前面2. 抓包分析3. 扣加密代码4. 还原加密 1. 写在前面 今天是国庆节,首先祝福看到这篇文章的每一个人节日快乐!假期会老的这些天一直在忙事情跟日常带娃,抽不出一点时间来写东西。夜深了、娃也睡了。最近湖南开始降温了&…

SimpleCG动画示例--汉诺塔动画演示

前言 SimpleCG的使用方法在前面已经介绍了许多,有兴趣的同学如果有去动手,制作一些简单动画应该没多大问题的。所以这次我们来演示一下简单动画。我们刚学习C语言的递归函数时,有一个经典例子相信很多同学都写过,那就是汉诺塔。那…

【算法优选】双指针专题——壹

文章目录 😎前言🌴[移动零](https://leetcode.cn/problems/move-zeroes/)🚩题⽬描述:🚩算法思路🚩算法流程🚩代码实现 🍀[复写零](https://leetcode.cn/problems/duplicate-zeros/)&…

深入浅出线程池

一、线程 1、什么是线程 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际 运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线 程并行执行不同的任务。 2、如…

2023-10-01 LeetCode每日一题(买卖股票的最佳时机)

2023-10-01每日一题 一、题目编号 121. 买卖股票的最佳时机二、题目链接 点击跳转到题目位置 三、题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一…

Python Appium 安卓自动化测试 基本使用 - Phone Spider

Python Appium 安卓自动化测试 基本使用 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 文章目录 Python Appium 安卓自动化测试 基本使用前言一、环境安装1.1 Python Pip…

【接口技术】输入输出接口习题

1:图1所示电路PC/XT系统板上的接口控制电路的端口地址译码电路。写出8237A,8259A,8253,8255A的端口地址范围 解答: 【G1A非】和【G2B非】为低电平有效,因此A80,A90 74ls138中,是按…

python代码混淆与代码打包

0x00 背景 自己写的项目,又想保护源码,自己做个混淆是最方便的了。 0x01 实践 这里使用开源工具 GitHub - astrand/pyobfuscate: pyobfuscate,虽然git上才500多star,但是很好用。它的使用场景是混淆单个py文件。很多事物有开始就…

六、vpp 流表

草稿!!! vpp node其实就是三个部分 1、plugin init 2、set command 3、function 实现功能,比如这里的流表 这里的function函数有个返回值,根据返回值决定下一个节点走哪里 flowtable_getinfo这里处理函数返回2 &#…

Nodejs沙箱逃逸

一、基本概念 JavaScript和Nodejs之间有什么区别 JavaScript用在浏览器前端,后来将Chrome中的v8引擎单独拿出来为JavaScript单独开发了一个运行环境,因此JavaScript也可以作为一门后端语言,写在后端(服务端)的JavaScr…

什么是博弈论?

什么是博弈?字面描述中,博弈由两个字构成:博 和 弈。博弈是一种双方(多方)的对抗(比赛),对抗总是在一定的规则下进行,参与者必然会考虑应用相应的策略(计谋&a…

防火墙基础之H3C防火墙分支与分支之间双向地址转换

分支与分支之间双向地址转换 原理概述: 防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理​与筛选的软件和硬件​设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资…

leetCode 376.摆动序列 动态规划 + 图解 + 状态转移

376. 摆动序列 - 力扣(LeetCode) 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如…

SpringBoot整合RocketMQ笔记

SpringBoot版本为2.3.12.Release RocketMQ对比kafka 学习链接 https://zhuanlan.zhihu.com/p/335216381 代码实战 https://www.cnblogs.com/RedOrange/p/17401238.html Centos安装rocketmq https://blog.csdn.net/chuige2013/article/details/123783612 RocketMQ详细配置与…