STM32 学习11 独立看门狗与窗口看门狗

STM32 学习11 独立看门狗与窗口看门狗

  • 一、**看门狗概述**
  • 二、**STM32中的看门狗类型**
    • 1. 独立看门狗(IWDG)
      • (1)基本概念
      • (2)独立看门狗框图
      • (3)独立看门狗配置步骤
      • (4)实验程序
        • iwdg.h
        • iwdg_util.c
        • main.c
    • 2. 窗口看门狗(WWDG)
      • (1)基本概念
      • (2)框图
      • (3)窗口看门狗的工作模式
      • (4)窗口看门狗配置步骤

一、看门狗概述

看门狗(WatchDog Timer),是一种电子或软件定时器,采用类似心跳的机制,监测单片机是否处于正常工作状态。
在正常工作状态,单片机会定期重置看门狗,当单片机发生异常时,看门狗无法正常重置,计时器会产生超时信号。

STM32F10x 内置两个看门狗,分别是独立看门狗(IWDG) 和窗口看门狗 (WWDG)。其中:

  • 独立看门狗由专用的32kHz 低速时钟为驱动,即使主时钟故障它仍能正常工作。
  • 窗口看门狗由APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序。

看门狗的应用场景:
- 防止系统死锁
- 处理软件故障
- 应对外部干扰
- 提高系统可靠性

二、STM32中的看门狗类型

1. 独立看门狗(IWDG)

(1)基本概念

独立看门狗,全称为Independent Watchdog Timer,是一种定时器电路,它用于监测单片机系统的正常支行状态并解决由程序引起的故障,其特点 :

  • 当计数器的值从某个初始值递减到0时,独立看门狗会产生一个复位信号(即IWDG_RESET)。
  • 如果在计数器减到0之前刷新了计数器的值(喂狗),则不会触发复位信号。
  • 独立看门狗的作用是防止程序进入死循环或跑飞,确保系统始终保持可靠运行。
  • 独立看门狗计数器是12位递减计数器,减到0如果还没喂狗则复位。

(2)独立看门狗框图

在这里插入图片描述

(3)独立看门狗配置步骤

IWDG引用头文件: stm32f10x_iwdg.h。

  1. 启用独立看门狗
// 关闭写保护,IWDG_KR寄存器写入0x5555IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
  1. 配置预分频器
// 时钟是分频后给看门狗使用IWDG_SetPrescaler(IWDG_Prescaler_4);  // 根据需要调整预分频器,以产生适当的看门狗溢出时间
  1. 配置溢出时间
    IWDG_SetReload(0xFFF);  // 根据需要调整溢出时间,数值越小溢出时间越短

溢出时间=(4*2^预分频系数) / 40 * 重载寄存器值,
需要在这个时间内喂狗。

  1. 重加截看门狗计数器
    IWDG_ReloadCounter();
  1. 启动看门狗
    // 启动看门狗,给IWDG_KR寄存器写入0xCCCCIWDG_Enable();
  1. 喂狗(重载看门狗计数器)
while (1) {// 喂狗,给IWDG_KR 写入0xAAAAIWDG_ReloadCounter();// 添加其他任务或逻辑
}

(4)实验程序

下面实验的现象是:
main.c里设置了喂狗的时间是1s,

  • 当main.c里的 while 循环里的 delay_ms(990); 的延迟在1000ms以内时,LED可以正常输出数值。
  • 当main.c里的 while 循环里的 delay_ms(1100); 的延迟超过了1000ms,串口会一直输出日志: restarting… , LED无法正常递增显示数值。
iwdg.h
#ifndef __IWDG_UTIL_H__
#define __IWDG_UTIL_H__#include "stm32f10x.h"
void iwdg_init(u8 prer, u16 rlr);
void iwdg_feed(void);
#endif
iwdg_util.c
#include "iwdg_util.h"/*** @brief IWDG初始化* @param prer 分频数:0~7(只有低3位有效)* @param rlr 自动重装载寄存器值:0~0XFFF
*/
void iwdg_init(u8 prer, u16 rlr)
{// 开启对IWDG寄存器的写操作IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);// 设置IWDG预分频值IWDG_SetPrescaler(prer);// 设置IWDG重装载值IWDG_SetReload(rlr);// 重装载IWDG计数器IWDG_ReloadCounter();// 使能IWDGIWDG_Enable();
}/*** @brief 喂狗
*/
void iwdg_feed(void)
{IWDG_ReloadCounter();
}
main.c
#include "gpio_utils.h"
#include "rcc_utils.h"
#include "stm32f10x.h"
#include "sys_tick_utils.h"
#include "led_utils.h"
#include "usart_utils.h"
#include "stdio.h"
#include "iwdg_util.h"// 主函数
int main(void)
{GPIO_Configuration(); // 调用GPIO配置函数// tick 初始化sys_tick_init(72);led_all_off();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);USART3_Init(9600);printf("restarting...");// led 初始化custom_led_init();// 启用窗口看门狗,溢出时间:(4*2^预分频系数) / 40 * 重载寄存器值=1siwdg_init(4, 625);int i = 0;while (1) // 无限循环{delay_ms(990);led_lightn(i);i++;if(i>9){i=0;}// 喂狗iwdg_feed();}
}

2. 窗口看门狗(WWDG)

(1)基本概念

  • 窗口看门狗(Window Watchdog)是一种特殊类型的看门狗,用于监视系统操作是否在预定的时间窗口内完成。与传统的独立看门狗不同,窗口看门狗要求操作在指定的时间窗口内完成,否则系统将被复位。这种看门狗的主要优势在于可以更精确地控制系统操作的时间。

  • 窗口看门狗是7位递减计数器,减到固定值(下限,0x40,不用修改)还没有喂狗则复位;但是在减到固定值(上限)前喂狗,也会触发复位。

  • 窗口看门狗挂接在 APB1总线上。

  • 时间窗口:时间窗口是指允许系统操作完成的时间范围。窗口看门狗要求系统在指定的时间窗口内完成操作,否则会被认为是异常操作。

  • 上限和下限:时间窗口由上限和下限定义。系统操作必须在上限和下限之间完成,否则会被认为是异常操作。

  • 应用场景:窗口看门狗通常用于对系统的关键操作进行监视,例如通信协议的数据传输、实时任务的执行等。

(2)框图

在这里插入图片描述

(3)窗口看门狗的工作模式

  • 关闭窗口模式: 在此模式下,窗口看门狗仅在计数器值处于上限和下限之间时才认为操作正常。如果计数器值超出此范围,则系统被认为异常。
  • 打开窗口模式:在此模式下,窗口看门狗在计数器值在上限和下限之外时认为操作正常。如果计数器值处于上限和下限之间,则系统被认为异常。

(4)窗口看门狗配置步骤

窗口看门狗头文件:
stm32f10x_wwdg.h

  1. 定义时间窗口的上限
#define WINDOW_UPPER_LIMIT 1000  // 时间窗口的上限
  1. 使能wwdg时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
  1. 设置窗口值和分频
// 值范围 0x40~0x7f
void WWDG_SetWindowValue(uint8_t windowValue);
// 分频系数可以为 WWDG_prescaler_1、 WWDG_Prescaler_2、WWDG_Prescaler_4、WWDG_Prescaler_8
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
  1. 开启WWDG中断并分组
NVIC_Init();
WWDG_EnableIT();
  1. 设置计数器初始值、使能WWDG
vopid WWDG_Enable(uint8_t Counter);
void WWDG_SetCounter(uint8_t Counter);
  1. 定义中断服务函数
WDG_IRQHandler();
// 清除中断标志
WWDG_ClearFlag();

窗口看门狗本章节暂时不写示例应用。

本文程序开源地址:
https://gitee.com/xundh/stm32_arm_learn

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

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

相关文章

十大排序算法(冒泡排序、插入排序、选择排序、希尔排序、堆排序、快排、归并排序、桶排序、计数排序、基数排序)

目录 一、冒泡排序: 二、插入排序: 三、选择排序: 四、希尔排序: 五、堆排序: 六、快速排序: 6.1挖坑法: 6.2左右指针法 6.3前后指针法: 七、归并排序: 八、桶…

Linux报错排查-CentOS/BigCloud_Enterprise_Linux系统yum安装kvm报错

Linux运维工具-ywtool 目录 一.系统环境二.问题描述三.问题解决四.其他命令 一.系统环境 系统版本:BigCloud_Enterprise_Linux 7.1 二.问题描述 通过yum安装kvm报错提示: /usr/bin/yum install -y qemu-kvm qemu-img libvirt libvirt-python virt-manager libvirt-client …

系统运维网络知识汇总

一、系统运维中网络方面的规划与思考 系统运维建立在网络的基础之上,如果没有一个相对合理的网络架构,恐怕系统运维做起来也不是那么的顺手。一个公司基本上都会把网络和服务器独立开来,划分不同的区域摆放设备,很多时候都是物理…

2024年家政预约上门服务小程序【用户端+商家端+师傅端】源码

024最新家政预约上门服务小程序源码 主要功能:商家入住,师傅入住,缴纳保正金 支持师傅,抢单派单 支持多城市多门下单,支持预约上门服务到店核销 支持补差价义价,支持区域服务限制 基于thinkphp和原生小程序开发

【五】【算法分析与设计】双指针的初见

167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index(1)] 和 numbers[index(2)] ,则 1 &…

排序类算法

目录 一、交换类排序 1.冒泡排序 2.快速排序 二、 插入排序 1.直接插入排序 2.折半插入排序 3.希尔排序 三、选择排序 1.简单选择排序 2.堆排序 完整代码 四、归并排序 完整代码 五、汇总 六、OJ练习 1.冒泡排序:正确表示前一个数和后一个数 2.选…

LLM推理框架Triton Inference Server学习笔记(一): Triton Inference Server整体架构初识

官方文档查阅: TritonInferenceServer文档 1. 写在前面 这篇文章开始进行大语言模型(Large Language Model, LLM)的学习笔记整理,这次想从Triton Inference Server框架开始,因为最近工作上用到了一些大模型部署方面的知识, 所以就快速补充了…

【STM32】串口助手接受数据是乱码如何解决

第一步 首先判断自己使用的串口助手和工程配置的波特率是否相同,一般都是115200 第二步 如果不是上一条的问题,继续排查,检查时钟问题 打开工程,找到此文件(stm32f10x.h)的这个位置,如工程中未添加,可以从…

centos安装hadoop启动问题解决方案

1、出现了问题localhost: ERROR: JAVA_HOME is not set and could not be found. *解决方案尝试: 修改hadoop-env.sh(在etc/hadoop) sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh 将原本的JAVA_HOME 替换为绝对路径就可以了 #expo…

Leetcode 144. 二叉树的前序遍历

题目描述:给定一个二叉树的根节点 root ,返回 它的 前序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root [] 输出:[] 示例 3: 输入&…

关于C语言调用Python,PyImport_ImportModule函数的简介

函数原型:PyObject *PyImport_ImportModule(const char *name) 用于加载编译目标的文件 这个模块必须为.py文件,因为说直白点就是通过Python3 xxxx.py能够通过编译的东西

项目管理【引论二】项目管理的逻辑

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 一、项目管理的目标 项目管理的目标是在规定的时间内,在批准的预算内,完成事先确定的工作范围内的工作,并且达到预期的质量性能要求。 1.1 时间、成本和质量之间的关系 1…

力扣226.翻转二叉树(二叉树的先序遍历)

文章目录 题目描述思路复杂度Code 题目描述 思路 利用二叉树的先序遍历,每次递归遍历时将当前节点的左右子节点交换即可 复杂度 时间复杂度: O ( n ) O(n) O(n);其中 n n n为树节点的个数 空间复杂度: O ( h e i g h ) O(heigh) O(heigh);其…

嵌入式学习第二十七天!(TCP并发模型)

TCP并发模型: 1. TCP多线程模型: 缺点:创建线程会带来资源开销,能够实现的并发量比较有限。 2. IO模型: 1. 阻塞IO: 没有数据到来时,可以让任务挂起,节省CPU资源开销,提…

案例分析篇01:软件架构设计考点架构风格及质量属性(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

【SpringCloud微服务实战01】Eureka 注册中心

前言 在 Eureka 架构中,微服务角色有两类: EurekaServer :服务端,注册中心 记录服务信息 心跳监控 EurekaClient :客户端 Provider :服务提供者,例如案例中的 user-service 注册自己的信息到 EurekaS…

解决vue项目,运行npm install安装报缺少c++库问题

项目是前后端分离架构,前端使用的是vue框架,在部署前端项目时,需要下载安装一些基础的镜像配置,包括一些预处理,但是在使用npm install和yarn install命令时出现了如下错误,查阅资料总结如下: …

WPF(2)命令绑定

效果是&#xff1a;当TextBox控件的Text属性为空时show按钮不可用&#xff0c;有值时show按钮可用 项目结构 界面代码 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://sc…

Flutter ios一键三连脚本

flutter运行ios时总得执行三个命令,中间还得等待&#xff0c;有没有脚本自动执行 ## ios 执行命令 - flutter clean - flutter pub get - cd ios - pod install有&#xff0c;项目根目录创建shell 文件夹&#xff0c;新建setup.sh setup.sh里面放如下代码 #!/bin/bash# ios …

ffmpeg解码和渲染理解

ffmpeg解码和渲染理解 ffmpeg视频解码步骤 FFmpeg 是一个功能强大的跨平台多媒体处理工具&#xff0c;包含了音视频编解码、封装/解封装、过滤器等功能。下面是一般情况下使用 FFmpeg 进行视频解码的步骤&#xff1a; 初始化 FFmpeg 库&#xff1a;首先需要初始化 FFmpeg 库&a…