【STM32】WWDG—窗口看门狗

2023-09-18 16:03:22

在一个设定好的区间进行喂狗

与独立看门狗不同的是,独立看门狗只需要在计时到0之前喂狗。而窗口看门狗需要在设定好的区间内进行喂狗,否则进行reset。

下限

递减计数器不断的往下递减计数,当减到一个固定值 0X40时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。

上限

是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。

窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗

功能框图

在这里插入图片描述

时钟源

PCLK1,PCLK1 最大是 36M,由 RCC 时钟控制器开启。
在这里插入图片描述

计数器时钟 PCLK -> CK时钟 -> 计数器时钟

1.计数器时钟由 CK计时器时钟经过预分频器分频得到。
2.CK 计时器时钟=PCLK1/4096,除以 4096是手册规定的,没有为什么。
3.分频系数由配置寄存器 CFR 的位 8:7 WDGTB[1:0]配置,可以是[0,1,2,3]。

所以计数器的时钟 CNT_CK=PCLK1/4096/(2^WDGTB),这就可以算出计数器减一个数的时间 T= 1/CNT_CK = Tpclk1 * 4096 * (2^WDGTB)。

计数器

1.窗口看门狗的计数器是一个递减计数器,共有 7 位,其值存在控制寄存器 CR 的位 6:0,即 T[6:0]。

2.但是由于窗口看门狗需要在窗口内喂狗,所以计数器的值只能是:0X40~0X7F 之间。

3.当递减计数器递减到 0X40的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR位 9 EWI 置1,则产生提前唤醒中断

中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等

窗口值设置和计算看门狗复位时间

详见参考手册

使用

看门狗配置

/* WWDG 配置函数
* tr :递减计时器的值, 取值范围为:0x7f~0x40
* wr :窗口值,取值范围为:0x7f~0x40
* prv:预分频器值,取值可以是
* @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1
* @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2
* @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4
* @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8
*/
 void WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv)
 {
 // 开启 WWDG 时钟
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
 
 // 设置递减计数器的值
 WWDG_SetCounter( tr );
 
 // 设置预分频器的值
 WWDG_SetPrescaler( prv );
 
 // 设置上窗口值
 WWDG_SetWindowValue( wr );
 
 // 设置计数器的值,使能 WWDG
 WWDG_Enable(WWDG_CNT);
 
 // 清除提前唤醒中断标志位
 WWDG_ClearFlag();
 // 配置 WWDG 中断优先级
 WWDG_NVIC_Config();
 // 开 WWDG 中断
 WWDG_EnableIT();
 }

中断NVIC 配置

// WWDG 中断优先级初始化
static void WWDG_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 }

提前唤醒中断复位程序
这个中断函数的名称就是"提前唤醒中断"

// WWDG 中断复服务程序,如果发生了此中断,表示程序已经出现了故障,
// 这是一个死前中断。在此中断服务程序中应该干最重要的事,
// 比如保存重要的数据等,这个时间具体有多长,要
// 由 WDGTB 的值决定:
// WDGTB:0 113us
// WDGTB:1 227us
// WDGTB:2 455us
// WDGTB:3 910us
void WWDG_IRQHandler(void)
 {
 // 清除中断标志位
 WWDG_ClearFlag();
  //真正使用的时候,这里应该是做最重要的事情
 }

喂狗函数

 // 喂狗
 void WWDG_Feed(void)
 {
 // 喂狗,刷新递减计数器的值,设置成最大 WDG_CNT=0X7F
 WWDG_SetCounter( WWDG_CNT );
 }

使用范例

int main(void)
{
uint8_t wwdg_tr, wwdg_wr;
SOFT_Delay(0X00FFFFFF);
  // 初始化 WWDG
  // 窗口值我们在初始化的时候设置成 0X5F,这个值不会改变
 WWDG_Config(0X7F, 0X5F, WWDG_Prescaler_8);
 
 wwdg_wr = WWDG->CFR & 0X7F;
  while (1) {

 //-----------------------------------------------------
 // 这部分应该写需要被 WWDG 监控的程序,这段程序运行的时间
 // 决定了窗口值应该设置成多大。
 //-----------------------------------------------------
 
 // 计时器值,初始化成最大 0X7F,当开启 WWDG 时候,这个值会不断减小
 // 当计数器的值大于窗口值时喂狗的话,会复位,当计数器减少到 0X40
 // 还没有喂狗的话就非常非常危险了,计数器再减一次到了 0X3F 时就复位
 // 所以要当计数器的值在窗口值和 0X40 之间的时候喂狗,其中 0X40 是固定的。
 wwdg_tr = WWDG->CR & 0X7F;
 
 if ( wwdg_tr < wwdg_wr ) {
 // 喂狗,重新设置计数器的值为最大 0X7F
 WWDG_Feed();
 }
 }
 }
更多推荐

SQL-4大板块(存储过程、函数、视图、触发器)

一、存储过程(做复杂运算)1.做复杂运算,是对变量做运算;2.可以对多个表进行update、insert、delete、select、query;3.可以在最终结果返回多个表,但是对对接环境有苛刻要求,比如:VB不支持接收返回多个表4.当一个查询语句无法实现,或者语句查询速度很慢时,想提高效率就会用到存储过程。先把需要

MongoDB——将时间戳转换为日期

在MongoDB中将时间戳转换为日期从timestamp转换为日期取决于我们保存时间戳的类型。它是对象、数字还是字符串类型?我们可以在mongoshell上使用以下命令检查字段的类型。在本教程中,我们将学习如何将时间戳转换为数字、字符串或对象类型的日期。检查字段类型://MongoDB5.0.8>typeofdb.co

滑动时间窗口的思想和实现,环形数组,golang

固定时间窗口在开发限流组件的时候,我们需要统计一个时间区间内的请求数,比如以分钟为单位。所谓固定时间窗口,就是根据时间函数得到当前请求落在哪个分钟之内,我们在统计的时候只关注当前分钟之内的数量,即[0s,60s],因为流量并不是均匀的,所以就会出现,在两个分钟之间超过阈值,1分50秒时来了150个请求,在2分10秒时来

图像语义分割概述

图像语义分割概述一、图像语义分割概念图像语义分割(ImageSemanticSegmentation)是一项计算机视觉任务,其目标是将输入的图像分割成多个区域,并为每个像素分配一个语义类别标签,以表示该像素属于图像中的哪个物体或区域。与其他图像分割任务不同,图像语义分割不仅关注于分割图像,还要理解图像中不同部分的语义含

【C++】面向对象编程示例 ( 案例需求 | Visual Studio 创建类 | 类的声明 | 类的实现 | 类的调用 )

文章目录一、案例需求二、VisualStudio创建类三、类的声明四、类的实现五、类的调用一、案例需求使用C++面向对象,抽象出一个立方体类;立方体有长/宽/高/面积/体积私有成员变量,以及访问这些成员变量的公共成员方法;还提供立方体的对比函数,对比2个立方体对象是否相等;二、VisualStudio创建类在Visua

【C++】类的声明 与 类的实现 分开 ① ( 类的声明 与 类的实现 常用用法 | Visual Studio 2019 中创建类的头文件和源文件 | 确保头文件包含一次 )

文章目录一、类的声明与类的实现分开1、类的声明与类的实现常用用法2、VisualStudio2019中创建类的头文件和源文件3、Student.h类头文件解析4、确保头文件包含一次一、类的声明与类的实现分开1、类的声明与类的实现常用用法在之前的博客中,定义的class类,定义类时同时也完成了实现;但是在C++语言实际开

“源启2.0”:从自上而下的解构,到自下而上的重构

从垂直打穿、到应用重构,中电金信赋能行业数字化转型之路既“向下走”、也“向上看”。“向上”先理解和吃透客户的企业战略,进而自上而下地将企业战略拆解为业务架构,“向下”再将业务架构拆解为应用架构和数据架构,并进一步对齐技术架构。而在此过程中,上至“应用重构”,下至“数字基础设施重构”就都已不是问题。这就是“源启2.0”的

【校招VIP】测试方案分析之压力测试

考点介绍:软件压力测试是校招面试里面经常会碰到的题型。基本思路是在计算机数量较少或系统资源匮乏的条件下运行测试。要求面试者了解压力测试的基本概念,压测的目的,压测的要求以及说出实例。测试方案分析之压力测试-相关题目及解析内容可点击文章末尾链接查看!一、考点试题1.软件质量管理(QM)应有质量保证(QA)和质量控制(QC

以神龙出行小程序为例,说一些网站技术

注册和登录功能:用户注册和登录可以使用手机号验证、第三方登录等方式来实现。这需要与后台服务器进行数据交互,并进行身份验证。数据存储和管理:用户的个人信息和常用地址需要进行存储和管理。这可以通过数据库来实现,如关系型数据库或NoSQL数据库。智能匹配和推荐:搬家、拉货和代驾服务需要智能匹配合适的车型和司机。这可以利用算法

QT 连接SQLServer数据库

1、安装SQLServer数据库后在SQLServer配置管理器中设置后,需要重新启动SQLServer服务2、重点*配置ODBC数据源由于没有配置ODBC,一直无法连接开始——ODBC数据源管理程序(64位)之后选择:使用用户输入登录ID和密码的SQLServer验证连接SQLServer以获得其他配置选项的默认设置

pymysql执行非查询语句会自动提交事务,关闭事务自动提交

一、前置条件在mysql数据库生成数据:CREATEDATABASEmydatabase;CREATETABLECourse(CourseIDINTPRIMARYKEY,CourseNameVARCHAR(100),InstructorVARCHAR(100),CreditsINT,StudentIDINT,FOREI

热文推荐