【STM32】基础知识 第十六课 窗口看门狗 WWDG 深入浅出

【STM32】基础知识 第十六课 窗口看门狗 WWDG 深入浅出

  • 概述
  • 窗口看门狗 (WWDG)
  • WWDG_SR 状态寄存器
  • WWDG 配置与使用
  • 使用 WWDG 进行故障检测
  • 案例

概述

在嵌入式开发中, 可靠性和稳定性是至关重要的. 这就是为什么许多单片机, 比如 STM32, 提供了窗口看门狗 (Window Watchdog, WWDF) 的功能. WWDG 是一种硬件定时器, 其目的在于防止软件错误导致的系统故障. WWDG 是通过监控软件运行的正常新, 并在检测到异常情况时自动重启系统, 从而防止系统长时间处于错误状态. 虽然 STM32 同时提供了独立看门狗 (Independent Watchdog, IWDG) 和 WWDG, 但 WWDG 具有更高精度和更灵活的配置选项, 使其在一些需要精确定时或特殊需求的应用中具有优势.

STM32 窗口看门狗

窗口看门狗 (WWDG)

WWDG 的核心是一个 7 位的定时器 (取值范围 0-127). 用户可以设定一个窗口值和一个计数重载值. 当定时器计数值在重载值到窗口值之间倒数时, 称为窗口期. 窗口期是唯一可以刷新 WWDG 的时机. 也就是说, 只有在 “窗口” 打开期间, 才可以 “喂狗”.

如果在窗口未打开前就重载了 WWDG, 或者在窗口打开后没有及时重载 WWDG, 那么 WWDG 都会产生系统复位.

这样的设计能够使系统检测到两种软件错误:

  • 执行过快: 窗口未打开前就重载了 WWDG
  • 执行过慢: 窗口打开后没有及时重载 WWDG

WWDG_SR 状态寄存器

在 STM32 中, WWDG_SR 是窗口看门狗状态寄存器 (Windows Watchdog Status Register). WWDG_SR 只有一个比特位, 即比特 0 (EWIF), 又称为早早期唤醒中断标志 (Early Wakeup Interrupt Flag). 这个标志位用来表示窗口看门狗定时器已达到了 63 (也就是 127-64), 即将达到重载值. 这个功能可以用来唤醒 CPU, 让它有足够的时间去刷新窗口看门狗, 防止系统复位.

注: 虽热 EWIF 位可以通过软件清零, 但是在窗口看门狗启动后, 这个标志位会自动置位, 所以在大多数情况下, 我们需要手动清零这个标志位.

WWDG 配置与使用

在 STM32 中, 使用 WWDG 首先需要启动 WWDG 时钟, 并设置预分频器和窗口值. 通过访问 WWDG 的控制寄存器 (WWDG_CR) 和配置寄存器 (WWDG_CFR) 来实现.

具体步骤如下:

  1. 启动 WWDG 时钟: 通过访问复位和时钟控制 (RCC) 的 APB1 使能寄存器 (RCC_APB1ENR), 能使 WWDG 时钟
  2. 设置 WWDG 的预分频器和窗口值:通过访问 WWDG 的配置寄存器 (WWFG_CRF), 设置预分频器 (WDGTB) 和窗口值 (W). 同时, 可以使能窗口看门狗早期中断 (EWI)
  3. 设置 WWDG 的计数器重载值: 通过访问 WWDG 的控制寄存器 (WWDG_CR), 设置计数器的重载值, 并使能 WWDG

使用 WWDG 进行故障检测

WWDG 能够检测出软件中心过快和执行过慢两种类型的错误. 当主程序在窗口打开后没有及时重载 WWDG, 说明团建执行过慢, 这两种情况都会引发 WWDG 产生系统复位.

因为在实际应用中, 软件执行的速度往往与任务的完成密切相关. 如果软件执行过快, 可能意味着某些任务被跳过或者未被正确处理. 如果软件执行过慢, 可能意味着系统的性能无法满足需求, 或者某些任务执行时间过长. 通过 WWDG, 我们可以确保软件在预定的时间范围内正确的运行.

案例

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/WDG/wdg.h"


int main(void)
{
    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    delay_init(72);                         /* 延时初始化 */
    usart_init(115200);                     /* 串口初始化为115200 */
    led_init();                             /* 初始化LED */
    LED0(0);                                /* 点亮LED0 红灯 */
    delay_ms(300);                          /* 延时300ms再初始化看门狗,LED0的变化"可见" */
    wwdg_init(0X7F, 0X5F, WWDG_PRESCALER_8);/* 计数器值为7f,窗口寄存器为5f,分频数为8 */

    while (1)
    {
        LED0(1);                            /* 关闭红灯 */
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s部署dashboard

1.查看k8s集群版本 kubectl version 2.在github中查看k8s对应的ui版本 Releases kubernetes/dashboard GitHub 3.下载对应版本的dashboard yaml文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 4.更改yaml文件配置 …

HTB-Agile

HTB-Agile 信息收集80端口漫长的兔子洞之旅 立足www-data -> corumcorum -> edwardsedwards -> root 信息收集 80端口 漫长的兔子洞之旅 我注意到系统为我分配了一个session,是以eyj开头的。 拿去jwt.io看看。 额,可能后面会用先留在这&#…

多线程-程序、进程、线程与并行、并发的概念

多线程 本章要学习的内容: 专题1:相关概念的理解专题2:多线程创建方式一:继承Thread类专题3:多线程创建方式二:实现Runnable接口专题4:Thread类的常用方法专题5:多线程的优点、使用…

5月编程排行榜出炉,最佳编程语言是谁?

技术的发展日新月异,作为开发者,应该时刻关注这些变化,不断学习才能跟上时代步伐。 编程语言层出不穷,关于“ 最佳编程语言 ”的争论也从未停止,网友们各抒己见...... 网友A: 人生苦短,我选Pyt…

软件测试工程师如何提高自己的竞争力?

案例一来自我们的资深功能测试工程师招聘。当时,有一位拥有近 9 年测试经验的资深测试候选人,我对他的简历还是比较满意的,所以就安排了面谈。但是,在聊的过程中我很快发现,这位候选人绝大多数的测试经验积累都“强”绑…

利用 DynamoDB 和 S3 结合 gzip 压缩,最大化存储玩家数据

前言 一些传统游戏架构中,采用 MySQL 存储玩家存档数据,利用分库分表分散单库单表的存储和性能压力,从而达到支持更多玩家的目的。随着数据量增长,数据表中 varchar 类型已经无法满足游戏中单字段的存储需求,而 blob …

去哪儿酒店数据下载

字段内容包含: id int(11) NOT NULL AUTO_INCREMENT, hotelid varchar(50) DEFAULT NULL, url varchar(200) DEFAULT NULL, hotelname2 varchar(100) DEFAULT NULL, name varchar(100) DEFAULT NULL, province varchar(50) DEFAULT NULL, d…

RabbitMQ集群安装

RabbitMQ集群安装 1.前言 OS: CentOS Linux release 7.9.2009 (Core) 机器: IPnodecpu内存存储10.106.1.241max-rabbitmg-018 核16 G100 G10.106.1.242max-rabbitmg-028 核16 G100 G10.106.1.243max-rabbitmg-038 核16 G100 G 因为操作系统版本是 centos7,所以…

跟着chatGPT学习:kubernetes中的Reflector、list-watcher、informer等概念

以下是我跟chatGPT学习kubernetes中Reflector、list-watcher、informer等的概念的过程 不敢保证chatGPT回答的百分之百准确。但是,确实帮助我了我理解! 最终学习的是下面的图, 1、在kubernetes中Reflector原理? 在Kubernetes…

【操作系统】线程简介

线程简介 线程概念 在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体。 所以,线程是轻量级的进程(LWP:light w…

短视频矩阵源码-智能剪辑生成技术数值组如何编程?

短视频混剪生成时长逻辑一般采用根据用户设定的总时长、视频数量、时长比例等参数计算出每个视频在混剪中所占的时长,然后根据视频的总时长与所占比例来划分每个视频在混剪中的时长,最后将各个视频拼接起来形成混剪视频。此算法可以进行灵活的时长调整和…

RabbitMQ 小白教程,从安装到使用

主要内容 AMQP简介 RabbitMQ简介 RabbitMQ原理 Erlang安装 安装RabbitMQ RabbitMQ账户管理 交换器 学习目标 知识点要求AMQP简介掌握RabbmitMQ简介掌握RabbitMQ原理掌握Erlang安装掌握安装RabbitMQ掌握RabbitMQ账户管理掌握交换器掌握 一、 AMQP简介 1 AMQP是什么?…

【Midjourney】Midjourney 连续性人物创作 ④ ( 使用 URL + Seed 随机种子生成连续性的人物 )

文章目录 一、生成图片并获取 Seed二、使用 URL Seed 随机种子生成连续性的人物 使用 URL 链接 和 Seed 随机种子 生成连续性人物 , 必须先生成一组图片 , 然后按 U 按钮 , 选择一张大图 , 之后所有的连续性人物图片都基于该图片进行生成 ; 使用 URL Seed 随机种子生成连续性…

Flink学习——状态编程

目录 一、Flink中的状态 二、状态编程 (一)ValueState案例——判断传感器的数据 1.代码实现 2.端口进行传输数据 3.运行结果 (二)ListState (三)MapState案例——比较学生每次考试成绩 1.代码实现 2.端口传输学生成绩 3.运行结果 (四)ReducingState 一、Flink中的状…

DETR3D 论文学习

1. 解决了什么问题? 对于低成本自动驾驶系统,仅凭视觉信息进行 3D 目标检测是非常有挑战性的。目前的多相机 3D 目标检测方法有两类,一类直接对单目图像做预测,没有考虑 3D 场景的结构或传感器配置。这类方法需要多步后处理&…

C语言小游戏——扫雷

前言 结合前边我们所学的C语言知识,本期我们将使用C语言实现一个简单的小游戏——扫雷 目录 前言 总体框架设计 多文件分装程序 各功能模块化实现 初始化棋盘 棋盘打印 埋雷 判赢与排雷 游戏逻辑安排 总结 总体框架设计 和三子棋相同,游戏开始时…

Linux安装MySQL后无法通过IP地址访问处理方法

本文主要总结Linux安装Mysql后,其他主机访问不了MySQL数据库的原因和解决方法 环境说明: MySQL 5.7.30CentOS Linux release 7.6.1810 (Core) 创建完Mysql数据库后可以查看mysql 日志获取root 用户登录密码 [rootlocalhost mysql-5.7.30]# cat /var/l…

spring源码学习

1.xmlBeanFactory对defaultListableBeanFactory类进行扩展,主要用于从XML文档中获取BeanDefinition,对于注册及获取bean都是使用从父类DefaultListableBeanFactory继承的方法去实现。 xmlBeanFactory 主要是使用reader属性对资源文件进行读取和注册。 2.…

Maven属性与版本管理

文章目录 1 属性1.1 问题分析1.2 解决步骤步骤1:父工程中定义属性步骤2:修改依赖的version 2 配置文件加载属性步骤1:父工程定义属性步骤2:jdbc.properties文件中引用属性步骤3:设置maven过滤文件范围步骤4:测试是否生效 3 版本管理 在这一章节内容中,我们将学习两个…

cpp11实现线程池(一)——项目介绍

项目介绍 线程池是库的形式提供给用户,是必须放到代码中,不能单独运行,亦称为基础组件 第一版线程池任务对象使用继承技术,提供一个抽象基类Task,里面有一个纯虚函数run(),使用时继承该类,并重…