STM32第5章、IWDG

一、简介

        IWDG:全称是Independent  watchdog,即独立看门狗。本质上是一个能产生系统复位信号的计数器。

        特性:

                是一个递减计数器。

                时钟信号由独立的RC振荡器提供,可在待机和停止模式下运行。

                看门狗被激活后,当递减计数器计数到0x000时产生系统复位信号。

        喂狗操作:在计数器计数到0x000之前,重新装载计数器的值,使得计数器从新装载的值重新开始计数,以防止系统复位,这一过程就叫做喂狗。

        作用:

                由于外界电磁干扰或者自身系统(硬件或软件)异常,会造成程序跑飞,如:陷入某个不正常的死循环,打断正常的程序运行。

                IWDG解决的问题就是:由于外界电磁干扰或硬件异常导致的程序跑飞问题。

        应用:

                IWDG主要应用于一些需要高稳定性的产品中,并且对时间精度要求较低的场合。

二、工作原理        

        时钟源(Src  CLK)经过预分频器后得到看门狗时钟(IWDG CLK),看门狗时钟为递减计数器提供时钟信号。

        重装载寄存器为递减计数器提供开始计数的值,喂狗操作就是在递减计数器的值减到0之前,将重装载寄存器的值重新加载给递减计数器。

        看门狗被激活后,每发生一个IWDG  CLK,递减计数器的值就会减1,直到减到0时,将会产生复位信号。

三、功能框图        

1. 时钟信号

        时钟源:

                LSI是时钟源。

                LSI时钟频率并不精确,例如:F1用40kHz,F4/F7/H7用32kHz。

                启用IWDG后,LSI时钟会自动开启。

        IWDG时钟:

                由时钟源LSI经过预分频器分频后得到的时钟频率,就是IWDG的时钟。

                IWDG时钟为递减计数器提供时钟信号,每发生一个IWDG时钟,递减计数器的值就会减1。

2. 重装载值&递减计数器

        重装载寄存器低12位有效,因此重装载值的最大值为:2^12 = 4096。

        重装载值为递减计数器提供初始值,递减计数器从初始值开始,每发生一次IWDG时钟信号,数值就会减1。若无喂狗操作时,当递减计数器值减到0时,就会产生复位信号;如有喂狗操作(将重装载值重新加载给递减计数器)时,递减计数器在喂狗操作后就会从新的初始值(拿到的新的重装载值)重新开始计数。

3. 寄存器

        3.1 密钥寄存器                

                0xAAAA:进行喂狗。

                0x5555:解除PR和RLR寄存器写访问保护。

                0xCCCC:启动看门狗开始工作。

        3.2 重装载寄存器                

                用于存放重装载值,低12位有效,即最大值为4096。

                只有在KR寄存器中解除对RLR寄存器的写访问保护后,才能对该寄存器写入重装载值。

        3.3 状态寄存器                

                用于判断预分频值和重装载值是否已经被更新。

        3.4 预分频寄存器                

四、溢出时间计算

1. 公式        

2. 最短最长溢出时间计算

五、开发流程

1. 开发步骤        

2. 函数详解

        2.1 HAL_IWDG_Init()函数

                功能:

                        设置预分频系数和重装载值,并使能IWDG。

                函数原型:

                        HAL_StatusTypeDef   HAL_IWDG_Init(IWDG_HandleTypeDef   *hiwdg);

                参数:

                        hiwdg:IWDG句柄。                                

                                typedef struct
                                {
                                          IWDG_TypeDef    *Instance;    /* IWDG寄存器基地址 */

                                          IWDG_InitTypeDef    Init;         /* IWDG初始化 */
                                } IWDG_HandleTypeDef;

                                typedef struct
                                {
                                          uint32_t   Prescaler;    /* 预分频系数 */

                                          uint32_t   Reload;       /* 重装载值 */

                                } IWDG_InitTypeDef;

                返回值:

                        typedef enum
                        {
                                HAL_OK             = 0x00U,         /* 成功 */
                                HAL_ERROR     = 0x01U,         /* 失败 */
                                HAL_BUSY        = 0x02U,         /* 忙碌 */
                                HAL_TIMEOUT  = 0x03U          /* 超时 */
                        } HAL_StatusTypeDef;

                相关寄存器:

                        IWDG_PR、

                        IWDG_RLR、

                        IWDG_KR。

        2.2 HAL_IWDG_Refresh()函数

                功能:

                        把重装载寄存器的值加载到递减计数器中,进行喂狗操作。

                函数原型:

                        HAL_StatusTypeDef   HAL_IWDG_Refresh(IWDG_HandleTypeDef   *hiwdg);

                参数:

                        hiwdg:IWDG句柄。                                

                返回值:

                        typedef enum
                        {
                                HAL_OK             = 0x00U,         /* 成功 */
                                HAL_ERROR     = 0x01U,         /* 失败 */
                                HAL_BUSY        = 0x02U,         /* 忙碌 */
                                HAL_TIMEOUT  = 0x03U          /* 超时 */
                        } HAL_StatusTypeDef;

                相关寄存器:

                        IWDG_KR。

六、编程实战

1. 思路        

2. 代码

        iwdg.c文件

#include "./BSP/WDG/wdg.h"


IWDG_HandleTypeDef g_iwdg_handle;

/* IWDG初始化函数 */
void iwdg_init(uint8_t prer, uint16_t rlr)
{
    g_iwdg_handle.Instance = IWDG;
    g_iwdg_handle.Init.Prescaler = prer;
    g_iwdg_handle.Init.Reload = rlr;
    HAL_IWDG_Init(&g_iwdg_handle);
}

/* 喂狗函数 */
void iwdg_feed(void)
{
    HAL_IWDG_Refresh(&g_iwdg_handle);
}


        main.c文件

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/WDG/wdg.h"


int main(void)
{
    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟为72Mhz */
    delay_init(72);                         /* 延时初始化 */
    usart_init(115200);                     /* 串口初始化为115200 */
    
    printf("您还没喂狗,请及时喂狗!!!\r\n");
    iwdg_init(IWDG_PRESCALER_32, 1250);     /* 预分频系数为32,重装载值为1250,溢出时间约为1s */
    while (1)
    {
        delay_ms(1000);
        iwdg_feed();
        printf("已经喂狗\r\n");
    }
}



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

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

相关文章

快速上手 HarmonyOS 应用开发

一、DevEco Studio 安装与配置 1. DevEco Studio 简介 DevEco Studio 是 HarmonyOS 的一站式集成开发环境(IDE),提供了丰富的工具和功能,支持 HarmonyOS 应用开发的全流程。 2. DevEco Studio 下载与安装 下载地址&#xff1a…

ThinkPHP 8的一对一关联

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

像JSONDecodeError: Extra data: line 2 column 1 (char 134)这样的问题怎么解决

问题介绍 今天处理返回的 JSON 的时候,出现了下面这样的问题: 处理这种问题的时候,首先你要看一下当前的字符串格式是啥样的,比如我查看后发现是下面这样的: 会发现这个字符串中间没有逗号,也就是此时的J…

国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)

1 扩展脚本:在当前文件目录下新建同类型文件 1.1 应用场景 用户在进行编程语言学习时,比如:Python,经常做完一个小练习后,又需要新建一个文件,在新建文件的时候,不但要选择文件类型&#xff0c…

Java+Maven+GDAL

下载已经编译好的压缩包,下载地址 解压 jar 包 release-1930-x64-dev.zip\release-1930-x64\bin\gdal\java 目录下 打成Maven依赖 mvn install:install-file -Dfilegdal-3.10.1.jar -DgroupIdorg.gdal -DartifactIdgdal -Dversion3.10.1 -Dpackagingjar -Dgener…

个人主页搭建全流程(Nginx部署+SSL配置+DCDN加速)

前言 最近开始准备秋招,打算做一个个人主页,以便在秋招市场上更有竞争力。 目前,现有的一些搭建主页的博文教程存在以下一些问题: 使用Github Page进行部署,这在国内访问容易受阻使用宝塔面板等框架,功能…

【Linux探索学习】第二十五弹——动静态库:Linux 中静态库与动态库的详细解析

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在 Linux 系统中,静态库和动态库是开发中常见的两种库文件类型。它们在编译、链接、内存管理以及程序的性能和可维护性方面有着…

【Rust自学】12.4. 重构 Pt.2:错误处理

12.4.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数读取…

算法-贪心算法简单介绍

下面是贪心算法视频课的导学内容. 目录 1. 什么是贪心算法?2. 贪心算法简单的三个例子:1. 找零问题2. 最小路径和问题3. 背包问题 3. 贪心算法的特点4. 贪心算法学习的方式? 1. 什么是贪心算法? 简单来说, 我们称以局部最优进而使得全局最优的一种思想实现出来的算法为贪心…

Node.js - Express框架

1. 介绍 Express 是一个基于 Node.js 的 Web 应用程序框架,主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一,具有轻量级、灵活和功能丰富的特点。 核心概念包括路由,中间件,请求与响应&a…

day08_Kafka

文章目录 day08_Kafka课程笔记一、今日课程内容一、消息队列(了解)**为什么消息队列就像是“数据的快递员”?****实际意义**1、产生背景2、消息队列介绍2.1 常见的消息队列产品2.2 应用场景2.3 消息队列中两种消息模型 二、Kafka的基本介绍1、…

459. 重复的子字符串【力扣】——kmp拼接字符串解法

常规kmp解答 class Solution { public:void getNext(int *next,string s){int j0;next[0]0;for(int i1;i<s.size();i){while(j>0 && s[i]!s[j]){jnext[j-1];}if(s[i]s[j]) j;next[i]j;}}bool repeatedSubstringPattern(string s) {if(s.size()0) return false;i…

浅谈云计算06 | 云管理系统架构

云管理系统架构 一、云管理系统架构&#xff08;一&#xff09;远程管理系统&#xff08;二&#xff09;资源管理系统&#xff08;三&#xff09;SLA 管理系统&#xff08;四&#xff09;计费管理系统 二、安全与可靠性保障&#xff08;一&#xff09;数据安全防线&#xff08;…

【STM32】HAL库USB实现软件升级DFU的功能操作及配置

【STM32】HAL库USB实现软件升级DFU的功能操作及配置 文章目录 DFUHAL库的DFU配置修改代码添加条件判断和跳转代码段DFU烧录附录&#xff1a;Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作位带代码位带宏…

PHP答题考试系统

&#x1f50d; 这是一款由PHP与Uniapp强强联手打造的小程序答题考试系统&#xff0c;它如同智慧教育领域中的一颗璀璨明珠&#xff0c;凭借其强大的功能和灵活多变的应用&#xff0c;牢牢吸引了无数求知者的目光。系统全面覆盖了多种试题类型&#xff0c;从基础易懂的判断题、单…

瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 视频硬件编解码-代码版

前言 在上一篇文章中&#xff0c;我们讲解了如何使用 ffmpeg-rockchip 通过命令来实现 MPP 视频硬件编解码和 RGA 硬件图形加速&#xff0c;在这篇文章&#xff0c;我将讲解如何使用 ffmpeg-rockchip 用户空间库&#xff08;代码&#xff09;实现 MPP 硬件编解码。 本文不仅适…

Element Plus 之 el-table相同行合并(通用函数),相同列合并(自行判断需合并的字段以及相应的列下标)

展示 代码 <el-table :data"tableData" border style"width: 100%" :span-method"objectSpanMethod"><el-table-column prop"date" label"Date" width"180" align"center" /><el-table…

深入理解计算机系统阅读笔记-第十二章

第12章 网络编程 12.1 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。根据这个模型&#xff0c;一个应用时由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源&#xff0c;并且通过操作这种资源来为它的客户端提供某种服务。例如&#xf…

ubuntu20.04安装MySQL5.7

deb安装 下载deb文件并配置 wget https://repo.mysql.com//mysql-apt-config_0.8.12-1_all.deb sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb我使用xshell可以正常。 这个弹出框里&#xff0c;选择的是“ubuntu bionic”。(在终端工具上&#xff0c;有可能显示不了选项)【…

CSS | CSS实现两栏布局(左边定宽 右边自适应,左右成比自适应)

目录 一、左边定宽 右边自适应 1.浮动 2.利用浮动margin 3.定位margin 4.flex布局 5.table 布局 二、左右成比自适应 1:1 1flex布局 table布局 1:2 flex布局 三列布局链接&#xff1a;CSS | 实现三列布局&#xff08;两边边定宽 中间自适应&#xff0c;自适应成比&#xff09;-…