STM32学习笔记:独立看门狗IWDG

2024-03-28 02:08

本文主要是介绍STM32学习笔记:独立看门狗IWDG,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STM32 内部自带了 2 个看门狗:独立看门狗( IWDG )和窗口看门狗( WWDG)。本文将详细讲解关于独立看门狗( IWDG)的定义、要点及使用方法。

目录

0x01、什么是看门狗

0x02、什么是独立看门狗IWDG

0x03、IWDG的特点

0x04、IWDG的使用

0x0001、IWDG相关寄存器

0x00011、IWDG_KR 键值寄存器

0x00012、IWDG_PR 预分频寄存器

0x00013、IWDG_RLR 重载寄存器

0x00014、IWDG_SR 重载寄存器

0x0002、IWDG相关库函数

0x00021、IWDG_WriteAccessCmd

0x00022、IWDG_SetPrescaler

0x00023、IWDG_SetReload

0x00024、IWDG_ReloadCounter

0x00025、IWDG_Enable

0x0003、自行编写的IWDG相关函数

0x05、源程序下载地址


0x01、什么是看门狗

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成 整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑, 便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog)

0x02、什么是独立看门狗IWDG

通俗点讲IWDG就是STM32中的一个12位的递减计数器,当计数器减到0时,系统会产生一个复位信号,重启单片机。所以,我们在使用看门狗时,需要在计数器减到0之前刷新计数器的值,使看门狗不产生复位信号,表示单片机工作正常。这个动作就是我们经常说的喂狗。超过一定时间没有喂狗,我们就认为单片机挂了。

0x03、IWDG的特点

1、独立看门狗的时钟是由个内部独立的 40kHz 的 RC 振荡器提供时钟,即使主时钟发生故障,它也仍然有效。(RC振荡器 LSI频率一般在 30~60KHZ之间,根据温度和工作场合会有一定的漂移,我们一般取40KHZ

2、看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。

3、可以通过预分频寄存器来设置看门狗时钟的分频系数。

0x04、IWDG的使用

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

0x0001、IWDG相关寄存器

IWDG共有4个寄存器,键值寄存器IWDG_KR、预分配寄存器IWDG_PR、重载寄存器IWDG_RLR、状态寄存器IWDG_SR。

0x00011、IWDG_KR 键值寄存器

Bits 31:16 Reserved, must be kept at reset value. 保留,必须保持在复位值

Bits 15:0 KEY[15:0]: Key value (write only, read 0000h)

These bits must be written by software at regular intervals with the key value AAAAh,otherwise the watchdog generates a reset when the counter reaches 0.

Writing the key value 5555h to enable access to the IWDG_PR and IWDG_RLR registers (see Section 19.3.2) Writing the key value CCCCh starts the watchdog (except if the hardware watchdog option is selected)

该寄存器必须定时写入0xAAAA,否则当计数器递减到0时,看门狗将产生复位信号。

写入0x5555,表示允许访问 IWDG_PR 和 IWDG_RLR 寄存器

写入0xcccc,表示启动看门狗(如果选择了硬件看门狗,则不受此命令字限制)

0x00012、IWDG_PR 预分频寄存器

Bits 31:3 Reserved, must be kept at reset value. 保留,必须保持在复位值

Bits 2:0 PR[2:0]: Prescaler divider  预分频器

These bits are write access protected seeSection 19.3.2. They are written by software to select the prescaler divider feeding the counter clock. PVU bit of IWDG_SR must be reset in order to be able to change the prescaler divider.

这些位具有写访问保护,请参阅第19.3.2节。它们是由软件改写,用来选择供给计数器时钟的预分频器。IWDG_SR寄存器的PVU位必须复位,以便能够改变预分频器。

000: divider /4

001:divider /8

010:divider /16

011: divider /32

100:divider /64

101:divider /128

110:divider /256

111:divider /256

Note: Reading this register returns the prescaler value from the VDD voltage domain. This value may not be up to date/valid if a write operation to this register is ongoing.

注:读取该寄存器将从VDD电压域返回预分频器值。如果对此寄存器的写入操作正在进行,则此值可能不是最新的、无效的。

For this reason the value read from this register is valid only when the PVU bit in the IWDG_SR register is reset.

因此,仅当IWDG_SR寄存器中的PVU位复位时,从该寄存器读取的值才有效。

0x00013、IWDG_RLR 重载寄存器

Bits 31:12 Reserved, must be kept at reset value. 保留,必须保持在复位值

Bits11:0 RL[11:0]:Watchdog counter reload value 看门狗计数器重新加载值

These bits are write access protected see Section 19.3.2. They are written by software to define the value to be loaded in the watchdog counter each time the value AAAAh is written in the IWDG_KR register.

The watchdog counter counts down from this value. The timeoutperiod is a function of this value and the clock prescaler. Refer to Table 96.The RVU bit in the IWDG_SR register must be reset in order to be able to change the reload value.

这些位具有写访问保护,见第19.3.2节。它们由软件改写,以定义每次将AAAAh值写入IWDG_KR寄存器时要加载到看门狗计数器中的值。看门狗计数器从该值开始倒计时。

timeoutperiod是这个值和时钟预分频器的函数。参考表96。IWDG_SR寄存器中的RVU位必须复位,以便能够更改重新加载值。

Note: Reading this register returns the reload value from the VDD voltage domain. This value may not be up to date/valid if a write operation to this register is ongoing on this register.

For this reason the value read from this register is valid only when the RVU bit in the IWDG_SR register is reset.

注意:读取此寄存器将返回VDD电压域的重新加载值。如果对该寄存器的写入操作正在该寄存器上进行,则该值可能不是最新的、无效的。因此,仅当IWDG_SR寄存器中的PVU位复位时,从该寄存器读取的值才有效。

0x00014、IWDG_SR 重载寄存器

Bits 31:2 Reserved, must be kept at reset value. 保留,必须保持在复位值

Bit 1 RVU:Watchdog counter reload value update 看门狗计数器重新加载值更新

This bit is set by hardware to indicate that an update of the reload value is ongoing. It is reset by hardware when the reload value update operation is completed in the VDD voltage domain(takes up to 5 RC 40 kHz cycles).

该位由硬件设置,以指示正在进行重新加载值的更新。当在VDD电压域中完成重新加载值更新操作时(最多需要5个RC 40 kHz周期),由硬件重置。

Reload value can be updated only when RVU bit is reset.

重新加载值只能在RVU位复位时更新。

Bit 0 PVU: Watchdog prescaler value update 看门狗预分频器值更新

This bit is set by hardware to indicate that an update of the prescaler value is ongoing. It is reset by hardware when the prescaler update operation is completed in the VDD voltage domain (takes up to 5 RC 40 kHz cycles).

该位由硬件设置,以指示正在进行预分频器值的更新。当预分频器更新操作在VDD电压域中完成时(最多需要5个RC 40 kHz周期),由硬件重置。

Prescaler value can be updated only when PVU bit is reset.

预分频器值只能在PVU位复位时更新。

0x0002、IWDG相关库函数

我们通过官方库文件(STM32F10x_StdPeriph_Lib_V3.5.0)来操作IWDG分为以下几步:

0x00021、IWDG_WriteAccessCmd

    函数名:void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)

函数功能:取消或开启IWDG_PR 和 IWDG_RLR 寄存器的写保护

     参数1:uint16_t IWDG_WriteAccess —>  IWDG_WriteAccess_Enable(取消寄存器写保护)、IWDG_WriteAccess_Disable(开启寄存器写保护)。                

    返回值:无

0x00022、IWDG_SetPrescaler

    函数名:void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)

函数功能:设置看门狗IWDG时钟的预分频系数

     参数1:uint8_t IWDG_Prescaler  —>  IWDG_Prescaler_4

                                                                  IWDG_Prescaler_8

                                                                  IWDG_Prescaler_16

                                                                  IWDG_Prescaler_32

                                                                  IWDG_Prescaler_64

                                                                  IWDG_Prescaler_128

                                                                  IWDG_Prescaler_256

    返回值:无

总结分频系数公式为:4 × 2^Prescaler。看门狗运行频率公式为:40 000 / (4 × 2^Prescaler),每秒计数次数为:4 × 2^Prescaler  / 40 000

这里比较烧脑的就是4 × 2^Prescaler这个计算,如果你需要选取分频系数,建议不要运算,直接用宏定义来选取

例如:

IWDG_Prescaler取值为IWDG_Prescaler_4,IWDG运行频率为:40 000 / 4 = 10 000Hz,即每秒计数10 000次。

IWDG_Prescaler取值为IWDG_Prescaler_8,IWDG运行频率为:40 000 / 8 

IWDG_Prescaler取值为IWDG_Prescaler_16,IWDG运行频率为:40 000 / 16 

IWDG_Prescaler取值为IWDG_Prescaler_32,IWDG运行频率为:40 000 / 32 

以此类推。

0x00023、IWDG_SetReload

    函数名:void IWDG_SetReload(uint16_t Reload)

函数功能:设置 IWDG 重装载值

     参数1:uint16_t Reload —>  0到0x0FFF,表示IWDG计数器要计数的次数

    返回值:无

以上两个函数决定了IWDG的溢出时间,计算公式如下:TimeOut = Reload × 4 × 2^Prescaler  / 40 000

因为在使用看门狗的时候,我们需要根据我们要定时的时间来反推上述函数中的两个不定的参数,这种计算比较麻烦,所以下面我给出一个1S时间基准的例子,根据这个基准调节参数最终得到你想要的时间值

我们选择Reload = 625 ,  Prescaler = IWDG_Prescaler_64 ,定时时间 TimeOut  = 625 ×  64  / 40 000 = 1s

0x00024、IWDG_ReloadCounter

    函数名:void IWDG_ReloadCounter(void)

函数功能:重载IWDG

     参数1:无

    返回值:无

0x00025、IWDG_Enable

    函数名:void IWDG_Enable(void) 

函数功能:使能IWDG,并开启 IWDG_PR 和 IWDG_RLR 寄存器的写保护 

     参数1:无

    返回值:无

0x0003、自行编写的IWDG相关函数

至此,我们启动 IWDG 的整个过程就完成了,下面我们编写一个属于自己的 IWDG 初始化及启动函数

/**
*@brief   初始化独立看门狗
*@param   参数1:prer    分频数:0~7(只有低 3 位有效!)分频因子=4*2^prer.但最大值只能是 256!    
*         IWDG_Prescaler_4:   对40KHz进行4分频
*         IWDG_Prescaler_8:   对40KHz进行8分频
*         IWDG_Prescaler_16:  对40KHz进行16分频
*         IWDG_Prescaler_32:  对40KHz进行32分频
*         IWDG_Prescaler_64:  对40KHz进行64分频
*         IWDG_Prescaler_128: 对40KHz进行128分频
*         IWDG_Prescaler_256: 对40KHz进行256分频
*         参数2:rlr     重装载寄存器值:低 11 位有效.取值范围为0到0x0FFF。
*@return  无
*/
void IWDG_Init(uint8_t prer,uint16_t rlr)
{IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);   //使能对寄存器IWDG_PR和IWDG_RLR的写操作IWDG_SetPrescaler(prer);                        //设置IWDG预分频值:设置IWDG预分频值IWDG_SetReload(rlr);                            //设置IWDG重装载值IWDG_ReloadCounter();                           //按照IWDG重装载寄存器的值重装载IWDG计数器IWDG_Enable();                                  //使能IWDG
}

在 IWDG时间内,我们需要周期性调用以下函数进行喂狗

/**
*@brief   喂独立看门狗
*@param   无   
*@return  无
*/
void IWDG_Feed(void)
{IWDG_ReloadCounter();                             //重载
}

0x05、源程序下载地址

https://download.csdn.net/download/thebestleo/13192126

这篇关于STM32学习笔记:独立看门狗IWDG的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/854137

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

poj 2594 二分图最大独立集

题意: 求一张图的最大独立集,这题不同的地方在于,间接相邻的点也可以有一条边,所以用floyd来把间接相邻的边也连起来。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <sta

poj 3692 二分图最大独立集

题意: 幼儿园里,有G个女生和B个男生。 他们中间有女生和女生认识,男生男生认识,也有男生和女生认识的。 现在要选出一些人,使得这里面的人都认识,问最多能选多少人。 解析: 反过来建边,将不认识的男生和女生相连,然后求一个二分图的最大独立集就行了。 下图很直观: 点击打开链接 原图: 现图: 、 代码: #pragma comment(