STM32 IWDG(独立看门狗)

news2024/11/27 11:46:07

1 IWDG简介

STM32有两个看门狗:一个是独立看门狗(IWDG),另外一个是窗口看门狗。独立看门狗也称宠物狗,窗口看门狗也称警犬。本文主要分析独立看门狗的功能和它的应用。

独立看门狗用通俗一点的话来解释就是一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数器没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的“喂狗”。看门狗功能由VDD供电,在停止模式和待机模式下仍能工作。

2 IWDG功能框图剖析

IWDG功能框图如下图所示:

2.1 独立看门狗时钟

独立看门狗的时钟由独立的RC震荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。LSI的频率一般为30~60kHz,根据温度和工作场合情况有一定的漂移。我们一般取40kHz,所以独立看门狗的定时时间不是非常精确,只适用于对时间精度要求比较低的场合。

2.2 计数器时钟

递减计数器的时钟由LSI经过一个8位的预分频器得到,我们可以操作预分频器寄存器IWDG_PR来设置分频因子,分频因子可以是:[4,8,16,32,64,128,256],计数器时钟CK_CNT=40/4×2^PRV,一个计数器时钟周期计数器就减一。

2.3 计数器

独立看门狗的计数器是一个12位的递减计数器,最大值为0XFFF。当计数器减到0时,会产生一个复位信号IWDG_RESET,让程序重新启动运行。如果在计数器减到0之前刷新了计数器的值的话,就不会产生复位信号,重新刷新计数器值的这个动作俗称“喂狗”。

2.4 重装载寄存器

重装载寄存器是一个12位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定独立看门狗的溢出时间。超时时间Tout=(4×2^prv)/40×rlv(s),prv是预分频器寄存器的值,rlv是重装载寄存器的值。

2.5键寄存器

键寄存器IWDG_KR可以说是独立看门狗的一个控制寄存器,主要有三种控制方式,往这个寄存器写入下面3个不同的值有不同的效果。

键寄存器取值枚举
键值键值作用
0XAAAA把RLR的值重装载到CNT
0X5555PR和RLR这两个寄存器可写
0XCCCC启动 IWDG

通过写往键寄存器写0XCCCC来启动看门狗属于软件启动的方式,一旦独立看门狗启动,它就关不掉,只有复位才能关掉它。

2.6 状态寄存器

状态寄存器SR只有位0,PVU和位1:RVU有效,这两位只能由硬件操作,软件操作不了。

RVU:看门狗计数器重装载值更新,硬件置1表示重装载值的更新正在进行中,更新完毕之后由硬件清0.

PVU:看门狗预分频值更新,硬件置1指示预分频值的更新正在进行中,当更新完成后,由硬件清0。

所以只有当RVU、PVU都等于0的时候,才可以更新重装载寄存器和预分频寄存器。

3 如何使用IWDG

独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序50ms多一点。如果超过60ms还没有喂狗,那就说明我们的监控程序出故障了,运行出意外了,那么就会产生系统复位,让程序重新运行。

3.1 IWDG 配置函数

void IWDG_Config(uint8_t prv,uint16_t rlv)
{
    //使能预分频寄存器PR和重装载寄存器RLR可写
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

    //设置预分频器值
    IWDG_SetPrescaler(prv);

    //设置重装载寄存器值
    IWDG_RetReload(rlv);

    //把重装载寄存器的值放到计数器中
    IWDG_ReloadCounter();

    //使能IWDG
    IWDG_Enable();

}

IWDG配置函数有两个形参,prv用来设置预分频的值,可取值如下:

/*
*    @arg IWDG_Prescaler_4:      IWDG 预分频值设置为4
*    @arg IWDG_Prescaler_8:      IWDG 预分频值设置为8
*    @arg IWDG_Prescaler_16:     IWDG 预分频值设置为16
*    @arg IWDG_Prescaler_32:     IWDG 预分频值设置为32
*    @arg IWDG_Prescaler_64:     IWDG 预分频值设置为64
*    @arg IWDG_Prescaler_128:    IWDG 预分频值设置为128
*    @arg IWDG_Prescaler_256:    IWDG 预分频值设置为256
*/

如果我们需要设置1s的超时溢出,prv可以取IWDG_Prescaler_64,rlv取625,即调用IWDG使得Tout=64/40*625=1s。

3.2 喂狗函数

void IWDG_Feed(void)
(
    //把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位
    //当计数器的值减到0的时候会产生系统复位
    IWDG_ReloadCounter();
)

3.3 main函数

int main(void)
{
    //配置LED GPIO,并关闭LED
    LED_GPIO_Config();

    Delay(0X8FFFFF);
    //——————————————————————————————————————————————————————————
    //检查是否为独立看门狗复位
    if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)!=RESET)
    {
        //独立看门狗复位
        //亮红灯
        LED_RED;

        //清除标志
        RCC_ClearFlag();

        //如果一直不能喂狗,会一直复位,加上前面的延时,会看到红灯闪烁
        //在1s时间内喂狗的话,则会持续亮绿灯
    }
    else
    {
        //不是看门狗复位(可能为上电复位或者手动按键复位之类的操作)
        //亮蓝灯
        LED_BLUE;
    }
    //————————————————————————————————————————————————————————————
    //配置按键GPIO
    Key_GPIO_Config();
    //IWDG 1s超时溢出
    IWDG_Config(IWDG_Prescaler_64,625);

    //while部分是我们在项目中具体要写的代码,这部分的程序可以用独立看门狗来监控
    //如果我们知道这部分代码执行的时间,比如500ms,那么我们可以设置独立看门狗的溢出时间是600ms
    //比500ms多一点,如果要被监控的程序没出意外,正常执行的话,那么执行完毕之后就会执行喂狗程序
    //如果程序出意外了那程序就会超时,到达不了喂狗的程序,此时就会产生系统复位。
    //但是也不排除程序出意外了又恢复正常了,刚好喂狗了,歪打正着。所以要想更精确得监控程序
    //可以使用窗口看门狗,窗口看门狗规定必须在规定的窗口时间内喂狗
    while(1)
    {
    //这里添加需要被监控的代码,如果有就去掉按键模拟喂狗,把按键扫描程序去掉
    //——————————————————————————————————————————————————————————————
        if(Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==KEY_ON)
        {
            //喂狗,如果不喂狗,系统就会复位,LED1就会灭一次
            //如果在1s时间内准时喂狗的话,则绿灯会亮,否则红灯闪烁
            IWDG_Feed();
            //喂狗后亮绿灯
            LED_GREEN;
        }
    }
    //———————————————————————————————————————————————————————————————
}

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

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

相关文章

访问外网的安全保障——反向沙箱

反向沙箱作为一种网络安全技术,其核心理念在于通过构建一个隔离且受控的环境,来有效阻止潜在的网络威胁对真实系统的影响。在当今日益复杂的网络环境中,如何借助反向沙箱实现安全上网,已成为众多用户关注的焦点。 随着信息化的发…

解决ubuntu18.04 安装vscode 报依赖库错误,以及打不开终端的问题。

其实很简单,ubuntu18.04太老了,官网最新版本的vscode对ubuntu18.04会有些依赖库的问题。 一顿查资料后发现2023.11月的1.85版本正常使用,于是完美解决。 下载链接 Visual Studio Code November 2023 点击这里下载。 下载完成,…

STM32 I2C总线锁死原因及解决方法

本文介绍STM32 I2C总线锁死原因及解决方法。 在使用STM32 I2C总线操作外设时,有时会遇到I2C总线锁死(I2C总线为Busy状态)的问题,即便复位MCU也无法解决,本文介绍其锁死的原因和解决方法,并给出相应的参考代…

【Redis四】主从复制、哨兵以及Cluster集群

目录 一.主从复制、哨兵、集群的区别 二.Redis主从复制 1.作用 2.原理 3.流程 三.搭建Redis 主从复制 1.源码编译安装以及配置文件修改 1.1.修改 Redis 配置文件(Slave节点操作) 2.验证主从复制 2.1.在Master节点上看日志 2.2.在Master节点上…

学习记录696@网络安全之认证、报文完整性、密钥分发与证书

认证 即通信双方如何认证对方身份。 这种情况存在问题:trudy可以伪造A的IP地址。就算带上密码也可能被截获,用于重放攻击。 解决重放攻击的办法是随机数挑战,每次认证时,B都发一个挑战码给A。A加密后再传给B,如果B…

学习阳明心学,需要下真功夫,持续用功

阳明心学是功夫之学,看到善的就发扬光大,看到恶的就立即改正,这才是真功夫

深度解析RocketMq源码-消费者索引ConsumeQueue

1.绪论 rocketmq的broker中关于消息持久化的组件主要包含三个,分别是:持久化消息到文件中的组件commitLog;根据消息key索引commitLog日志的indexFile;消费者根据topic和queueId查询commitLog日志的consumeQueue。前面已经介绍com…

Logback-打印方法名及代码行号

背景 公司产品使用了logback作为日志输出框架,日志输出的pattern里配置了打印调用方法名及代码行号的配置,但是实际输出的日志方法名总是显示? 在强迫症的驱使下,开启了探秘之旅 Logback版本 1.2.3 项目中Logging.pattern配置如下&#xff1…

51单片机STC89C52RC——11.1 蜂鸣器播放音乐

目录 目的/效果 一,STC单片机模块 二,蜂鸣器 2.1 介绍 2.2 板子位置电路图 2.3 发声原理 2.4 音符和频率 三,创建Keil项目 四,代码 4.1 乐谱代码 4.1.1 《义勇军进行曲》 4.1.2 《天空之城》 4.1.3 《小美满》 4.1.…

6.26.4.3 条件生成对抗和卷积网络用于x射线乳房质量分割和形状分类

一种基于条件生成对抗网络(conditional Generative Adversarial Networks, cGAN)的乳房肿块分割方法。假设cGAN结构非常适合准确地勾勒出质量区域,特别是当训练数据有限时。生成网络学习肿瘤的内在特征,而对抗网络强制分割与基础事实相似。从公开DDSM数据…

【移动应用开发期末复习】第五/六章例题

系列文章 第一章——Android平台概述 第一章例题 第二章——Android开发环境 第二章例题 第三章 第三章例题 第四章 第五/六章 系列文章RadioGroup 是一个Android特有的布局容器,用于包含多个RadioButton组件。当用户选择其中一个RadioButton时,RadioGroup会自动取消其他Rad…

CS-隐藏防朔源-数据转发-iptables(Linux自带的防火墙)

免责声明:本文仅做技术交流与学习... 目录 准备环境: 1-iptables转发机设置转发: 2-CS服务器配置iptables服务器的IP 准备环境: 两台外网服务器. --iptables服务器就是做一个中转...封了中转就没了... 1-iptables转发机设置转发: iptables -I INPUT -p tcp -m tcp --dport 8…

【FFmpeg】avio_open2函数

【FFmpeg】avio_open2函数 1.avio_open21.1 创建URLContext(ffurl_open_whitelist)1.1.1 创建URLContext(ffurl_alloc)1.1.1.1 查找合适的protocol(url_find_protocol)1.1.1.2 为查找到的URLProtocol创建UR…

【前端项目笔记】6 参数管理

参数管理 效果展示: 在开发功能之前先创建分支goods_params cls 清空终端 git branch 查看所有分支 git checkout -b goods_params 新建分支goods_params git push -u origin goods_params 把本地的新分支推送到云端origin并命名为goods_params 参数管理需要维…

报餐小程序可以运用在饭堂的哪方面

随着科技的快速发展,智能化、信息化的管理方式逐渐渗透到我们日常生活的方方面面。在饭堂管理中,报餐小程序的应用为传统的餐饮管理方式带来了革命性的变革。本文将探讨报餐小程序在饭堂管理中的应用及其带来的优势。 一、报餐小程序的基本功能 报餐小程…

GIT 基于master分支创建hotfix分支的操作

基于master分支创建hotfix分支的操作通常遵循以下步骤: 切换到master分支: 首先,确保你的工作区是最新的,并且你在master分支上。如果不在master分支,你需要先切换过去。 Bash git checkout master 拉取最新的master…

鸿蒙开发设备管理:【@ohos.distributedHardware.deviceManager (设备管理)】

设备管理 本模块提供分布式设备管理能力。 系统应用可调用接口实现如下功能: 注册和解除注册设备上下线变化监听发现周边不可信设备认证和取消认证设备查询可信设备列表查询本地设备信息,包括设备名称,设备类型和设备标识 说明&#xff1a…

ATFX汇市:美国5月PCE数据来袭,EURUSD或迎剧烈波动

ATFX汇市:今日20:30,美国商务部将公布5月核心PCE物价指数年率,前值为2.8%,预期值2.6%,预期下降0.2个百分点。PCE数据是美联储进行货币政策决策的重要依据,尤其是核心PCE年率,向下波动会增加降息…

【LeetCode】一、数组相关:双指针算法 + 置换

文章目录 1、算法复杂度1.1 时间复杂度1.2 空间复杂度 2、数组3、leetcode485:最大连续1的个数4、leetcode283:移动05、leetcode27:移除元素 1、算法复杂度 1.1 时间复杂度 算法的执行时间与输入值之间的关系(看代码实际总行数的…

J2EE框架之mybatis学习——连接数据库实现查询操作

J2EE框架之mybatis学习——连接数据库实现查询操作 作业要求: 作者:杨建东 关于具体内容我正准备更新至我的CSDN【被瞧不起的神】也可移步我的公众号【猿小馆】 结合老师的课件和黑马程序员的课程学习。 因为我上课老师已经讲过了基本的概念和理解&a…