14:STM32-----看门狗

目录

一:看门狗

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.xdnf.cn/news/146361.html

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

相关文章

Python脚本实现xss攻击

实验环境:zd靶场、vscode 知识点 requests.session() 首先我们需要先利用python requests模块进行登录,然后利用开启session记录,保持之后的操作处于同一会话当中 requests.session()用于创建一个会话(session)的实例对象。使用requests库…

Unity 鼠标悬浮时文本滚动(Text Mesh Pro)

效果 直接将脚本挂载在Text Mesh Pro上,但是需要滚动的文本必须在Scroll View中,否侧会定位错误,还需要给Scroll View中看需求添加垂直或者水平布局的组件 代码 using System.Collections; using System.Collections.Generic; using UnityE…

1.物联网射频识别,RFID概念、组成、中间件、标准,全球物品编码——EPC码

1.RFID概念 RFID是Radio Frequency Identification的缩写,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需与被识别物体建立机械或光学接触。 RFID(Radio Frequency Identificati…

linux 清除卸载jenkins

1、停服务进程 查看jenkins服务是否在运行,如果在运行,停掉 查看服务 ps -ef|grep jenkins 停掉进程 kill -9 XXX2、查找安装目录 find / -name "jenkins*"3、删掉相关目录 删掉相关安装目录 rm -rf /root/.jenkins/# 删掉war包 rm -rf /…

GD32F10X ----RTC

1. RTC的简介 STM32 的实时时钟(RTC)是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置…

详解Avast Driver Updater:电脑驱动更新工具的利器还是多余的软件?

亲爱的读者朋友们,你是不是经常为电脑的驱动问题而烦恼?如果是的话,你可能会对这款软件——Avast Driver Updater 电脑驱动更新工具感兴趣。但在你决定尝试之前,不妨先和我一起深入探讨一下它的优点、缺点以及它适用的使用场景。 …

【夏虫语冰】测试服务器端口是否打开(命令行、Python)

文章目录 1、简介2、命令行2.1 telnet2.1.1 工具简介2.1.2 工具配置2.1.3 工具使用 2.2 curl2.2.1 工具简介2.2.1 工具下载2.2.1 工具使用 2.3 wget2.3.1 工具简介2.3.2 工具下载2.3.2 工具使用 2.4 nc2.4.1 工具简介2.4.2 工具安装2.4.3 工具使用 2.5 ssh2.5.1 工具简介2.5.2 …

动态规划算法(1)--矩阵连乘和凸多边形剖分

目录 一、动态数组 1、创建动态数组 2、添加元素 3、删除修改元素 4、访问元素 5、返回数组长度 6、for each遍历数组 二、输入多个数字 1、正则表达式 2、has.next()方法 三、矩阵连乘 1、什么是矩阵连乘? 2、动态规划思路 3、手推m和s矩阵 4、完…

番外4:VMware安装

step4: 安装过程中,有些选项不需要点(安装地址建议选C盘或默认,装载在其他盘后续会报错),如: may error(本人猜测安装虚拟机完整版需要C盘的一些桥插件支持): step5: 安装虚拟机成功…

给奶牛做直播之三

​一、前言 上一篇给牛奶做直播之二 主要讲用RTMP搭建点播服务器,整了半天直播还没上场,今天不讲太多理论的玩意,奶牛今天放假了也不出场,就由本人亲自上场来个直播首秀,见下图,如果有兴趣的话&#xff0…

Android修行手册 - Activity 在 Java 和 Kotlin 中怎么写构造参数

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

大喜国庆,聊聊我正式进入职场的这三个月...

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

实现三栏布局的十种方式

本文节选自我的博客:实现三栏布局的十种方式 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。📝 CSDN主页:爱吃糖的猫🔥📣 我的博客:爱吃糖的猫&…

02-Zookeeper实战

上一篇:01-Zookeeper特性与节点数据类型详解 1. zookeeper安装 Step1: 配置JAVA环境,检验环境: java -versionStep2: 下载解压 zookeeper wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeepe…

番外5:下载+安装+配置Linux

任务前期工作: 01. 电脑已安装好VMware Workstation软件; 02.提前下载好Rhel-8.iso映像文件(文件较大一般在9.4GB,建议采用迅雷下载),本人使用的以下版本(地址ed2k://|file|rhel-8.4-x86_64-dvd…

C++-哈希Hash

本期我们来学习哈希 目录 unordered系列关联式容器 unordered_map unordered_set 性能比较 哈希概念 哈希冲突 哈希函数 哈希冲突解决 闭散列 模拟实现 开散列 模拟实现 全部代码 unordered系列关联式容器 在 C98 中, STL 提供了底层为红黑树结构的一…

【算法基础】一文掌握十大排序算法,冒泡排序、插入排序、选择排序、归并排序、计数排序、基数排序、希尔排序和堆排序

目录 1 冒泡排序(Bubble Sort) 2 插入排序(Insertion Sort) 3 选择排序(Selection Sort) 4. 快速排序(Quick Sort) 5. 归并排序(Merge Sort) 6 堆排序 …

【day10.01】使用select实现服务器并发

用select实现服务器并发&#xff1a; linuxlinux:~/study/1001$ cat server.c #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8880#define IP "192.168.31.38"int main(int argc, c…

11链表-迭代与递归

目录 LeetCode之路——206. 反转链表 分析&#xff1a; 解法一&#xff1a;迭代 解法二&#xff1a;递归 LeetCode之路——206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head […

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

前言 最近看论文遇到了基于反Park变换的锁相环&#xff0c;用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息&#xff0c;实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…