【STM32】看门狗

作者:IT阳晨。日期:2025/10/30

目录

  • 一、独立看门狗
    • 1. IWDG简介
    • 2. IWDG工作原理及框图
    • 3. IWDG寄存器及函数介绍
    • 4. IWDG溢出时间计算
    • 5. IWDG配置步骤
    • 6. 小实验:独立看门狗喂狗实验
  • 二、窗口看门狗
    • 1. WWDG简介
    • 2. WWDG工作原理及框图
    • 3. WWDG寄存器及函数介绍
    • 4. WWDG溢出时间计算
    • 5. WWDG配置步骤
    • 6. 小实验:窗口看门狗喂狗实验

一、独立看门狗

1. IWDG简介

独立看门狗(Independent Watchdog,通常缩写为IWDG)主要作用是主要用于检测外界电磁干扰,或硬件异常导致的程序跑飞问题。

  • IWDG本质上是一个12位的递减计数器。当计数器的值从某个初始值开始递减,并一直减到0时,系统会产生一个复位信号(IWDG_RESET)。CPU在接收到这个复位信号后,会重新启动系统,以确保系统从可能的错误或死锁状态中恢复。
  • 在计数器的值减到0之前,如果程序通过特定的“喂狗”操作(即重置计数器的值)来刷新计数器,那么就不会产生复位信号,系统将继续正常运行。这种“喂狗”操作通常是由程序在正常运行时定期执行的,以确保IWDG不会因计数器超时而产生复位信号。
  • 它使用专用的低速时钟(LSI)作为时钟源,即使在主时钟发生故障时,IWDG仍然能够继续运行。IWDG可以在停止模式和待机模式下工作,确保在这些模式下系统仍然受到保护。

2. IWDG工作原理及框图

在这里插入图片描述

在这里插入图片描述

3. IWDG寄存器及函数介绍

v
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. IWDG溢出时间计算

在这里插入图片描述

1Tout:看门狗溢出时间
2fIWDG:看门狗的时钟源频率
3psc:看门狗预分频系数
4rlr:看门狗重装载值
5

在这里插入图片描述

5. IWDG配置步骤

在这里插入图片描述

6. 小实验:独立看门狗喂狗实验

实验目的

配置 IWDG 溢出时间为 1 秒左右,并验证未及时喂狗时系统将被复位。

代码实现

main.c

1#include "sys.h"
2#include "uart1.h"
3#include "delay.h"
4#include "led.h"
5#include "uart1.h"
6#include "iwdg.h"
7
8int main(void)
9{
10    HAL_Init();                         /* 初始化HAL库 */
11    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */      
12    //LED初始化
13    led_init();
14    uart1_init(115200);
15    iwdg_init(IWDG_PRESCALER_32,1250 - 1);
16    printf("hello world\r\n");
17    printf("狗儿肚子饿了,再不喂它的话就咬人了\r\n");
18    
19    if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET){
20        printf("独立看门狗复位\r\n");
21        __HAL_RCC_CLEAR_RESET_FLAGS();
22    }else{
23        printf("其他复位重启\r\n");
24    }
25    
26    while(1)
27    {
28        delay_ms(500);
29        iwdg_feed();
30        printf("狗儿已经喂饱了,不会咬人了!\r\n");
31    }
32}
33

iwdg.c

1#include "iwdg.h"
2
3IWDG_HandleTypeDef iwdg_handle = {0};
4
5//独立看门口初始化
6void iwdg_init(uint8_t psc, uint16_t rlr)
7{
8    iwdg_handle.Instance = IWDG;
9    iwdg_handle.Init.Prescaler = psc;
10    iwdg_handle.Init.Reload = rlr;
11    HAL_IWDG_Init(&iwdg_handle);
12}
13
14//喂狗函数
15void iwdg_feed(void)
16{
17    HAL_IWDG_Refresh(&iwdg_handle);
18}
19
20

iwdg.h

1#ifndef __IWDG_H__
2#define __IWDG_H__
3
4#include "sys.h"
5
6//独立看门口初始化
7void iwdg_init(uint8_t psc, uint16_t rlr);
8//喂狗函数
9void iwdg_feed(void);
10
11#endif
12

二、窗口看门狗

1. WWDG简介

窗口看门狗用于监测单片机程序运行时效是否精准,主要检测软件异常,一般用于需要精准检测程序运行时间的场合。

窗口看门狗的本质是一个能产生系统复位信号和提前唤醒中断的6位计数器。产生复位条件:

  • 当递减计数器值从 0x40 减到 0x3F 时复位(即T6位跳变到0)。
  • 计数器的值大于 W[6:0] 值时喂狗会复位。

产生中断条件:

  • 当递减计数器等于 0x40 时可产生提前唤醒中断 (EWI)。
  • 在窗口期内重装载计数器的值,防止复位,也就是所谓的喂狗。

2. WWDG工作原理及框图

在这里插入图片描述

在这里插入图片描述

3. WWDG寄存器及函数介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. WWDG溢出时间计算

在这里插入图片描述

5. WWDG配置步骤

在这里插入图片描述

6. 小实验:窗口看门狗喂狗实验

实验目的

开启窗口看门狗,计数器值设置为 0X7F ,窗口值设置为 0X5F ,预分频系数为 8 。在 while 循环里喂狗,同时翻转 LED1 状态;在提前唤醒中断服务函数进行喂狗,同时翻转 LED2 状态。

在这里插入图片描述

代码实现

main.c

1#include "sys.h"
2#include "uart1.h"
3#include "delay.h"
4#include "led.h"
5#include "uart1.h"
6#include "wwdg.h"
7
8int main(void)
9{
10    HAL_Init();                         /* 初始化HAL库 */
11    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */      
12    //LED初始化
13    led_init();
14    //串口初始化
15    uart1_init(115200);
16    //窗口看门狗初始化
17    wwdg_init(0x7F, 0x5F, WWDG_PRESCALER_8);
18    
19    if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET){
20        printf("独立看门狗复位\r\n");
21        __HAL_RCC_CLEAR_RESET_FLAGS();
22    }else{
23        printf("其他复位重启\r\n");
24    }
25    
26    while(1)
27    {
28        delay_ms(50);
29        wwdg_feed();
30        led2_toggle();
31    }
32}
33

wwdg.c

1#include "wwdg.h"
2#include "led.h"
3
4WWDG_HandleTypeDef wwdg_handle = {0};
5//窗口看门狗初始化
6void wwdg_init(uint8_t tr, uint8_t wr , uint32_t psc)
7{
8    wwdg_handle.Instance = WWDG;
9    //设置定时器重装载值
10    wwdg_handle.Init.Counter = tr;
11    //设置窗口值
12    wwdg_handle.Init.Window = wr;
13    //设置分频系数
14    wwdg_handle.Init.Prescaler = psc;
15    //提前唤醒中断使能标志
16    wwdg_handle.Init.EWIMode = WWDG_EWI_ENABLE;;
17    HAL_WWDG_Init(&wwdg_handle);
18}
19
20//硬件相关初始化
21void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
22{
23    //打开看门口时钟
24    __HAL_RCC_WWDG_CLK_ENABLE();
25    //设置中断优先级
26    HAL_NVIC_SetPriority(WWDG_IRQn, 2, 2);
27    //使能中断
28    HAL_NVIC_EnableIRQ(WWDG_IRQn);
29}
30
31//中断服务函数
32void WWDG_IRQHandler(void)
33{
34    //公共服务函数
35    HAL_WWDG_IRQHandler(&wwdg_handle);
36}
37
38//喂狗函数
39void wwdg_feed(void)
40{
41    HAL_WWDG_Refresh(&wwdg_handle);
42}
43
44//中断回调函数
45void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
46{
47    //喂狗
48    //wwdg_feed();
49    led2_toggle();
50}
51

wwdg.h

1#ifndef __WWDG_H__
2#define __WWDG_H__
3
4#include "sys.h"
5
6
7//喂狗函数
8void wwdg_feed(void);
9void wwdg_init(uint8_t tr, uint8_t wr , uint32_t psc);
10
11#endif
12

【STM32】看门狗》 是转载文章,点击查看原文


相关推荐


C语言<<超全.超重要>>知识点总结
richxu202510012025/10/27

C语言<<超全.超重要>>知识点总结 #嵌入式[话题]# #电子信息[话题]# #单片机[话题]# #stm32[话题]# #校招[话题]# #秋招[话题]#


GitHub 热榜项目 - 日榜(2025-10-21)
CoderJia_2025/10/24

GitHub 热榜项目 - 日榜(2025-10-21) 生成于:2025-10-21 统计摘要 共发现热门项目:20 个 榜单类型:日榜 本期热点趋势总结 基于本期GitHub热榜项目,AI与机器学习生态系统呈现强劲发展势头,成为技术创新的核心驱动力。Claude cookbooks、系统提示词收集项目和开源NotebookLM实现等AI工具类项目表现突出,体现了大模型应用的快速普及和开发者对AI工程实践的强烈需求。同时,机器人学习框架LeRobot、OCR工具PaddleO


Python 的内置函数 callable
IMPYLH2025/10/22

Python 内建函数列表 > Python 的内置函数 callable def callable(obj): ''' 判断对象是否可调用 :param obj: 一个代对象 :return: 如果 obj 可以调用则返回 True,否则返回 False ''' Python 的内置函数 callable() 用于检查一个对象是否可以被调用(即该对象是否能像函数一样被调用)。该函数返回一个布尔值,如果对象是可调用的则返回 True,否则返回 Fa


第5部分:Netty性能优化与调优策略
lpfasd1232025/10/21

第5部分:Netty性能优化与调优策略 5.1 参数调优 线程数调优 1. EventLoopGroup线程数配置 public class ThreadOptimization { public void configureThreads() { // 获取CPU核心数 int cpuCores = Runtime.getRuntime().availableProcessors(); // Boss线程组:通常1个即可


如何将 iPhone 联系人同步到 Mac
Digitally2025/10/20

将 iPhone 联系人同步到 Mac 有许多好处。也许你换了新手机,想保留联系人列表,或者你只是想在使用 Mac 时访问 iPhone 联系人。听起来可能有些麻烦,但实际上同步联系人非常简单。使用苹果产品的一大好处是它们能够无缝协作。你的 iPhone 和 Mac 可以轻松共享数据,包括联系人。在这篇指南中,我们将向你介绍 6 种将 iPhone 联系人同步到 Mac 的简单方法。让我们开始吧! 方法 1:如何使用 iReaShare iPhone Manager 将 iPhone 联系


Java kubernetes
自由的疯2025/10/19

Kubernetes,通常简称为 K8s,是一个开源的容器编排平台,用于自动化容器化应用的部署、管理和扩展。Kubernetes 最初由 Google 的工程师设计开发,并于2014年开源,随后在2015年捐赠给云原生计算基金会(CNCF)。Kubernetes 的设计基于 Google 在内部使用的大规模容器管理系统 Borg 的经验和教训。 Kubernetes 的主要功能 自动化部署和回滚:Kubernetes 可以自动部署应用程序,并在检测到问题时自动回滚到之前的稳定版本。 自我修复:


基于springboot的民谣网站的设计与实现
舒克日记2025/10/17

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 项目介绍 系统主要分为管理员角色和用户角色 本系统主要功能需求包括歌曲信息管理、歌曲留言管理等模块。其中,密码信息、用户信息、歌曲信息、歌曲留言信息等都是非常重要的数据记录,在系统设计的过程中,需要进行一定的加密处理,确保数据安全性,切实的保护好用户的重要信息。 环境要求 1.运行环境:最好是java jdk1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Ec


Jmeter 线程组、定时器、监听器、后置处理器常用配置说明
wdlnancy2025/10/16

目录 1、线程组 1.1 多线程组关系 1.2、线程组的设置参数含义 ​编辑1.3 如何查看线程数是否全部启动成功? 2、定时器 2.1 常数吞吐量定时器 3、监听器 3.1 查看结果树 3.1.1 多个线程并发时,查看结果树频繁刷屏,如果有失败,无法停止后看到想看的失败信息,如何解决? ​编辑4.1.2 取样器结果里展示的字段都什么含义 3.2 聚合报告 3.2.1:聚合报告如何查看http请求的平均响应时间: 4、后置处理器 4.1 正则表达式提取器


1+X Web前端初级考试html涉及的知识点
期待~明天2025/10/14

HTML 基础概念 HTML(超文本标记语言)是构建网页的核心技术,用于定义网页结构和内容。考试通常涵盖以下基础知识点: HTML 文档基本结构:<!DOCTYPE> 声明、<html>、<head>(包含 <title>、<meta> 等)、<body>。常用标签:段落 <p>、标题 <h1>-<h6>、链接 <a href="">、图像 <img src="" alt="">、列表 <ul>/<ol>/<li>。文本格式化标签:<strong>、<em>、<br>、<hr>。 表单与输


Subagent 自进化:从使用中迭代出最契合场景的agent
是魔丸啊2025/10/13

为什么做这个subagent 我一直有这样一个观点:Prompt不是一次性设计出来的,而是在使用过程中不断迭代和沉淀的。 过去在 Cursor 时代,有许多优秀的规则体系,比如 Devin.CursorRules。它最大的价值在于可以在使用中持续积累经验(Lessons模块),用户可以将其中表现良好的部分提炼进 UserRules 或 ProjectRules,逐渐形成符合自己风格和使用场景的提示词体系。 进入 Claude Code 时代后,平台提供了自动生成 Subagent 的机制,这是非

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0