STM32 看门狗

目录

背景

独立看门狗(IWDG)

寄存器访问保护

窗口看门狗(WWDG)

程序

独立看门狗

设置独立看门狗程序

第一步、使能对独立看门狗寄存器的写操作

第二步、设置预分频和重装载值

第三步、喂狗

 第四步、使能独立看门狗

喂狗程序​编辑​编辑

 应用实例

窗口看门狗

设置窗口看门狗程序

第一步、使能PCLK1的外设时钟

第二步、设置预分频和窗口值

第三步、使能WWDG

第四步、中断配置(清除中断标识、配置中断优先级、开启中断)

第五步、中断优先级配置

第六步、中断处理函数

第七步、窗口看门狗喂狗

应用实例


背景

看门狗在单片机系统中非常重要,主要用于防止系统死锁、处理软件故障、应对外部干扰和提高系统可靠性。由于单片机系统容易受到外界干扰导致程序跑飞或陷入死循环,看门狗机制能够在程序异常时及时重启系统,避免系统崩溃或数据丢失等严重后果‌,通过本篇文章介绍STM32的看门狗种类,以及如何使用这两种看门狗。

STM32看门狗主要有两种类型:‌独立看门狗(IWDG)‌和‌窗口看门狗(WWDG)‌。

独立看门狗(IWDG)


独立看门狗(IWDG)是STM32系列中常见的看门狗类型之一。它使用一个独立的40kHz低速时钟(LSI),这个时钟源是独立于主系统时钟的(所以不需要像USART等外设一样,使用前使能外设时钟),因此即使在主时钟发生故障时,IWDG仍能正常工作。IWDG通过一个12位的递减计数器工作,当计数器的值减到0时,系统会产生复位信号,重启MCU。用户需要在预定的时间内“喂狗”(即向看门狗寄存器写入一个特定的值),以重置计数器,防止系统复位‌

寄存器访问保护

IWDG_PR IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向
IWDG_KR 寄存器中写入 0x5555 。以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重
新被保护。重装载操作 ( 即写入 0xAAAA) 也会启动写保护功能。
状态寄存器指示预分频值和递减计数器是否正在被更新。


窗口看门狗(WWDG)


窗口看门狗(WWDG)通过APB1时钟分频后得到的时钟驱动。它与IWDG不同,WWDG有一个可配置的时间窗口,用于检测应用程序的运行状态。如果应用程序在这个时间窗口内正常运行,则不会产生复位信号;如果应用程序超出这个时间窗口,则会触发复位信号,重启系统‌

WWDG 简介
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运
行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0 前被刷新,看门狗电路在达到预置
的时间周期时,会产生一个 MCU 复位。在递减计数器达到窗口寄存器数值之前,如果 7位的递减
计数器数值(在控制寄存器中) 被刷新, 那么也将产生一个 MCU 复位。这表明递减计数器需要在
一个有限的时间窗口中被刷新。
WWDG 主要特性
● 可编程的自由运行递减计数器
● 条件复位
当递减计数器的值小于0x40,(若看门狗被启动)则产生复位
当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位 。见 0
如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可
以被用于重装载计数器以避免WWDG复位。
WWDG 功能描述
果看门狗被启动(WWDG_CR寄存器中的WDGA位被置’1’), 并且当7位(T[6:0])递减计数器从
0x40翻转到0x3F(T6位清零)时,则产生一个复位 如果软件在计数器值大于窗口寄存器中的数
值时重新装载计数器,将产生一个复位。

程序

独立看门狗

设置独立看门狗程序

//看门狗定时时间计算公式:Tout=(预分频值*重装载值)/40 (单位:ms)
//当前pre为64,rlr为625,计算得到Tout时间为1秒(大概值)。#define pre		IWDG_Prescaler_64 //分频值范围:4,8,16,32,64,128,256
#define rlr		625 //重装载值范围:0~0xFFF(4095)void IWDG_Init(void){ //初始化独立看门狗IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作IWDG_SetPrescaler(pre); //设置IWDG预分频值IWDG_SetReload(rlr); //设置IWDG重装载值IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器IWDG_Enable(); //使能IWDG
}

独立看门狗时间

Tout=(预分频值*重装载值)/40 (单位:ms)推导过程:独立看门狗独立于stm32主时钟系统(SYSCLK)
是使用40Khz的LSI经过预分频后的频率位 40/预分频值
所以看门狗定时器的看门狗的时间为:(40/(预分频值*重装载值))的倒数!//当前pre为64,rlr为625,计算得到Tout时间为1秒(大概值)

第一步、使能对独立看门狗寄存器的写操作

看函数的定义为:

第二步、设置预分频和重装载值

第三步、喂狗


 

 第四步、使能独立看门狗

喂狗程序

void IWDG_Feed(void){ //喂狗程序IWDG_ReloadCounter();//固件库的喂狗函数
}

 应用实例

窗口看门狗

设置窗口看门狗程序

void WWDG_Init(void){ //初始化窗口看门狗RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能WWDG_SetPrescaler(fprer); //设置 WWDG 预分频值WWDG_SetWindowValue(wr); //设置窗口值WWDG_Enable(WWDG_CNT); //使能看门狗,设置 counterWWDG_ClearFlag(); //清除提前唤醒中断标志位WWDG_NVIC_Init(); //初始化窗口看门狗 NVICWWDG_EnableIT(); //开启窗口看门狗中断
}void WWDG_NVIC_Init(void){ //窗口看门狗中断服务程序(被WWDG_Init调用)NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG 中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占 2 子优先级 3 组 2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占 2,子优先级 3,组 2NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure); //NVIC 初始化
}void WWDG_Feed(void){ //窗口喂狗程序WWDG_SetCounter(WWDG_CNT); //固件库的喂狗函数
}void WWDG_IRQHandler(void){	//窗口看门狗中断处理程序WWDG_ClearFlag(); //清除提前唤醒中断标志位//此处加入在复位前需要处理的工作或保存数据
}

第一步、使能PCLK1的外设时钟

第二步、设置预分频和窗口值

//窗口看门狗定时时间计算公式:
//上窗口超时时间(单位us) = 4096*预分频值*(计数器初始值-窗口值)/APB1时钟频率(单位MHz)
//下窗口超时时间(单位us) = 4096*预分频值*(计数器初始值-0x40)/APB1时钟频率(单位MHz)#define WWDG_CNT	0x7F //计数器初始值,范围:0x40~0x7F
#define wr		0x50 //窗口值,范围:0x40~0x7F
#define fprer	WWDG_Prescaler_8 //预分频值,取值:1,2,4,8个人认为在计算超时时间时候:
计数器初始值-窗口上界值 + 1
计数器初始值-窗口下界值 + 1

第三步、使能WWDG

第四步、中断配置(清除中断标识、配置中断优先级、开启中断)

第五步、中断优先级配置

void WWDG_NVIC_Init(void){ //窗口看门狗中断服务程序(被WWDG_Init调用)NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG 中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占 2 子优先级 3 组 2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占 2,子优先级 3,组 2NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure); //NVIC 初始化
}

第六步、中断处理函数

void WWDG_IRQHandler(void){	//窗口看门狗中断处理程序WWDG_ClearFlag(); //清除提前唤醒中断标志位//此处加入在复位前需要处理的工作或保存数据
}

第七步、窗口看门狗喂狗

void WWDG_Feed(void){ //窗口喂狗程序WWDG_SetCounter(WWDG_CNT); //固件库的喂狗函数
}


应用实例

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

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

相关文章

LLM论文笔记 15: Transformers Can Achieve Length Generalization But Not Robustly

Arxiv日期:2024.2.14机构:Google DeepMind / University of Toronto 关键词 长度泛化位置编码数据格式 核心结论 1. 实验结论:十进制加法任务上的长度泛化最佳组合: FIRE位置编码 随机化位置编码 反向数据格式 索引提示&…

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么?2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID(用于位置环)(1)公式(2)代码使用代码 2. 增量式…

【Linux探索学习】第二十八弹——信号(下):信号在内核中的处理及信号捕捉详解

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在前面我们已经学习了有关信号的一些基本的知识点,包括:信号的概念、信号产生和信号处理等,今天我们重…

Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件

一.类的介绍 1.QPdfWriter介绍 Qt中提供了一个直接可以处理PDF的类,这就是QPdfWriter类。 (1)PDF文件生成 支持创建新的PDF文件或覆盖已有文件,通过构造函数直接绑定文件路径或QFile对象; 默认生成矢量图形PDF&#…

快速上手gdb/cgdb

Linux调试器-gdb使用 1.背景2.调试原理、技巧命令2.1指令2.2 本质2.3 技巧 1.背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g…

linux网络编程(1.5w字+内部程序理解网络)

目录 核心大图: 网络字节序 网络字节序与主机字节序 地址转换函数 一、inet_ntoa函数 二、inet_aton函数 三、inet_aton和inet_ntoa的测试 in_addr转字符串的函数: socket编程接口 socket 常见API 1.socket 参数1:int af 参数2:…

windows环境下用docker搭建php开发环境dnmp

安装WSL WSL即Linux子系统,比虚拟机占用资源少,安装的前提是系统必须是win10以上。 WSL的安装比较简单,网上有很多教程,例如:WSL简介与安装流程(Windows 下的 Linux 子系统)_wsl安装-CSDN博客&…

Nginx之rewrite重写功能

目录 一、rewrite概述 1、rewrite功能 2、跳转场景 二、标准配置指令 1、rewrite日志记录指令 2、未初始化变量告警日志记录指令 3、rewrite 指令 3.1 正则表达式 三、rewrite模块使用实例 1.基于域名的跳转 2.基于客户端 IP 访问跳转 3.?基于旧域名跳转到新域名后…

Mybatis(一)

配置文件 必要的用户密码要修改, 还有绿色线的名字要修改成数据库的 配置文件直接cv 创建 复习之前的知识进行分层处理 与前面一一对应, 后面三个发现后面输出是null, 没有一一对应, 后面再解释解决方法 运行发现, 输出正常 idea的测试类 两个注解了解 记得加上这个, 不然无…

一周学会Flask3 Python Web开发-http响应状态码

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Flask程序中,客户端发出的请求触发相应的视图函数,获取返回值会作为响应的主体,最后生成…

七星棋牌源码高阶技术指南:6端互通、200+子游戏玩法深度剖析与企业级搭建实战(完全开源)

在棋牌游戏行业高速发展的今天,如何构建一个具备高并发、强稳定性与多功能支持的棋牌游戏系统成为众多开发者和运营团队关注的焦点。七星棋牌全开源修复版源码 凭借其 六端互通、200子游戏玩法、多省区本地化支持,以及 乐豆系统、防沉迷、比赛场、AI智能…

C++和OpenGL实现3D游戏编程【总览】

欢迎来到zhooyu的游戏专栏。 主页网址:【zhooyu】 专栏网址:【C和OpenGL实现3D游戏编程】 🌟🌟🌟这里将通过一个OpenGL实现3D游戏编程实例教程,带大家深入学习OpenGL知识。知识无穷而人力有穷,…

pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网

首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话,那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm:适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…

GPT-Sovits:语音克隆训练-遇坑解决

前言 本来以为3050完全无法执行GPT-Sovits训练的,但经过实践发现其实是可以,并且仅花费了十数分钟便成功训练和推理验证了自己的语音模型。 官方笔记:GPT-SoVITS指南 语雀 项目地址:https://github.com/RVC-Boss/GPT-SoVITS 本人…

8 SpringBootWeb案例(上): 查询【分页功能(分页插件)】、删除、新增、修改

文章目录 前言:SpringBootWeb案例1. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建1.2 开发规范1.2.1 开发规范-REST(不强求非要这种风格,传统风格有时候更方便)1.2.2 开发规范-统一响应结果和异常处理1.2.3 开发流程2. 部门管理2.1 查询部门2.1.1 原型和需求…

深入了解 DevOps 基础架构:可追溯性的关键作用

在当今竞争激烈的软件环境中,快速交付强大的应用程序至关重要。尽管如此,在不影响质量的情况下保持速度可能是一项艰巨的任务,这就是 DevOps 中的可追溯性发挥作用的地方。通过提供软件开发生命周期 (SDLC) 的透明视图…

用C++ Qt实现安卓电池充电动效 | 打造工业级电量控件

一、为什么需要自定义电池控件? 在工业控制、车机系统、智能硬件等领域的UI开发中,电池状态显示是高频出现的UI组件。通过实现一个支持颜色渐变、动态充电动画、警戒阈值提示的电池控件,开发者可以系统掌握以下核心能力: Qt绘图…

一批起飞猪名单配图

好久没有使用风口猪选股指标了,今天去玩了一把,发现起飞猪指标显示了好多一批猪票 华曙高科 汉威科技 双林股份 曼恩斯特 长盈精密 江苏雷利 双飞集团 奥飞数据 硅宝科技 水晶光电 长盈精密

机器学习笔记——常用损失函数

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本笔记介绍机器学习中常见的损失函数和代价函数,各函数的使用场景。 热门专栏 机器学习 机器学习笔记合集 深度学习 深度学习笔记合集 文章目录 热门…

Ubuntu 服务器Llama Factory 搭建DeepSeek-R1微调训练环境

1.首先了解一下什么是LLM微调 LLM 微调指的是在已经预训练好的大型语言模型基础上,使用特定的任务数据或领域数据,通过进一步的训练来调整模型的参数,使其在特定任务或领域上能够表现得更好。简单来说,就是对一个已经具备了丰富语…