STM32使用WWDG窗口看门狗

news2025/1/12 13:40:31

1 WWDG 介绍

1.1 WWDG 简介

窗口看门狗 WWDG 其实和独立看门狗类似,它是一个 7 位递减计数器不断的往下递减计数,

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

这个和独立看门狗是类似的,不同的是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以刷新(喂狗),这也是窗口看门狗中“窗口”两个字的含义。

窗口看门狗时序图如下图所示:

从图中可以看到,T[6:0]是窗口控制寄存器(WWDG_CR)的低 7 位,W[6:0]

是窗口配置寄存器(WWDG_CFR)低 7 位。T[6:0]就是窗口看门狗的计数器值,而

W[6:0]是窗口看门狗的上窗口,下窗口是固定值 0X40。当窗口看门狗的计数器

在上窗口值之外或者低于下窗口值被刷新都会产生复位。

上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但

是一定要确保窗口值大于 0X40,否则窗口就不存在了。

窗口看门狗 WWDG 通常被用来监测,由外部干扰或不可预见的逻辑条件造成

的应用程序背离正常的运行序列而产生的软件故障。

1.2 WWDG 结构框图

(1)标号 1:WWDG 时钟

窗口看门狗(WWDG)的时钟来自 PCLK1,即挂接在 APB1 总线上,由 RCC 时钟控制器开启。

APB1 时钟最大为 36M。

(2)标号 2:WDG 预分频器器

PCLK1 时钟并不是直接提供给窗口看门狗计数器时钟,而是通过一个 WDG 预分频器分频后输入给计数器时钟。

我们可以操作配置寄存器 WWDG_CFR 的位 8:7WDGTB[1:0]来设置分频因子,分频因子可以为 0、1、2、3。

分频后的计数器时钟为:CK_CNT= PCLK1/4096/(2^WDGTB),除以 4096 是中文参考手册内公式规定,没有为什么。PCLK1 等于 APB1 时钟,WDGTB 为分频因子(0-3),2^WDGTB 大小就是 1、2、4、8,与库函数中的分频参数对应。

每经过一个计数器时钟,计数器就减 1。

(3)标号 3:计数器

窗口看门狗的计数器是一个 7 位的递减计数器,计数最大值为 0X7F,其值存放在控制寄存器 WWDG_CR 中的 6:0 位,即 T[6:0]。

当递减到 T6 位变成 0 时,即从 0X40 变为 0X3F 时候,会产生看门狗复位。

这个值 0X40 是窗口看门狗能够递减到的最小值,所以计数器的值只能在 0X40~0X7F 之间,实际上用来计数的是 T[5:0]。

当递减计数器递减到 0X40 的时候,还不会马上产生复位,如果使能了提前唤醒中断,窗口配置寄存器(WWDG_CFR)位 9 EWI 置 1,则产生提前唤醒中断,也就是在快产生复位的前一段时间提醒我们,需要进行喂狗了,否则将复位。

我们通常都是在提前唤醒中断内向 WWDG_CR 重新写入计数器的值, 来达到喂狗的目的。需要注意的是:在进入中断后,必须在不大于 1 个窗口看 门狗计数周期的时间(在 PCLK1 频率为 36M WDGTB 为 0 的条件下,该时间 为 113us)内重新写 WWDG_CR,否则,看门狗将产生复位!

如果不使用提前唤醒中断来喂狗,我们要会计算窗口看门狗的超时时间,

计 算公式如下: Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /PCLK1;

其中: Twwdg 为窗口看门狗的超时时间,单位为 ms。 PCLK1 为 APB1 的时钟频率,最大 36MHz。 WDGTB 为窗口看门狗的预分频系数。 T[5:0]为窗口看门狗的计数器低 6 位。

根据上面的公式,假设 PCLK1=54Mhz,

那么可以得到最小-最大超时时间表, 如下

(4)标号 4:看门狗配置寄存器

我们知道窗口看门狗必须在窗口范围内进行喂狗才不会产生复位,窗口中的下窗口是一个固定值 0X40,上窗口值可以改变,具体的由配置寄存器 WWDG_CFR的位 W[6:0]设置。

其值必须大于 0X40,如果小于或者等于 0X40 就是失去了窗口的意义,而且也不能大于计数器的最大值 0X7F。

窗口值具体要设置成多大,这个得根据我们需要监控的程序的运行时间来决定。

假如我们要监控的程序段 A运行的时间为 Ta,当执行完这段程序之后就要进行喂狗,如果在窗口时间内没有喂狗的话,那程序就肯定是出问题了。

一般计数器的值 TR 设置成最大 0X7F,窗口值为 WW,计数器减一个数的时间为 T,那么时间:(TR-WW)*T 应该稍微大于 Ta 即可,这样就能做到刚执行完程序段 A 之后喂狗,起到监控的作用,这样也就可以算出 WW 的值是多少。

(5)标号 5:系统复位信号

当计数器值超过配置寄存器内的上窗口设置值或者低于下窗口值,并且WDGA 位置 1,即开启窗口看门狗,将产生一个系统复位信号,促使系统复位。

《STM32F10x 中文参考手册》-18 窗口看门狗(WWDG)章节,里面有详细的讲解。

如果看不懂的可以暂时放下,因为我们使用的是库函数开发。

2 WWDG 配置步骤

具体步骤如下:(WWDG 相关库函数在 stm32f10x_wwdg.c 和 stm32f10x_wwdg.h 文件中)

(1)使能 WWDG 时钟

WWDG 不同于 IWDG,IWDG 有自己独立的 LSI 时钟,所以不存在使能问题,而

WWDG 使用的是 APB1 时钟,需要先使能时钟。

在库函数中实现函数如下:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);

(2)设置 WWDG 窗口值、分频数

设置 WWDG 窗口值函数为:

 

void WWDG_SetWindowValue(uint8_t WindowValue);

窗口值最大值为 0X7F,最小不能低于 0X40,否则就失去了窗口的意义。

设置 WWDG 分频数函数为:

 

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

分频系数可以为

WWDG_Prescaler_1、WWDG_Prescaler_2、WWDG_Prescaler_4、WWDG_Prescaler_8。

(3)开启 WWDG 中断并分组

通常对窗口看门狗进行喂狗是在提前唤醒中断内操作,所以需要打开 WWDG

的中断功能,并且配置对应的中断通道及分组。

中断分组及通道选择是在 NVIC_Init 初始化内完成,这个在前面章节中都介

绍过,这里我们看下使能 WWDG 中断,库函数如下:

 

WWDG_EnableIT();

(4)设置计数器初始值并使能 WWDG

库函数中提供了一个同时设置计数器初始值和使能 WWDG 的函数,

如下:

void WWDG_Enable(uint8_t Counter);

注意计数器最大值不能大于 OX7F。

库函数还提供了一个独立设置计数器值的函数,如下:

void WWDG_SetCounter(uint8_t Counter);

(5)编写 WWDG 中断服务函数

最后我们还需要编写一个 WWDG 中断服务函数,通过中断函数进行喂狗。

WWDG中断服务函数名在 STM32F1 启动文件内就有,WWDG 中断函数名如下:

WWDG_IRQHandler

在中断内要进行喂狗,可以直接调用 WWDG_SetCounter()函数,给它传递一

个窗口值即可,特别注意,在中断内喂狗一定要快,否则当看门狗计数器值减到

0X3F 时将产生复位。然后清除 WWDG 中断状态标志位 EWIF,

函数如下:

WWDG_ClearFlag(); //清除窗口看门狗状态标志

通过以上几步配置后,我们就可以正常使用窗口看门狗了,我们需要在中断

内快速喂狗,否则系统即会重新启动。

3 硬件设计

本章要实现的功能是:

使用窗口看门狗的中断来喂狗,通过 D1、D2 指示灯提示程序运行状态。

由于 WWDG 是 STM32F1 内部资源,因此本硬件电路非常简单,只有 D1、D2 指

示灯连接,这里就不多说。

D2 指示灯用来提示系统工作状态,D1 指示灯用来作为喂狗提示,每进入中断喂狗 D1 指示灯状态翻转一次。

4 软件设计

系统开启时 D1 指示灯点亮 500ms 时间,然后熄灭。

D1 指示灯不断闪烁表示正在喂狗。

如果喂狗超时将重启系统,D1 指示灯点亮

500ms,然后熄灭,继续喂狗。

程序框架如下:

(1)初始化 WWDG(使能 WWDG 时钟,设置窗口及分频值,使能中断等)

void WWDG_Init(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        // 第1步:使能
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);        

        // 第2步:设置 WWDG 窗口值、分频数
        WWDG_SetWindowValue(0x5f);         //WWDG 窗口值
        WWDG_SetPrescaler(WWDG_Prescaler_8);        //分频数
        
        // 第3步:开启 WWDG 中断并分组
        // 3-1设置中断优先级,使能定时器中断通道
        NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; // 外设中断向量表 名
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        
        NVIC_Init(&NVIC_InitStructure); 
        
        // 3-2开启 WWDG 使能
        WWDG_Enable(0x7f); //使能 完毕 进入中断使能
        
        
        // 第4步:设置计数器初始值并使能 WWDG
        WWDG_ClearFlag(); // 清楚状态标记
        WWDG_EnableIT();
        
}

(2)编写窗口看门狗中断函数

// 第5步:编写 WWDG 中断服务函数
void WWDG_IRQHandler(void)
{
        
        WWDG_SetCounter(0x7f); // 重新写入初值 喂狗
        WWDG_ClearFlag(); //清除窗口看门狗状态标志
        LED1=!LED1;

}

(3)编写主函数

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "key.h"
#include "wwdg.h"


int main()
{
        u8 i=0;

        
        SysTick_Init(72);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组分2组
        LED_Init();
        USART1_Init(115200);
        LED1 =0;
        delay_ms(500);
        WWDG_Init();
        
        
        while(1)
        {        
        
                i++;
                if(i%10==0)
                        LED0=!LED0; // D0 核心板上的灯
                delay_ms(10);
        }
}

5 实验现象

窗口库函数介绍

void WWDG_DeInit(void);复位

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);//WWDG 窗口值

void WWDG_SetWindowValue(uint8_t WindowValue);//分频数

void WWDG_EnableIT(void); 使能中断

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

void WWDG_Enable(uint8_t Counter); 使能串口看门狗,并设置初始值

FlagStatus WWDG_GetFlagStatus(void);获取状态标记

void WWDG_ClearFlag(void); 清楚状态标记

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

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

相关文章

Android 开发技巧:音乐播放器的后台处理【Service、Handler、MediaPlayer】

给定部分完成的MusicPlayer项目,实现其中未完成的service部分: 1、创建MusicService类,通过service组件实现后台播放音乐的功能; 2、在MainActivity中通过ServiceConnection连接MusicService,实现对音乐播放的控制&…

Android端自定义铃声

随着移动应用竞争进入红海时代,如何在APP推送中别出心裁显得尤为重要。例如对自己的APP推送赋予独特的推送铃声,能够给用户更加理想的使用体验。 1、个性化提醒铃声有助于当收到特定类型的消息时,用户能够立刻识别出来。 2、不同的推送铃声…

xxl-job任务调度2.0.2升级到2.3.0版本,执行器改造过程中经验总结

xxl-job任务调度2.0.2升级到2.3.0版本 一、背景二、开始改造1、修改pom.xml2、修改Handler3、启动服务并验证4、解决异常5、再次启动服务并验证 一、背景 现在要对一批老项目中的执行器进行升级,原来老项目中的执行器,依赖的任务调度中心xxl-job版本是2…

金和OA SQL注入漏洞

一、漏洞描述 金和OA协同办公管理系统C6软件,为北京金和网络股份有限公司 开发系统,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效率的核心思想,为…

Go包介绍与初始化:搞清Go程序的执行次序

Go包介绍与初始化:搞清Go程序的执行次序 文章目录 Go包介绍与初始化:搞清Go程序的执行次序一、main.main 函数:Go 应用的入口函数1.1 main.main 函数1.2 main.main 函数特点 二、包介绍2.1 包介绍与声明2.2 非 main包的 main 函数2.3 包的命名…

剑指Offer || 050.路径总和|||

题目 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节…

DETR原理与代码超详细解读

文章目录 前言一、DETR论文原理1、DETR整体介绍2、DETR论文贡献3、DETR模型框架4、DETR基于二分图匹配的LOSS 二、DETR环境安装1、安装基础环境2、pycocotools安装3、其它环境安装4、环境验证5、训练与推理效果显示 三、数据准备1、coco 数据格式2、修改数据 四、DETR加载数据代…

Git的安装

前置 知道自己电脑上跑的是什么系统 查看电脑位数 省事的一种办法 Windows 在cmd中输入如下命令 wmic os get osarchitecture看命令结果即可 省事的一种办法 Linux 直接在终端中输入如下命令 uname -m若结果是x86_64就是64位的,反之32位 图形化的办法 Wind…

Peter算法小课堂—正整数拆分

大家可能会想:正整数拆分谁不会啊,2年级就会了,为啥要学啊 例题 正整数拆分有好几种,这里我们列举两种讲。 关系 我们看着第一幅图,头向左转90,记住你看到的图,再来看第二幅图,你…

lnmp架构部署Discuz论坛并配置重定向转发

lnmp架构部署Discuz论坛并配置重定向转发 文章目录 lnmp架构部署Discuz论坛并配置重定向转发环境说明部署Discuz论坛系统下载Discuz论坛系统代码包,官网地址如下:部署Discuz论坛系统步骤:解压安装Discuz源码包配置虚拟主机进入Discuz安装界面…

pytest利用request fixture实现个性化测试需求详解

这篇文章主要为大家详细介绍了pytest如何利用request fixture实现个性化测试需求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下− 前言 在深入理解 pytest-repeat 插件的工作原理这篇文章中,我们看到pytest_repeat源码中有这样一段 import pyt…

YOLOv5算法改进(14)— 如何去更换主干网络(3)(包括代码+添加步骤+网络结构图)

前言:Hello大家好,我是小哥谈。为了给后面YOLOv5算法的进阶改进奠定基础,本篇文章就继续通过案例的方式给大家讲解如何在YOLOv5算法中更换主干网络,本篇文章的特色就是比较浅显易懂,附加了很多的网络结构图,通过结构图的形式向大家娓娓道来,希望大家学习之后能够有所收获…

msvcr120.dll缺失怎么修复,快速修复msvcr120.dll丢失的三个有效方法

随着计算机技术的不断发展,我们在使用软件或游戏时经常会遇到各种错误提示,其中找不到msvcr120.dll就是一种常见的错误。那么,msvcr120.dll是什么?它的作用是什么?如何修复这一错误呢?本文将为您详细介绍几…

Python学习基础笔记七十九——Socket编程2

应用消息格式: 为什么要定义消息格式? 我们发送的消息就是要传递的内容,比如字符串。 我们在企业中开发的程序通讯,消息往往是有格式定义的。消息格式的定义可以归入OSI网络模型的表示层。 比如:定义的消息包括消息…

电子技术基础(三)__第7章 时序逻辑电路_第7篇之解题方法与步骤

我们必须牢记这样一句: 先列出输入逻辑式,即驱动方程, 然后将驱动方程代入触发器的特征方程, 得到状态方程(也称 次态方程), 最后写出输出方程。 二 看例题 2022.4 真题 第38题 分析: 此题乍一看,可能有点…

jvm 各个版本支持的参数 容器化部署

知道一些 jvm 调优参数,但是没有找到官网对应的文档,在网上的一些文章偶然发现,记录一下。 https://docs.oracle.com/en/java/javase/ 包含各个版本 jdk 8 分为 windows 和 unix 系统 https://docs.oracle.com/javase/8/docs/technotes/too…

Volatile 可以保证什么特性?有什么作用?

Volatile 可以保证什么特性?有什么作用? 可以保证可见性,有序性,禁止指令重排序。但是不能保证原子性。线程上下文切换的时候,还是有可能出现线程安全问题。 cpu 都是把数据从内存拉取到自己的缓存中进行运算&#xff…

在Espressif-IDE中使用Wokwi仿真ESP32

陈拓 2023/10/17-2023/10/19 1. 概述 在Espressif-IDE v2.9.0版本之后可直接在IDE中使用Wokwi模拟器。 1.1 什么是 Wokwi 模拟器? Wokwi 是一款在线电子模拟器,支持模拟各种开发板、元器件和传感器,例如乐鑫产品 ESP32。 Wokwi 提供基于浏…

Vue3.0的设计目标是什么?做了哪些优化

一、设计目标 不以解决实际业务痛点的更新都是耍流氓,下面我们来列举一下Vue3之前我们或许会面临的问题 随着功能的增长,复杂组件的代码变得越来越难以维护缺少一种比较「干净」的在多个组件之间提取和复用逻辑的机制类型推断不够友好bundle的时间太久…

游戏行业多元化发展,手游品牌强势出圈的秘诀是什么?

消费观念的转变和社会风气的逐渐开放使手游市场日趋成熟,如今的手游市场面临不少机遇与挑战,游戏行业的多元化发展使玩家们对手游的质量要求更进一步,那么在竞争激烈的手游市场中,手游品牌如何在拥挤的市场中获取更多曝光机会呢&a…