之前讲过看门狗,参看:STM32开发 – 看门狗详解

一、HAL库配置独立看门狗步骤

1、取消寄存器写保护,设置看门狗预分频系数和重装载值。

首先我们必须取消 IWDG_PR和 IWDG_RLR寄存器的写保护,这样才可以设置寄存器IWDG_PR和 IWDG_RLR的值。取消写保护和设置预分频系数以及重装载值载HAL库中是通过函数HAL_IWDG_Init实现的。
该函数声明为:

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);

该函数只有一个入口参数hiwdg,该参数是HAL_StatusTypeDef 结构体指针类型。
接下来我们看看结构体HAL_StatusTypeDef 定义:

typedef struct
{IWDG_TypeDef                 *Instance;  /*!< Register base address    */IWDG_InitTypeDef             Init;       /*!< IWDG required parameters */
} IWDG_HandleTypeDef;

成员变量Instance用来设置看门狗寄存器基地址,实际上在HAL库中已经通过标识符定义了,这里对于独立看门狗直接设置为标识符IWDG即可。
成员变量Init是一个IWDG_InitTypeDef结构体类型,该结构体只有2个成员变量,分别用来设置独立看门狗的预分频系数和重装载值,定义如下:

typedef struct
{uint32_t Prescaler;  /*!< Select the prescaler of the IWDG.This parameter can be a value of @ref IWDG_Prescaler */uint32_t Reload;     /*!< Specifies the IWDG down-counter reload value.This parameter must be a number between Min_Data = 0 and Max_Data = 0x0FFF */} IWDG_InitTypeDef;

HAL_IWDG_Init 函数使用的一般方法为:

IWDG_HandleTypeDef hiwdg; //独立看门狗句柄void MX_IWDG_Init(void)
{hiwdg.Instance = IWDG;  //独立看门狗hiwdg.Init.Prescaler = IWDG_PRESCALER_64; //设置IWDG分频系数hiwdg.Init.Reload = 4095;  //重装载值if (HAL_IWDG_Init(&hiwdg) != HAL_OK){Error_Handler();}
}

上面程序的作用是初始化IWDG,设置分频系数64,重装载值为4095。设置玩预分频系数和重装载值后,我们就可以知道看门狗的喂狗时间(也就是看门狗溢出时间),该时间的计算方式为:

Tout=((4×2^prer) ×rlr) /32

其中:

#define IWDG_PRESCALER_64               IWDG_PR_PR_2                                    /*!< IWDG prescaler set to 64  */
#define IWDG_PR_PR_2                        (0x4UL << IWDG_PR_PR_Pos)           /*!< 0x00000004 */

Tout 为看门狗溢出时间(单位为 ms); prer 为看门狗时钟预分频值( IWDG_PR 值),范围为 0~7; rlr 为看门狗的重装载值( IWDG_RLR 的值);
比如我们设定prer值为4(4 代表的是 64 分频, HAL 库中可以使用宏定义标识符IWDG_PRESCALER_64),rlr值为4095,那么就可以得到Tout=64×4095/32=8190ms。这样,看门狗的溢出时间就是8190ms。只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确
的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

下图为STM32F407的独立看门狗时钟 32KHz。

下图为STM32F105的独立看门狗时钟 40KHz。

2、重载计数值喂狗(向IWDG_KR 写入 0XAAAA)

在HAL中重载计数值得函数是HAL_IWDG_Refresh,该函数声明为:

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);

该函数有一个入口参数为前面讲解的HAL_StatusTypeDef 结构体类型指针,它的作用是把值0xAAAA写入到IWDG_KR 寄存器,从而触发计数器重载,即实现独立看门狗的喂狗操作。

//喂独立看门狗
void IWDG_Feed(void)
{   HAL_IWDG_Refresh(&hiwdg);
}
#define __HAL_IWDG_RELOAD_COUNTER(__HANDLE__)       WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_RELOAD)
#define IWDG_KEY_RELOAD                 0x0000AAAAu  /*!< IWDG Reload Counter Enable   */HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
{/* Reload IWDG counter with value defined in the reload register */__HAL_IWDG_RELOAD_COUNTER(hiwdg);/* Return function status */return HAL_OK;
}

3、启动看门狗(向IWDG_KR写入0xCCCC)

HAL 库函数里面启动独立看门狗的函数是 HAL_IWDG_Start:

HAL_StatusTypeDef HAL_IWDG_Start(IWDG_HandleTypeDef *hiwdg);

通过上面3个步骤,我们就可以启动STM32F4的独立看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。

二、STM32CubeMX配置IWDG

在 Pinout 界面的 Peripherals 一栏选择 IWDG,然后勾选上 Activated 选项即可使能 IWDG。依次配置 IWDG 的预分频系数和自动装载值。

STM32F4 HAL库开发 -- 独立看门狗(IWDG)相关推荐

  1. stm32专题三十四:独立看门狗 IWDG

    独立看门狗简介 IWDG结构框图 (1)独立看门狗时钟 独立看门狗的时钟由独立的 RC 振荡器 LSI 提供, 即使主时钟发生故障它仍然有效,非常独立. LSI 的频率一般在 30~60KHZ 之间, ...

  2. STM32F4 HAL库开发 -- 串口

    一.串口介绍 串口设置包含:开启串口时钟.设置响应的IO口模式.设置波特率.数据位长度.奇偶校验位.DMA等信息. 具体参看:STM32开发 – 串口详解 二.函数 1.串口参数初始化,并使能串口. ...

  3. STM32F103五分钟入门系列(十三)独立看门狗IWDG

    参考:STM32F103五分钟入门系列(十三)独立看门狗IWDG 作者:自信且爱笑' 发布时间:2021-07-31 19:50:28 网址:https://blog.csdn.net/Curnane ...

  4. STM32F1笔记(六)独立看门狗IWDG

    STM32F1内置了两个看门狗,独立看门狗IWDG和窗口看门狗WWDG,可以用来检测和解决由软件错误引起的故障. IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精 ...

  5. 独立看门狗IWDG详细解析

    目录 独立看门狗IWDG详细解析 为什么要有看门狗? 看门狗的定时原理 寄存器功能简介 看门狗定时器计数原理 看门狗相关寄存器 KR寄存器 PR寄存器 RLR寄存器 SR寄存器 看门狗相关基础知识 什 ...

  6. STM32—独立看门狗(IWDG)

    STM32-独立看门狗(IWDG) 独立看门狗(IWDG) STM32-独立看门狗(IWDG) 独立看门狗(IWDG) IWDG 简介 IWDG 功能框图剖析 独立看门狗时钟 计数器 重装载寄存器 键 ...

  7. cubeIDE开发, stm32独立看门狗IWDG的CubeMX配置及HAL库底层实现分析

    一.STM32 的IWDG简介 2.1 看门狗原理 看门狗本质上就是一种计数器,和我们现实生活中一炷香现象.沙漏现象等是同理的,计数器一般有两种做法,一种是递增,超过固定阀值报警:一种是递减,通常值降 ...

  8. 从零实现 独立看门狗IWDG STM32的待机与唤醒,在待机过程中如何喂狗

    欢迎大家留言交流~ 前言: 最近在学习原子的阿波罗,进行到待机实验,实验目的是摁下KEY_UP的时候就可以让MCU从待机模式唤醒了.而KEY1在按下的时候进入休眠.(验证过程比较繁琐,只看结论的小伙伴 ...

  9. STM32 - 独立看门狗IWDG - 使用注意事项+代码

    一.包含头文件 #include "stm32f10x_iwdg.h" 二.设置 独立看门狗 的超时时间 1.配置代码 /** 设置 IWDG 的超时时间* Tout(ms) = ...

最新文章

  1. 用leangoo怎么添加泳道,拖拽移动泳道?
  2. DIY最近准备配一台经济型的电脑,查了一下配置如下,总价2481元,自己也不专业,不知道有没有问题...
  3. java51游戏_Java作业实践(一)魔板游戏
  4. 【Netty】主从反应器 ( Reactor ) 多线程模型
  5. HoloLens开发手记 - Unity之Tracking loss
  6. android 活动销毁不了,即使活动已经销毁,AsyncTask也不会停止
  7. 360画报屏保,放大营销“感官力”
  8. Bloom是REST API缓存中间件,充当负载平衡器Nginx和REST API服务之间的反向代理
  9. 利用SMS轻松实现资产管理,SMS2003系列之四
  10. jQuery实现清空table表格除首行外的所有数据
  11. Java开发实习生面试—附简历以及面试题
  12. amd 安卓虚拟机_一款完美解决AMD兼容问题的安卓模拟器
  13. 目前云存储,主要面临哪些问题?
  14. 华为防火墙IPSEC简单搭建
  15. 对学校的希望和寄语_对小学生的寄语与希望
  16. dft中X(K)的k的含义
  17. 怎么看自己电脑MySQL版本_如何查看自己电脑sqlserver数据库版本
  18. MySQL--eq_range_index_dive_limit参数学习
  19. 万维网支持用户资源上行至服务器,万维网服务器
  20. TLF 0day SERVER 列表

热门文章

  1. WPF编程,TextBlock中的文字修饰线(上划线,中划线,基线与下划线)的使用方法。...
  2. Python模块和包
  3. DDoS(Distributed Denial of Service,分布式拒绝服务)
  4. 笔记本在Win7下使用wubi安装Ubuntu10.04 双系统
  5. 70后、80后、90后的区别(很有意思)
  6. C++类成员的初始化
  7. 计算机创建任务计划,win7系统创建任务计划的方法 如何创建任务计划
  8. [云炬创业学笔记]第一章创业是什么测试6
  9. [云炬python3玩转机器学习笔记] 3-6Numpy数组和矩阵的合并和分割
  10. linux 软硬文件类型,linux文件属性和类型、系统链接文件、软链接和硬链接