当前位置: 首页 > news >正文

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 位的预分频器,它由一个内部独立的114kHzRC 振荡器 提供时钟,因为这个 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.非静态方法:普通方法/…...

常用命令总结

将常用命令汇集于此&#xff0c;以便在忘记的时候查询&#xff0c;持续更新…… Git Local changes 添加名字&#xff1a; git config --global user.name "<你的名字>"添加邮件&#xff1a; git config --globa user.email "<你的邮箱>"…...

【Linux:程序地址空间--原来操作系统也喜欢画大饼】

目录 1 代码感受 2 进程地址空间 3 扩展 1 代码感受 在正式讲程序地址空间前我们先来看一段简单的代码来分析分析&#xff1a; 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实现简单信号滤波实战

在有些项目中需要对信号进行滤波处理&#xff0c;尤其是在医疗的设备中如心跳、脉搏等设备的采样后进行处理。滤波的目的就是除去某些频率的信号如噪声。常见的包括有低通滤波、高通滤波、带通滤波。 低通滤波指的是去除高于某一阈值频率的信号&#xff1b;高通滤波去除低于某…...

Java(110):非对称加密RSA的使用(KeyPair生成密钥)

Java(110)&#xff1a;非对称加密RSA的使用(KeyPair生成密钥) RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥&#xff0c;即公钥 私钥&#xff0c;将公钥提供给调用方&#xff0c;调用方使用公钥对数据进行加密后&#xff0c;服务方根据私钥进行解密。 1、RSA生…...

(Mybatis 学习【1】)整合 Mybatis 开发流程

Mybatis 整合流程 ① 添加MyBatis的依赖 ② 创建数据库表 ③ 编写pojo实体类 ④ 编写映射文件UserMapper.xml ⑤ 编写核心文件mybatis-config.xml ⑥ 编写测试类** 编写 pojo 实体类 (设计相应的数据库&#xff09; Data AllArgsConstructor NoArgsConstructor public class…...

一文搞懂Kerberos

Kerberos一词来源于古希腊神话中的Cerberus——守护地狱之门的三头犬&#xff0c;Kerberos是为TCP/IP 网络设计的可信第三方鉴别协议&#xff0c;最初是在麻省理工学院(MIT)为Athena 项目而开发的。Kerberos服务起着可信仲裁者的作用&#xff0c;可提供安全的网络鉴别&#xff…...

Go爬虫学习笔记(三)

day3 ‍ 04&#xff5c;敏捷之道&#xff1a;大型Go项目的开发流程是怎样的&#xff1f; 瀑布模式 流程&#xff1a; 市场调研需求分析产品设计研发实现集成与测试项目交付与维护 适用场景&#xff1a; 需求在规划和设计阶段就已经确定了&#xff0c;而且在项目开发周期内&…...

CASTEP参数设置(2)

虚拟试验&#xff08;分子模拟&#xff09; 在表征材料以及材料的相关性质时&#xff0c;只要是采用已有的理论加以解释 但是通常来说&#xff0c;需要采用已有的理论来进行设计和探索&#xff0c;伴随着工业软件的发展&#xff0c;应当选用仿真技术来缩小探索范围 传统试验V…...

浅谈对Promise的理解以及在工作中的应用

浅谈对Promise的理解以及在工作中的应用Promise的概念背景知识JavaScript的同步和异步JavaScript事件循环回调函数进行异步操作解决方案&#xff1a;PromisePromise 在工作中的运用创建PromisePromise封装AJAXPromise链式操作Promise.all()Promise.race()async和await总结Promi…...

开源|快速入门和理解并模拟实现GPS户外机器人的定位与导航

户外机器人的定位导航相对于需要建图的场景来说&#xff0c;是比较简单容易实现的&#xff0c;因为可以借助第三方地图完成定位&#xff0c;并在第三方地图中完成路径规划和下发航点等操作&#xff0c;实现的难题在于如何控制机器人完成步行和转弯。 这些在不引进RTK高精度定位…...

Java多线程系列--synchronized的原理

原文网址&#xff1a;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开发板&#xff08;针对ARM-32bit的有另一篇文…...

Linux->进程程序替换

目录 前言&#xff1a; 1 程序替换原理 2 单进程替换 3 替换函数 3.1 函数使用 4 程序去替换自己的另一个程序操作方式 5 实现自己的shell 前言&#xff1a; 通过我们之前对于子进程的应用&#xff0c;我相信大家一定是能够想到创建子进程的目的之一就是为了代劳父进程执…...

最强分布式锁工具:Redisson

1 Redisson概述1.1 什么是Redisson&#xff1f;Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorted…...

Java9-17新特性

Java9-17新特性 一、接口的私有方法 Java8版本接口增加了两类成员&#xff1a; 公共的默认方法公共的静态方法 Java9版本接口又新增了一类成员&#xff1a; 私有的方法 为什么JDK1.9要允许接口定义私有方法呢&#xff1f;因为我们说接口是规范&#xff0c;规范时需要公开…...

电脑开机找不到启动设备怎么办?

电脑正常开机&#xff0c;却提示“找不到启动设备”&#xff0c;这时我们该怎么办呢&#xff1f;本文就为大家介绍几种针对该问题的解决方法&#xff0c;一起来看看吧&#xff01;“找不到启动设备”是什么意思&#xff1f;可引导设备&#xff08;又称启动设备&#xff09;是一…...

使用langchain打造自己的大型语言模型(LLMs)

我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知&#xff0c;无所不能&#xff0c;但是由于有机器人所学习到的是截止到2021年9月以前的知识&#xff0c;所以当用户询问机器人关于2021年9月以后发送的事情时&#xff0c;它无法给出正确的答案&#x…...

assert()宏函数

assert()宏函数 assert是宏&#xff0c;而不是函数。在C的assert.h文件中 #include <assert.h> void assert( int expression );assert的作用是先计算表达式expression&#xff0c; 如果其值为假&#xff08;即为0&#xff09;&#xff0c;那么它会打印出来assert的内容…...

AudioSeal Pixel Studio步骤详解:上传→嵌入→试听→下载→检测五步闭环操作

AudioSeal Pixel Studio步骤详解&#xff1a;上传→嵌入→试听→下载→检测五步闭环操作 1. 产品概述 AudioSeal Pixel Studio是一款基于Meta开源的AudioSeal算法构建的专业音频水印工具。它能够在保持原始音频质量的前提下&#xff0c;为音频文件嵌入几乎不可察觉的数字水印…...

深度剖析AI专著生成工具,开启高效专业学术专著撰写新体验

学术专著写作困境与AI辅助工具介绍 写作学术专著不仅是对学术素养的考验&#xff0c;还是对心理韧性的挑战。与论文写作可以依赖团队合作不同&#xff0c;专著的创作往往需要研究者独立完成。从选题、框架设计到内容创作和修改&#xff0c;几乎每一个环节都需要研究者一个人完…...

Janus-Pro-7B应用场景:游戏公司NPC对话图→剧情分支图AI生成

Janus-Pro-7B应用场景&#xff1a;游戏公司NPC对话图→剧情分支图AI生成 1. 游戏开发中的NPC对话设计挑战 在游戏开发过程中&#xff0c;NPC&#xff08;非玩家角色&#xff09;对话设计是一个既重要又耗时的环节。传统的NPC对话设计流程通常需要&#xff1a; 文案策划编写大…...

数据流图实战指南:从理论到Visio绘制技巧

1. 数据流图基础&#xff1a;从概念到符号解析 第一次接触数据流图是在十年前的一个银行系统改造项目上。当时客户拿着厚厚一叠需求文档&#xff0c;却说不清楚资金流转的具体逻辑。直到我们用数据流图把整个业务流程可视化出来&#xff0c;所有人才恍然大悟——原来数据是这样…...

拆解T265鱼眼视觉:用Python+OpenCV玩转200Hz姿态数据的5种创意用法

拆解T265鱼眼视觉&#xff1a;用PythonOpenCV玩转200Hz姿态数据的5种创意用法 当计算机视觉遇上嵌入式AI芯片&#xff0c;会碰撞出怎样的火花&#xff1f;Intel RealSense T265凭借独特的鱼眼双摄与Myriad 2 VPU的完美配合&#xff0c;将V-SLAM算法运行功耗控制在1.5W的同时&am…...

MT4 ServerAPI隐藏功能挖掘:从内存管理宏到高频交易插件开发

MT4 ServerAPI深度开发&#xff1a;内存管理与高频交易插件实战指南 1. 内存管理宏的底层机制与性能优化 MT4 ServerAPI中的HEAP_ALLOC和HEAP_FREE宏是高频交易插件开发的核心利器。这些宏直接调用了Windows系统的HeapAlloc和HeapFree函数&#xff0c;绕过了标准库的内存管理开…...

HighGo数据库密码策略实战:如何避免7天后账号被锁定的尴尬

HighGo数据库密码策略实战&#xff1a;如何避免7天后账号被锁定的尴尬 第一次接触HighGo数据库的运维工程师&#xff0c;往往会在某个周一早晨收到这样的报错&#xff1a;"FATAL: password authentication failed for user"。这不是密码输错了&#xff0c;而是踩中了…...

百度云数字人智能客服在线:高并发场景下的效率优化实战

最近在负责公司智能客服系统的性能优化&#xff0c;正好用到了百度云的数字人智能客服在线平台。在高并发场景下&#xff0c;原来的系统经常出现响应慢、资源吃紧的问题&#xff0c;经过一番折腾&#xff0c;总算摸出了一套可行的优化方案。这里把实战过程和一些思考记录下来&a…...

Docker网络高级实战:隔离网络、检查路由表和自定义网络驱动

libnetworklibnetwork 实现了CNM 的Docker网络组件库。libnetwork内置了几种网络驱动&#xff1a;bridge驱动。此驱动为Docker的默认设置&#xff0c;使用这个驱动的时候&#xff0c;libnetwork将创建出来的docker容器连接到Docker网桥上。作为最常规的模式&#xff0c;bridge模…...

CUDA编程学习(四)内存拷贝

本篇文章介绍如何把存储在主机内存上的数据拷贝到存储到设备显卡的内存上。我们将逐步分析代码&#xff0c;完整代码如下#include <cuda_runtime.h> #include "../common/common.h" #include <stdio.h>void initialData(float *ip,int size) {time_t t;s…...