STM32入门笔记(02):独立看门狗(IWDG)和窗户看门狗(WWDG)(SPL库函数版)

1.IWDG狗简介
除了始终控制器的RCC_CSR寄存器的父为标志位和备份区域中的寄存器以外,系统复位 将复位所有寄存器至它们的复位状态。
当发生以下任一事件时,产生一个系统复位:
- 1.NRST引脚上的 低 电平,即 外部复位;
- 2.窗口看门狗计数器终止,即 WWDG复位;
- 3.独立看门狗计数器终止,即 IWDG复位;
- 4.软件复位 , 即 SW复位;
- 5.低功耗管理复位。
1.1IWDG应用场景

1.2 IWDG工作原理

2. IWDG配置步骤
略
3.编程实战:验证不及时喂狗,系统将自动重启
3.1 公式计算:自动重载值和预分频系数

Tout = psc*rlr / fIWDG
- Tout 是溢出时间 ,由开发人员确定,例如:1S
- psc 是预分频系数,根据库头文件去查找, 例如:IWDG_PRESCALER_32 , 分频系数/32,最长时间是2.2758秒
- fIWDG是独立的内部时钟源频率,这个要查芯片手册,例如:40KHz = 40 000
- rlr 是自动重载值,根据公式计算得出。
(函数参数中的自动重载值和预分频系数,根据溢出时间和时钟频率进行设置。不要乱填写。)


3.2 程序截图


3.3 航顺HK32F030M 的IWDG
3.3.1 HK32F030M的看门狗时钟
独立的看门狗是基于一个 12 位的递减计数器和一个 8 位的预分频器,它由一个内部独立的114kHz 的 RC 振荡器 提供时钟,因为这个 RC 振荡器独立于主时钟,所以它可运行于停机和待机模式。它可以被当成看门狗用于在发生问题时复位整个系统,或作为一个自由定时器为应用程序提供超时管理。通过选择字节可以配置成是软件或硬件启动看门狗。在调试模式,计数器可以被冻结。

HK32F030M数据手册_V1.0.13
3.3.2 HK32F030M的结构框架图
ARM 的 Cortex™-M0 处理器是最新一代的嵌入式 32 位 RISC 处理器,它是一个低成
本、低功耗的 MCU 平台,同时提供卓越的计算性能和先进的中断系统响应。
HK32F030M 系列产品拥有内置的 Cortex™-M0 核心,因此它与所有的 ARM 工具和软件
兼容。
该系列产品的功能框图如下图:

114kHz片内时钟


系统时钟需要在【system_hk32f030m.c】文件中设置;否则默认32MHz。
3.3.4 程序
3.3.4.1 自动重载值和预分频系数计算
计算 IWDG 的超时时间 1s。
Tout(s) = prv*rlv (s)/114000 (片内慢速 LSI 时钟:114kHz)
rlv = 1S*114000Hz /128 = 890
3.3.4.2 程序实现
bsp_iwdg.c
#include "bsp_iwdg.h"/** 设置 IWDG 的超时时间* Tout(s) = prv*rlv (s)/114000 // 114Khz HK32F030M片内时钟* rlv = 1S*114000Hz /128 = 890* prv可以是[4,8,16,32,64,128,356]* prv:预分频系数,取值如下:* @arg IWDG_Prescaler_4: IWDG prescaler set to 4* @arg IWDG_Prescaler_8: IWDG prescaler set to 8* @arg IWDG_Prescaler_16: IWDG prescaler set to 16* @arg IWDG_Prescaler_32: IWDG prescaler set to 32* @arg IWDG_Prescaler_64: IWDG prescaler set to 64* @arg IWDG_Prescaler_128: IWDG prescaler set to 128* @arg IWDG_Prescaler_256: IWDG prescaler set to 256* rlv:重载值,取值范围为:0-0xFFF* 函数调用举例:* IWDG_Config(IWDG_Prescaler_128, 890); // IWDG 1s 超时溢出
*/void IWDG_Config(uint8_t prv, uint16_t rlv)
{/* 使能 预分频寄存器PR和重装载寄存器RLR可写 */IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable);/* 设置预分频器值 */IWDG_SetPrescaler( prv );/* 设置重装载寄存器值 */IWDG_SetReload( rlv );/* 把重装载寄存器的值放到计数器中 */ IWDG_ReloadCounter();/* 使能IWDG */IWDG_Enable();
}/* 喂狗 */
void IWDG_Feed(void)
{/* 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位当计数器的值减到0的时候会产生系统复位*/IWDG_ReloadCounter();
}
bsp_iwdg.h
#ifndef __IWDG_H
#define __IWDG_H#include "hk32f030m.h"void IWDG_Feed(void);
void IWDG_Config(uint8_t prv, uint16_t rlv);#endif
main.c
/********************************************************************************* @file main.c* @author Alexander* @version V1.0* @date 2022-xx-xx* @brief IWDG独立看门狗实验******************************************************************************
* */
#include "hk32f030m.h"
#include "bsp_led.h"
#include "bsp_key.h"
#include "bsp_iwdg.h"static void Delay(__IO uint32_t nCount); /*** @brief 主函数* @param 无 * @retval 无*/int main(void)
{/* LED端口初始化 */LED_GPIO_Config();Delay(0xFFFFF);/*-----------------------------------------------------------------------*//* 检查是否为独立看门狗复位 */if( RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET){/* 独立看门狗复位 */LED3_ON;/* 清除标志 */RCC_ClearFlag();/*如果一直不喂狗,会一直复位,加上前面的延时,会看到LED3灯闪烁。在1s时间内喂狗的话,则会持续灭LED3*/}else{/* 不是独立看门狗复位(可能为上电复位或者手动按键复位之类的) *//* 亮LED3 */// LED2_ON;}/*-----------------------------------------------------------------------*//* 按键端口初始化 */Key_GPIO_Config();/* IWDG 1s 超时溢出 */IWDG_Config(IWDG_Prescaler_128, 890); while(1) { /* 这里添加需要被监控的代码,如果有就去掉按键模拟喂狗,把按键扫描程序去掉 */if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON ){/* 喂狗,如果不喂狗,系统则会复位,LED1则会灭一次,如果在1s时间内准时喂狗的话,则LED3会在重启的时候亮,复位的时候灭 */IWDG_Feed();/* 喂狗后,LED3灭 */LED3_OFF;} }
}static void Delay(__IO uint32_t nCount) //简单的延时函数
{for(; nCount != 0; nCount--);
}#ifdef USE_FULL_ASSERT
/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(char* file , uint32_t line)
{/* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */while (1){ }
}
#endif /* USE_FULL_ASSERT */
3.3.4.3 成果展示
HK32F030MF4P6最小系统板之《独立看门狗复位》
4.独立看门狗总结

5.WWDG简介



6. WWDG配置步骤

7.IWDG 和 WWDG的主要区别


如果我们知道whlie(1)里的代码执行总时间,比如是500ms,那么我们可以设置独立看门狗的溢出;时间是600ms,比500ms多一点,如果要被监控的程序没有跑飞正常执行的话,那么执行完 毕之后就会执行喂狗的程序,如果程序跑飞了那程序就会超时,到达不了喂狗的程序,此 时产生系统复位。
但是也不排除程序跑飞了又跑回来的了,刚好喂狗了,歪打正着。
所以 要想更精确的监控程序,可以使用窗口看门狗,窗口看门狗规定必须在规定的窗口时间内喂狗。
参考资料
-
[1] 【B站@正点原子官方】全是干货无套路 | 手把手教你深入学习独立看门狗&窗口看门狗
-
[2] 【B站@阿熊话太多】单片机中居然也有狗?STM32两条看门狗详解,独立看门狗和窗口看门狗
相关文章:
STM32入门笔记(02):独立看门狗(IWDG)和窗户看门狗(WWDG)(SPL库函数版)
1.IWDG狗简介 除了始终控制器的RCC_CSR寄存器的父为标志位和备份区域中的寄存器以外,系统复位 将复位所有寄存器至它们的复位状态。 当发生以下任一事件时,产生一个系统复位: 1.NRST引脚上的 低 电平,即 外部复位;2…...
javaSE系列之方法与数组的使用
[TOC] javaSE系列之方法与数组的使用 方法的定义 方法类似于C语言中的"函数"。 方法的种类 这里方法分为有参方法也分为无参方法, 形参和实参是两个实体(这里相当于函数的传值调用和传址调用) 1.非静态方法:普通方法/…...
常用命令总结
将常用命令汇集于此,以便在忘记的时候查询,持续更新…… Git Local changes 添加名字: git config --global user.name "<你的名字>"添加邮件: git config --globa user.email "<你的邮箱>"…...
【Linux:程序地址空间--原来操作系统也喜欢画大饼】
目录 1 代码感受 2 进程地址空间 3 扩展 1 代码感受 在正式讲程序地址空间前我们先来看一段简单的代码来分析分析: 1 #include<iostream>2 #include<unistd.h>3 using namespace std;4 5 int g_val100;6 7 int main()8 {9 pid_t idfork();10 if(i…...
Python实现简单信号滤波实战
在有些项目中需要对信号进行滤波处理,尤其是在医疗的设备中如心跳、脉搏等设备的采样后进行处理。滤波的目的就是除去某些频率的信号如噪声。常见的包括有低通滤波、高通滤波、带通滤波。 低通滤波指的是去除高于某一阈值频率的信号;高通滤波去除低于某…...
Java(110):非对称加密RSA的使用(KeyPair生成密钥)
Java(110):非对称加密RSA的使用(KeyPair生成密钥) RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥,即公钥 私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,服务方根据私钥进行解密。 1、RSA生…...
(Mybatis 学习【1】)整合 Mybatis 开发流程
Mybatis 整合流程 ① 添加MyBatis的依赖 ② 创建数据库表 ③ 编写pojo实体类 ④ 编写映射文件UserMapper.xml ⑤ 编写核心文件mybatis-config.xml ⑥ 编写测试类** 编写 pojo 实体类 (设计相应的数据库) Data AllArgsConstructor NoArgsConstructor public class…...
一文搞懂Kerberos
Kerberos一词来源于古希腊神话中的Cerberus——守护地狱之门的三头犬,Kerberos是为TCP/IP 网络设计的可信第三方鉴别协议,最初是在麻省理工学院(MIT)为Athena 项目而开发的。Kerberos服务起着可信仲裁者的作用,可提供安全的网络鉴别ÿ…...
Go爬虫学习笔记(三)
day3 04|敏捷之道:大型Go项目的开发流程是怎样的? 瀑布模式 流程: 市场调研需求分析产品设计研发实现集成与测试项目交付与维护 适用场景: 需求在规划和设计阶段就已经确定了,而且在项目开发周期内&…...
CASTEP参数设置(2)
虚拟试验(分子模拟) 在表征材料以及材料的相关性质时,只要是采用已有的理论加以解释 但是通常来说,需要采用已有的理论来进行设计和探索,伴随着工业软件的发展,应当选用仿真技术来缩小探索范围 传统试验V…...
浅谈对Promise的理解以及在工作中的应用
浅谈对Promise的理解以及在工作中的应用Promise的概念背景知识JavaScript的同步和异步JavaScript事件循环回调函数进行异步操作解决方案:PromisePromise 在工作中的运用创建PromisePromise封装AJAXPromise链式操作Promise.all()Promise.race()async和await总结Promi…...
开源|快速入门和理解并模拟实现GPS户外机器人的定位与导航
户外机器人的定位导航相对于需要建图的场景来说,是比较简单容易实现的,因为可以借助第三方地图完成定位,并在第三方地图中完成路径规划和下发航点等操作,实现的难题在于如何控制机器人完成步行和转弯。 这些在不引进RTK高精度定位…...
Java多线程系列--synchronized的原理
原文网址:Java多线程系列--synchronized的原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的synchronized的原理。 反编译出字节码 Test.java public class Test {private static Object LOCK new Object();public static int main(String[] args) {synchro…...
QEMU启动ARM64 Linux内核
目录前言前置知识virt开发板ARM处理器家族简介安装qemu-system-aarch64安装交叉编译工具交叉编译ARM64 Linux内核交叉编译ARM64 Busybox使用busybox制作initramfs使用QEMU启动ARM64 Linux内核前言 本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一篇文…...
Linux->进程程序替换
目录 前言: 1 程序替换原理 2 单进程替换 3 替换函数 3.1 函数使用 4 程序去替换自己的另一个程序操作方式 5 实现自己的shell 前言: 通过我们之前对于子进程的应用,我相信大家一定是能够想到创建子进程的目的之一就是为了代劳父进程执…...
最强分布式锁工具:Redisson
1 Redisson概述1.1 什么是Redisson?Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorted…...
Java9-17新特性
Java9-17新特性 一、接口的私有方法 Java8版本接口增加了两类成员: 公共的默认方法公共的静态方法 Java9版本接口又新增了一类成员: 私有的方法 为什么JDK1.9要允许接口定义私有方法呢?因为我们说接口是规范,规范时需要公开…...
电脑开机找不到启动设备怎么办?
电脑正常开机,却提示“找不到启动设备”,这时我们该怎么办呢?本文就为大家介绍几种针对该问题的解决方法,一起来看看吧!“找不到启动设备”是什么意思?可引导设备(又称启动设备)是一…...
使用langchain打造自己的大型语言模型(LLMs)
我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知,无所不能,但是由于有机器人所学习到的是截止到2021年9月以前的知识,所以当用户询问机器人关于2021年9月以后发送的事情时,它无法给出正确的答案&#x…...
assert()宏函数
assert()宏函数 assert是宏,而不是函数。在C的assert.h文件中 #include <assert.h> void assert( int expression );assert的作用是先计算表达式expression, 如果其值为假(即为0),那么它会打印出来assert的内容…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
