STM32F4之看门狗

1、 看门狗作用

单片机复位的方式:硬件复位 -- reset按键

上电复位 -- 电容

看门狗复位

看门狗的复位功能主要是用于一些平常难以操作的场合去帮助我们进行复位操作。当你单片机突然死机或者程序跑飞了,看门狗就可以检测得到并且及时帮你复位。看门狗也可以帮助提高系统的可靠性。看门狗本质就是一个计数器。

2、STM32的看门狗分类

此器件具有两个嵌入式看门狗外设,具有安全性高、定时准确及使用灵活的优点。两个看门狗外设(独立和窗口)均可用于检测并解决由软件错误导致的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。独立看门狗 (IWDG) 由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持工作状态。窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序

3、独立看门狗

STM32独立看门狗简介

自由运行递减计数器
时钟由独立 RC 振荡器提供(可在待机和停止模式下运行)

当递减计数器值达到 0x000 时产生复位(如果看门狗已激活)

当通过对关键字寄存器 (IWDG_KR) 写入值 0xCCCC 启动独立看门狗时,计数器开始从复位
值 0xFFF 递减计数。当计数器计数到终值 (0x000) 时会产生一个复位信号( IWDG 复位)。
任何时候将关键字 0xAAAA 写到 IWWDG_KR 寄存器中, IWDG_RLR 的值就会被重载到计
数器,从而避免产生看门狗复位。

看门狗要开始工作:要往IWDG_KR寄存器里写入0xCCCC接下来看门狗就会开始从IWDG_RLR 的值开始递减。如果一直减到0都没有给它写入0xAAAA,就会产生一次复位,此时来指示当前系统出问题了。这个总体的时间是可以自己决定的。

看门狗饿了,就要喂它,不喂它就咬你

 独立看门狗框架

独立看门狗寄存器

IWDG_PR和IWDG_RLR是受到写保护的

要解除写保护就要往KR寄存器里写入0x5555的值

频率是在30kHZ到60kHZ之间变化:

Psc:4分频, RLR:1000

最早喂狗时间:4 / 60000 * 1000= 66.7ms

最晚喂狗时间:4 / 30000 * 1000 = 132ms

喂狗时间应该挑早喂的

解除写保护(往KR寄存器写0x5555)

预分频值(往PR寄存器写值)

重装载值(往RLR寄存器写值)

先让重装载值加载到计数器里(往KR寄存器写0xaaaa)

启动看门狗(往KR寄存器写0xcccc)

#include "iwdg.h"
/************************************
函数功能:独立看门狗的初始化
函数形参:u8 prer, u16 rlr
函数返回值:void
函数说明:
作者:
日期:
************************************/
void IWDG_Init(u8 prer, u16 rlr)
{
	//解除写保护
	IWDG->KR = 0X5555;
	//预分频值(往PR寄存器写值)
	IWDG->PR = 0;
	//重装载值(往RLR寄存器写值)
	IWDG->RLR = 5000;
	//启动看门狗
	IWDG->KR = 0XCCCC;
}

4、窗口看门狗

窗口看门狗特征

窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位(过晚喂狗)。如果在递减计数器达到窗口寄存器值之前刷新控制寄存器中的 7 位递减计数器值,也会产生 MCU 复位(过早喂狗)。这意味着必须在限定的时间窗口内刷新计数器

可编程的自由运行递减计数器
    复位条件
       
当递减计数器值小于 0x40 时复位(如果看门狗已激活)--过晚喂狗
       
在窗口之外重载递减计数器时复位(如果看门狗已激活)-- 过早喂狗
   
提前唤醒中断 (EWI):当递减计数器等于 0x40 时触发(如果已使能且看门狗已激活)

 窗口看门狗框架

Twwdg = 42M*4096 * 8 -- 代表每减一次的时间

当前从0x7f开始递减到0x40所需要的时间

现在如果是8分频,则每减一次的时间是:0.00078s = 0.78ms = 780us

窗口看门狗寄存器

位7:代表使能窗口看门狗

位6:0--计数器的值

位9:代表使能窗口看门狗的中断

位8:7 -- 代表当前的分频值

位6:0 -- 代表需要设置的窗口值

进入中断就需要靠这个标志位

不用中断这个标志位也会置1,只是不会进入中断服务函数

打开WWDG的时钟

写入分频值(CFR寄存器里的WDGTB)--决定记一次数的时间

写入重装载值(CR寄存器里的0-6位)

设置窗口值

使能窗口看门狗的中断

配置优先级

核心响应中断

使能看门狗

编写中断服务函数

注意:使用窗口值的时候,需要把CR1寄存的相关操作提前到设置窗口值之前,否则就会一直复位,

#include "wwdg.h"
/************************************
函数功能:窗口看门狗的初始化
函数形参:u8 prer, u16 rlr
函数返回值:void
函数说明:选择8分频,每减一次需要78us
	Twwdg = 42M*4096*8----代表每减一次的时间
	当前从0x7f降到0x40所需的时间
	现在如果是八分频,则没减一次的时间是0.00078s = 0.78 ms = 78us
作者:
日期:
************************************/
void WWDG_Init(void)
{
	//1.打开WWDG时钟
	RCC->APB1ENR |= 0X1 << 11;
    //2. 写入分频值(往PR寄存器写值)
	WWDG->CFR |= 0x3 << 7;

    //3. 写入重装载值(往CR寄存器写值)
	WWDG->CR |= 0X7F;
	//8. 使能窗口看门狗
	WWDG->CR |= 0X1 << 7;
    //4. 设置窗口值
	WWDG->CFR &= ~(0X7F<<0);
	WWDG->CFR |= 0X6F<<0;

    //5. 使能窗口看门狗的中断
	WWDG->CFR |= 0X1 << 9;
    //6. 配置中断优先级
	NVIC_SetPriority(WWDG_IRQn,NVIC_EncodePriority(7-2,1,1));
    //7. 使能核心响应中断
	NVIC_EnableIRQ(WWDG_IRQn);


}	
//10. 编写中断服务函数
void WWDG_IRQHandler(void)
{
	//清零操作
	WWDG->SR &= ~(0X1 << 0);
	WWDG->CR |= 0X7F;
	printf("窗口看门狗\r\n");
}
/************************************
函数功能:喂窗口看门狗
函数形参:void
函数返回值:void
函数说明:
	
作者:
日期:
************************************/
void WWDG_feed(void)
{
	WWDG->CR |= 0X7F;//喂狗
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WorkPlus即时通讯app:10分钟快速搭建,支持局域网私有化部署!

随着数字通讯的飞速发展&#xff0c;“IM办公”模式被越来越多的政企组织所接受和采用。然而&#xff0c;公有云IM服务的信息安全问题时有发生&#xff0c;这使得一些政府部门和事业单位对此存在着爱恨交加的复杂心态。在这样的背景下&#xff0c;私有化IM作为一种解决方案逐渐…

C 用户定义函数

C 用户定义函数 在本教程中&#xff0c;您将借助示例学习在C语言编程中创建用户定义的函数。 函数是执行特定任务的代码块。 C允许您根据需要定义函数。这些函数称为用户定义函数。例如&#xff1a; 假设您需要创建一个圆并根据半径和颜色为其着色。您可以创建两个函数来解…

459. 重复的子字符串

459. 重复的子字符串 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;__459重复的子字符串_枚举__459重复的子字符串_字符串匹配__459重复的子字符串_KMP算法__459重复的子字符串_优化的KMP算法 错误经验吸取 原题链接&#xff1a; 459. …

【Mybatis小白从0到90%精讲】16: Mybatis like语句四种传参方式

文章目录 前言方式一:Java代码拼接方式二:MySQL CONCAT函数方式三:Mybatis bind标签方式四:SQL拼接前言 在实际开发中,SQL中使用 模糊查询like使用非常普遍,在MyBatis中,为了防止SQL注入攻击,可以使用#{}来传递参数,切记like语句不要使用${}的方式! 这里我总结了 四…

【彻底搞懂C指针 】Malloc 和 Free 的具体实现 (笔记)

【彻底搞懂C指针】Malloc 和 Free 的具体实现 https://danluu.com/malloc-tutorial/ 进程间的通信 : ①共享内存 ② 消息传递 &#xff08;内核实现&#xff09; 分配策略 (实现方面) by DUCK sbrk() malocal实现的主要函数 man sbrk 查看 数据结构 一个参考代码 https…

(离散数学)逻辑连接词

异或可以理解为不同为1相同为0 P->Q的前件和后件满足0->1的其中一个就为真 <—>可以看做 &#xff0c;相同为1不同为0 异或与等价相反

计算机课设python项目matplotlib数据可视化分析代码以及数据文档+自动化selenium实现boss网站爬虫代码

这是一个数据分析可视化课程的结课作业设计&#xff0c;受人所托写的&#xff0c;现在分享出来&#xff0c;有需要的同学自取哈&#xff0c;以下是文件目录&#xff0c;包括数据分析和爬虫代码都有&#xff0c;下载下来当一个demo也还是不错的&#xff0c;这篇博客就是文档里的…

灰度与二值化

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

c++ 模拟进制之间的转换

c 模拟进制之间的转换 废话少说&#xff0c;直接上图 效果图 短除法 思想 过程 1 十进制 转 二进制 > 短除法 2 十进制 转 八进制 > 短除法 3 十进制 转 十六进制 > 短除法4 二进制 转 十进制 5 二进制 转 八进制 可以先将 二进制 转成 十进制&#xff0c;然…

Java继承和多态(1)

&#x1f435;本主题将分为篇文章&#xff0c;本篇文章将主要对继承进行讲解 一、介绍继承 1.1 什么是继承 假如有两个类&#xff1a;A类和B类&#xff0c;A类在保持原有成员变量和方法的基础上可以使用B类的成员变量和方法&#xff0c;此时就称A类继承了B类&#xff0c;A类为…

微信公众号历史文章采集教程思路

大家好&#xff0c;我是淘小白&#xff01; 今天来说下微信公众号历史记录文章采集的教程和思路&#xff0c;希望能够帮助的到大家~ 1、历史消息入口 现在新版本的微信已经找不到历史记录的入口了&#xff0c;需要对这个入口进行拼接&#xff0c;方法如下&#xff1a; 随便…

适用于初学者的 .NET MAUI

适用于初学者的 .NET MAUI | Microsoft Learn 记录微软Learn中用到的代码。文章比较粗糙&#xff0c;大部分是项目代码粘贴。想详细学习的可到上面的链接学习&#xff0c;代码可以从这里复制后直接运行。 练习中一共有两个页面&#xff1a; 1、MainPage.xaml 用于添加列表中的…

【Python】Matplotlib-多张图像的显示

一&#xff0c;情景描述 大家在写论文或者实验报告的时候&#xff0c;经常会放多张图片或数据图像在一起形成对比。比如&#xff0c;我现在有一张经过椒盐噪声处理的图像&#xff0c;现在进行三种滤波&#xff0c;分别是均值&#xff0c;高斯&#xff0c;中值滤波&#xff0c;…

3.HTML中语法规范

3. HTML语法规范 3.1 基本语法概述 3.1.1 HTML标签 1 HTML 标签是由尖括号包围的关键字&#xff0c;例如<html>。 2. HTML 标签通常是成对出现的&#xff0c;例如<html>和</html>,我们称为双标签。标签对中的第一个标签是开始标签&#xff0c;第二个标签是…

74hc595模块参考

74hc595模块参考 8位串行并行输出&#xff08;SIPO&#xff09;移位寄存器 使用74HC595移位寄存器扩展微控制器上的输出引脚数量。如果你需要扩充输入引脚的数量那么你需要74HC165移位寄存器。 SER&#xff08;串行输入&#xff09;引脚用于一次一位地将数据发送到移位寄存器…

Leetcode—107.二叉树的层序遍历II【中等】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—107.二叉树的层序遍历II 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullpt…

【Delphi】 各个平台使用 ntfy 效果说明

目录 一、Delphi 中使用 ntfy 库下载地址 二、各个平台使用效果说明 1. android 平台 2. ios 平台 3. windows 平台 三、总结 一、Delphi 中使用 ntfy 库下载地址 官方的文档地址&#xff1a;ntfyDelphi 接口库地址&#xff1a;GitHub - hazzelnuts/ntfy-for-delphi at …

DevChat全能型AI编程助手,助你“以一敌三卷翻好友”

DevChat全能型AI编程助手&#xff0c;助你“以一敌三卷翻好友” 什么是DevChat&#xff0c;它能帮助我们做什么&#xff1f; DevChat是OpenAI的一个产品&#xff0c;它是一个可以进行编程相关对话的AI。这意味着你可以使用它来解决一些编程上的问题或者获取关于编程的建议。 …

Radius是什么意思? 安当加密

Radius是什么意思&#xff1f; RADIUS&#xff08;Remote Authentication Dial In User Service&#xff09;是一种远程用户拨号认证系统&#xff0c;它由RFC 2865和RFC 2866定义&#xff0c;是应用最广泛的AAA&#xff08;Authentication、Authorization、Accounting&#xf…

MySQL中外键的使用及外键约束策略

一、外键约束的概念 外键约束&#xff08;FOREIGN KEY,缩写FK是数据库设计的一个概念&#xff0c;它确保在两个表之间的关系保持数据的一致性和完整性。 外键是指表中的某个字段的依赖于另一张表中某个字段的值&#xff0c;而被依赖的字段必须具有主键约束或者唯一约束&#…