STM32---IWDG(独立看门狗),超详细,小白入

这篇具有很好参考价值的文章主要介绍了STM32---IWDG(独立看门狗),超详细,小白入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面:本节我们学习STM32中一个很有趣的东西——看门狗,其实在我上大学的时候,当时还没有系统学习STM32的时候,就听到过看门狗这个词语,当时老师上课不断在说看门狗,只是觉得很有意思。但是没有真正了解过,今天同大家一起学习看门狗的内容。看门狗并不难,大家跟着我的思路学习即可。

一、IWDG简介

IWDG全称(Independent watchdog)独立看门狗。

本质:一个能够产生复位信号的计数器。

那么什么是复位信号呢?复位就是使MCU回到初始状态。对于单片机来说,开机的时候需要复位,以便使得CPU和其他功能部件处于一个正确的初始状态,并以此为起点开始工作,当出现死机的情况也应当对其进行复位,用以摆脱死机状态。

系统复位方式共有5种,分别为:

1、硬件复位。

2、WWGD复位。

3、IWDG复位。

4、软件复位。

5、低功耗复位。

独立看门狗复位:这种方式使用独立的看门狗来监控单片机系统的工作状态,当单片机工作异常时,看门狗会产生复位信号,将单片机系统复位。

特征:1、独立看门狗是一个递减计数器产生的复位。2、时钟信号是有独立RC振荡器产生。3、可以在待机和停止模式下运行。4、当看门狗被激活后,当递减为0是产生复位。

喂狗:如果在计数没减到 0 之前,重置计数器的值的话,那么就不会产生复位信号,这个动作我们称为。

作用:检测外界电磁干扰或硬件导致程序跑飞的问题。

二、工作原理

其本质还是一个计数器;

g_iwdg_handle.instance = iwdg;,STM32,stm32,嵌入式硬件,单片机

根据其工作原理图知:IWDG有一个输入(时钟LSI),为内部专门的 40Khz 低速时钟(LSI)驱动 ,经过分频器进行预分频,分频为工作时钟,然后提供给递减计数器,当递减计数器减为0时产生复位信号。为递减计数器赋值的过程称为喂狗,喂狗的作用就是不产生复位信号。

三、相关寄存器

3.1键寄存器(IWDG_KR)

g_iwdg_handle.instance = iwdg;,STM32,stm32,嵌入式硬件,单片机

该寄存器共有16位,其作用为控制看门狗的相关操作,由软件进行设置:

主要的操作有三个:1、0XAAAA进行喂狗,只有这样才能将重装载寄存器的值进行喂狗;2、0X5555解除写保护,表示允许访问IWDG_PR和IWDG_RLR寄存器;3、写入入0xCCCC,启动看门狗工作。

3.2预分频寄存器(IWDG_PR)

g_iwdg_handle.instance = iwdg;,STM32,stm32,嵌入式硬件,单片机

此寄存器只有三位有效,其主要作用就是将来自时钟信号进行分频,从而供给看门狗使用。

3.3重装载寄存器(IWDG_RLR)

g_iwdg_handle.instance = iwdg;,STM32,stm32,嵌入式硬件,单片机

      该寄存器的有效位数为12位,其作用为看门狗计数器的重装载值。每当向IWDG_KR 寄存器写入0xAAAA时,重装载值会被传送到计数器中。随后计数器从这个值开始递减计数。所以说最大的重装载值为2^12,最小的重装载值为1。

3.4状态寄存器(IWDG_SR)

g_iwdg_handle.instance = iwdg;,STM32,stm32,嵌入式硬件,单片机

        该寄存器只有两位,其主要的功能为: RVU: 看门狗计数器重装载值更新;PVU: 看门狗预分频值更新 。

3.5寄存器配置步骤

上述寄存器以及相关的位的配置步骤如下:

1、通过IWDG_KR 置为0xCCCC 使能看门狗;

2、通过IWDG_KR 置为0x5555 使能寄存器访问,可以访问PR与RLT寄存器;

3、通过IWDG_PR 的0-7位为预分频器;

4、通过IWDG_RLR 设置喂狗的值;

5、通过IWDG_SR 判断重装载值以及预分频系数是否更新完;

6、刷新计数器的值IWDG_RLR,再将IWDG_KR置为0XAAA进行反复的喂狗。

四、IWDG配置步骤

1、IWDG溢出时间计算

g_iwdg_handle.instance = iwdg;,STM32,stm32,嵌入式硬件,单片机

寄存器设置分频系数的方法: psc=4 * 2^prer,但最大值只能是 256;

2、IWDG 的配置步骤

1、取消PR/RLR寄存器写保护。

2、IWDG设置预分频系数和重装载值,启动IWDG。

3、及时喂狗,写入0XAAAA到IWDG_KR。

3、IWDG的HAL库驱动

HAL_IWDG_Init 函数,涉及主要的寄存器IWDG_PR/RL/KP,使能IWDG设置预分频系数和重装载值。

g_iwdg_handle.instance = iwdg;,STM32,stm32,嵌入式硬件,单片机

 其形参为结构体指针:IWDG_HandleTypeDef *hiwdg;进一步看主要由三个参数进行定义:

g_iwdg_handle.instance = iwdg;,STM32,stm32,嵌入式硬件,单片机

HAL_IWDG_Refresh 函数,涉及主要的寄存器IWDG_KR,把重装载寄存器的值重载到计数器中,也就是喂狗。

g_iwdg_handle.instance = iwdg;,STM32,stm32,嵌入式硬件,单片机

该库函数的参数 结构体指针:IWDG_HandleTypeDef *hiwdg;

五、源码及验证

5.1实验说明

     可以看到 LED0 不停的闪烁,证明系统在不停的复位,否则 LED0 常亮。这时我们不停的按 KEY_0按键,可以看到 LED0 就常亮了,不会再闪烁。也就是说不按下KEY0按键时,程序不停地在看门狗复位,按下按键的过程也就是喂狗的过程,及时喂狗打断复位,让LED0长亮。

5.2源码

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/led/led.h"
#include "./BSP/iwdg/IWDG.h"
#include "./BSP/key/key.h"

int main(void)
{
    HAL_Init();                              /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);      /* 设置时钟, 72Mhz */
    delay_init(72);                          /* 延时初始化 */
    led_init();                              /* LED初始化 */
    key_init();                              /* KEY初始化 */
    delay_ms(100);                           /* 延时1s,再初始化看门狗,作用是为了使LED0的灯进行可视化 */
    iwdg_init(IWDG_PR_PR_2,625);             /* 预分频系数为64,重载值为625,看门狗的时间约为1s */
    LED1(0);                                 /* 点亮LED0 */   
    while(1)
    { 
        
       if (key_scan()==1) /* 如果KEY0 按下,则喂狗 */
         {
            iwdg_feed(); /* 喂狗 */
         }    
    }
}

IWDG.c

#include "./BSP/iwdg/IWDG.h"
IWDG_HandleTypeDef g_iwdg_handle;//定义独立看门狗句柄;
/**;
 * @brief       初始化独立看门狗 
 * @param       prer:预分频系数;
 *   @arg       分频因子 = 4 * 2^prer. 但最大值只能是256!
 * @param       rlr: 自动重装载值,0~0XFFF. 
 * @note        时间计算(大概):Tout=((4 * 2^prer) * rlr) / 40 (ms). 
 * @retval      无
 */
 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);
 }
/**;
 * @brief       喂狗函数 
 * @param       无
 * @retval      无
 */
void  iwdg_feed(void)
{
 HAL_IWDG_Refresh(&g_iwdg_handle);

}

 key.c

#include "./BSP/key/key.h"
#include "./SYSTEM/delay/delay.h"
/**
 * @brief       初始化KEY相关IO口, 并使能时钟
 * @param       无
 * @retval      无
 */
void key_init(void)
{
    GPIO_InitTypeDef gpio_init_struct; //定义GPIO结构体
     __HAL_RCC_GPIOE_CLK_ENABLE();//使能GPIOB的时钟;
    gpio_init_struct.Pin=GPIO_PIN_4;//设置IO口的引脚;
    gpio_init_struct.Pull=GPIO_PULLUP;//设置IO口的工作模式
    gpio_init_struct.Mode=GPIO_MODE_INPUT;
    gpio_init_struct.Speed=GPIO_SPEED_FREQ_HIGH;//设置IO口的输入速度。
    HAL_GPIO_Init(GPIOE, &gpio_init_struct);
}

/**
 * @brief       判断按键是否按下
 * @param       无
 * @retval      keyval如果是1就是按键按下,如果是0就是按键未按下
 */

uint8_t key_scan()
{
    uint8_t keyval=0;//定义一个返回值,用于判断按键是否按下
    if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)//判断按键是否按下
    {
        delay_ms(20);
    while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==1);//判断按下后是否松开
        keyval=1; 
    }
    return  keyval;
    
}

led.c

#include "./BSP/led/led.h"

 /**;
 * @brief       初始化LED函数 
 * @param       无
 * @retval      无
 */
void led_init(void)
{ 
    __HAL_RCC_GPIOB_CLK_ENABLE();//使能GPIOB的时钟;
    GPIO_InitTypeDef gpio_init_struct;//定义GPIO结构体
    gpio_init_struct.Mode=GPIO_MODE_OUTPUT_PP; //设置IO口的工作模式
    gpio_init_struct.Pin=GPIO_PIN_5;//设置IO口的引脚;
    gpio_init_struct.Pull=GPIO_PULLUP;//设置IO口上下;
    gpio_init_struct.Speed=GPIO_SPEED_FREQ_HIGH;//设置IO的速度;        
    HAL_GPIO_Init(GPIOB, &gpio_init_struct);
    LED1(1);//关闭LED灯;
}

led.h

#ifndef __LED_H
#define __LED_H

#include "./SYSTEM/sys/sys.h"
 void led_init(void);//初始化LED函数 

#define LED1(x) do{ x ? \
                        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET): \
                        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); \
                    }while(0)//进行宏定义,通过LED1(x),设置一个三目运算符,如果是1就关闭LED,如果是0就打开LED.
#endif

5.3实验现象

iwdg实验

链接:https://pan.baidu.com/s/1Al3ryi_T9vZxanOJnFt2Qg 
提取码:1022

总结: 本节的主要内容,我们学习的是STM32单片的IWDG即独立看门狗的相关知识,主要的内容有:IWDG的简介与工作原理,相关的寄存器讲解,配置的步骤以及HAL库的相关函数,最后通过实验实现了IWDG控制LED的相关实验现象。本节的内容不算太难,在学习的同时还能很好复习之前的LED、KEY等模块。

创作不易,还请大家多多点赞支持!!!文章来源地址https://www.toymoban.com/news/detail-804760.html

到了这里,关于STM32---IWDG(独立看门狗),超详细,小白入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】基础知识 第十五课 看门狗 IWDG 深入理解与应用

    STM32 系列单片机具有强大的内置功能, 其中之一就是独立看门口 (IWDG). 看门狗定时器是一种重要的硬件设备, 用于防止系统软件故障. 在许多应用中, 看门狗定时器的使用是至关重要的, 它可以检测和解决软件错误, 提高系统的可靠性. 今天小白将带领大家深入探讨 STM32 独立看门

    2024年02月11日
    浏览(48)
  • stm32——hal库学习笔记(IWDG)

    IWDG有什么作用? 键寄存器(IWDG_KR) 预分频器寄存器 (IWDG_PR) 重装载寄存器(IWDG_RLR) 状态寄存器(IWDG_SR) 寄存器配置操作步骤(了解) IWDG最短最长超时时间(F1) HAL库相关函数介绍 wdg.c wdg.h main.c

    2024年02月21日
    浏览(46)
  • 【STM32笔记】STM32的看门狗详解(独立看门狗和窗口看门狗)

      首先,它不是真的狗。看门狗(Watchdog)是一种硬件定时器,用于监测程序执行是否正常,并在系统出现故障或死锁时重启系统。在STM32F10xxx中内置了两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。 两个看门狗设备(独立看门狗和窗口看门狗)可用来

    2024年02月04日
    浏览(48)
  • STM32—看门狗详解入门(独立看门狗、窗口看门狗)

    目录 一、什么是看门狗? 二、独立看门狗IWDG 1.特点、本质及原理 2.配置 3.main.c代码 三、窗口看门狗WWDG 1.特点、本质及原理 2.配置 3.main.c代码 四、独立看门狗与窗口看门狗的比较         看门狗主要是用来监测单片机运行状态和解决程序引起的故障的模块。         

    2024年02月15日
    浏览(51)
  • STM32CubeMX教程24 WDG - 独立窗口看门狗

    开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 XCOM V2.6串口助手 逻辑分析仪nanoDLA 使用STM32CubeMX软件配置STM32F407开发板的 独立看门狗(IWDG)和窗口看门狗(WWDG)并了解其功能实现 STM32F407拥有两个看

    2024年01月25日
    浏览(58)
  • stm32之看门狗

            STM32 有两个看门狗, 独立看门狗 和 窗口看门狗 ,独立看门狗又称宠物狗,窗 口看门狗又称警犬。可用来检测和解决由软件错误引起的故障。两个看门狗的原理都是 当计数器达到给定的超时值时,产生系统复位,对于窗口型看门狗同时会产生一个中断。 独立看

    2024年02月04日
    浏览(58)
  • STM32开发——看门狗

    目录 1.独立看门狗 1.1需求 1.2CubeMX设置  1.3函数代码 2.窗口看门狗 2.1需求 ​2.2WWDG配置: 2.3函数代码  3.独立看门狗和窗口看门狗的异同点 监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。  独立看门狗本质 本质是一个 12 位的递减计数器,当计数器的值从

    2024年02月10日
    浏览(111)
  • STM32——看门狗WDG

    看门狗全称:WatchDog,简称WDG,本质作用是是自动复位电路; WDG主要是监控程序的运行状态,当程序因为设计漏洞,硬件故障或者电磁干扰等原因时,造成程序出现卡死或者跑飞时,看门狗可以自动复位电路,可以避免程序陷入长时间的罢工状态,保证了系统的可靠性和安全

    2024年01月22日
    浏览(67)
  • STM32-WDG看门狗

    目录 简介 独立看门狗  键寄存器 窗口看门狗 特点 STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障,当计数器达到给定的超时值时,触发一个中断(仅适用于窗

    2024年03月15日
    浏览(72)
  • STM32--WDG看门狗

    WDG看门狗(Watchdog Timer)是一种常见的硬件设备,在STM32F10系列中,有两种看门狗,分别是独立看门狗和窗口看门狗,可以 用来监测系统的运行状态,并在系统出现故障或停止运行时采取相应措施 ,以确保系统的稳定性和可靠性。 WDG看门狗一般采用一个 计时器 和一个 喂狗机

    2024年02月08日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包