1)实验平台:ALIENTEK NANO STM32F411 V1开发板2)摘自《正点原子STM32F4 开发指南(HAL 库版》关注官方微信号公众号,获取更多资料:正点原子

第十一章 独立看门狗(IWDG)实验
这一章,我们将向大家介绍如何使用 STM32 的独立看门狗(以下简称 IWDG)。STM32F4
内部自带了 2 个看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)。这一章我们只介绍
独立看门狗,窗口看门狗将在下一章介绍。在本章中,我们将通过按键 KEY_UP 来喂狗,然后
通过 DS0 提示复位状态。本章分为如下几个部分:
11.1 STM32F4 独立看门狗简介
11.2 硬件设计
11.3 软件设计
11.4 下载验证
11.5 STM32CubeMX 配置 IWDG11.1 STM32F4 独立看门狗简介
STM32 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故障,
它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 32Khz,
而是在 15~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频率来计算,
看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。
独立看门狗有几个寄存器与我们这节相关,我们分别介绍这几个寄存器,首先是键值寄存
器 IWDG_KR,该寄存器的各位描述如图 11.1.1 所示:

图 11.1.1 IWDG_KR 寄存器各位描述
在键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复
位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。
无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载
到计数器中从而避免产生看门狗复位 。
IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向
IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新
被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。
接下来,我们介绍预分频寄存器(IWDG_PR),该寄存器用来设置看门狗时钟的分频系数,
最低为 4,最高位 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是
保留位。预分频寄存器各位定义如图 11.1.2 所示:

图 11.1.2 IWDG_ PR 寄存器各位描述
在介绍完 IWDG_PR 之后,我们介绍一下重装载寄存器。该寄存器用来保存重装载到计数
器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的,该寄存器的各位描述
如图 11.1.3 所示:

图 11.1.3 重装载寄存器各位描述
只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32F4 的独立看门狗,独立
看门狗相关的 HAL 库操作函数在文件 stm32f4xx_hal_iwdog.c 和头文件 stm32f4xx_hal_iwdg.h
中。接下来我们讲解一下通过 HAL 库配置独立看门狗的步骤:1)取消寄存器写保护,设置看门狗预分频系数和重装载值,并启动看门狗
首先我们必须取消 IWDOG_PR 和 IWDG_RLR 寄存器的写保护,这样才可以设置寄存器
IWDG_PR 和 IWDG_RLR 的值。取消写保护和设置预分配系数以及重装载值在 HAL 库中是通
过函数 HAL_IWDG_Init 实现的。该函数声明为:
HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);
该函数只有一个入口参数 hiwdg,该函数是 IWDG_HandleTypeDef 结构体指针类型。接下
来我们看看结构体 IWDG_HandleTypeDef 定义:
typedef struct
{
IWDG_TypeDef
*Instance;
IWDG_InitTypeDef
Init;
}IWDG_HandleTypeDef;
成员变量 Instance 用来设置看门狗寄存器基地址,实际上在 HAL 库中已经通过标识符定义
了,这里对于独立看门狗直接设置为标识符 IWDG 即可。
成员变量 Init 是一个 IWDG_InitTypeDef 结构体类型,该结构体只有 2 个成员变量,分别
用来设置独立看门狗的预分频系数和重装载值,定义如下:
typedef struct
{
uint32_t Prescaler;
uint32_t Reload;
} IWDG_InitTypeDef;
HAL_IWDG_Init 函数使用的一般方法为:
IWDG_HandleTypeDef IWDG_Handler; //独立看门狗句柄
IWDG_Handler.Instance=IWDG;
//独立看门狗
IWDG_Handler.Init.Prescaler=IWDG_PRESCALER_64;
//设置 IWDG 分频系数
IWDG_Handler.Init.Reload=625;
//重装载值
HAL_IWDG_Init(&IWDG_Handler);
//初始化 IWDG,默认会开启独立看门狗
上面程序的作用是初始化 IWDG,设置分频系数为 64,重装载值为 500。设置完预分频系
数和重装载值后,我们就可以知道看门狗的喂狗时间(也就是看门狗溢出时间),该时间的计
算方式为:
Tout=((4×2^prer) ×rlr) /32
其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),
范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);
比如我们设定 prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符
IWDG_PRESCALER_64),rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,这样,看
门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会
导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准
确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
内部初始化 IWDG 后,同时会启动看门狗(IWDG_KR 写入 0XCCCC)。2)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)
在 HAL 中重载计数值函数是 HAL_IWDG_Refresh,该函数声明为:
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);
该函数有一个入口参数为前面所讲的 IWDG_HandleTypeDef 结构体类型指针,它的作用是
把值 0xAAAA 写入到 IWDG_KR 寄存器,从而触发计数器重载,及实现独立看门狗的喂狗操作。3)启动看门狗(向 IWDG_KR 写入 0XAAAA)
HAL 库函数里面启动独立看门狗的函数是 HAL_IWDG_Start:
HAL_StatusTypeDef HAL_IWDG_Start(IWDG_HandleTypeDef *hiwdg);
通过上面 3 个步骤,我们就可以启动 STM32F4 的看门狗了,使能了看门狗,在程序里面
就必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,我们本章将通过一个 LED 灯来
指示程序是否重启,来验证 STM32F4 的独立看门狗。
在配置看门狗后,DS0 将常亮,如果 KEY_UP 按键按下,就喂狗,只要 KEY_UP 不停的
按,看门狗就一直不会产生复位,保持 DS0 的常亮,一旦超过看门狗定溢出时间(Tout)还没
按,那么将会导致程序重启,这将导致 DS0 熄灭一次。11.2 硬件设计
本实验用到的硬件资源有:
1) 指示灯 DS0
2) WK_UP 按键
3) 独立看门狗
前面两个在之前都有介绍,而独立看门狗实验的核心是在 STM32F4 内部进行,并不需要
外部电路。但是考虑到指示当前状态和喂狗等操作,我们需要 2 个 IO 口,一个用来输入喂狗
信号,另外一个用来指示程序是否重启。喂狗我们采用板上的 KEY_UP 键来操作,而程序重启,
则是通过 DS0 来指示的。11.3 软件设计
我们直接打开光盘的独立看门狗实验工程,可以看到工程里面新增了 iwdg.c,同时引入了
头文件 iwdg.h。同样的道理,我们要加入 HAL 库看门狗支持文件 stm32f4xx_hal_iwdg.h 和
stm32f4xx_hal_iwdg.c 文件。
iwdg.c 里面的代码如下:
#include "iwdg.h"
IWDG_HandleTypeDef IWDG_Handler; //独立看门狗句柄
//初始化独立看门狗
//prer:分频数:IWDG_PRESCALER_4~IWDG_PRESCALER_256
//rlr:自动重装载值,0~0XFFF.
//时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_Handler.Instance=IWDG;
IWDG_Handler.Init.Prescaler=prer;
//设置 IWDG 分频系数
IWDG_Handler.Init.Reload=rlr;
//重装载值
HAL_IWDG_Init(&IWDG_Handler); //初始化 IWDG,默认会开启独立看门狗
HAL_IWDG_Start(&IWDG_Handler); //启动独立看门狗
}
//喂独立看门狗
void IWDG_Feed(void)
{
HAL_IWDG_Refresh(&IWDG_Handler); //喂狗
}
该代码就 2 个函数,void IWDG_Init(u8 prer,u16 rlr)是独立看门狗初始化函数,就是按照
上面介绍的步骤 1 来初始化独立看门狗的,并且启动。该函数有 2 个参数,分别用来设置与预
分频数与重装寄存器的值的。通过这两个参数,就可以大概知道看门狗复位的时间周期为多少
了。其计算方式上面有详细的介绍,这里不再多说了。
void IWDG_Feed(void)函数,该函数用来喂狗,因为 STM32F4 的喂狗只需要向键值寄存器
写入 0XAAAA 即可,也就是调用 IWDG_ReloadCounter()函数,所以,我们这个函数也是简单的
很。
iwdg.h 内容比较简单,主要是一些函数声明,这里我们忽略不讲解。
接下来我们看看主函数 main 的代码。在主程序里面我们先初始化一下系统代码,然后启动
按键输入和看门狗,在看门狗开启后马上点亮 LED0(DS0),并进入死循环等待按键的输入,
一旦 KEY_UP 有按键,则喂狗,否则等待 IWDG 复位的到来。这段代码很容易理解,该部分
代码如下:
int main(void)
{
HAL_Init();
//初始化 HAL 库
Stm32_Clock_Init(96,4,2,4); //设置时钟,96Mhz
delay_init(96);
//初始化延时函数
uart_init(115200);
//初始化串口 115200
LED_Init();
//初始化 LED
KEY_Init();
//初始化按键
delay_ms(100);
//延时 100ms 再初始化看门狗,LED0 的变化"可见"
IWDG_Init(IWDG_PRESCALER_64,500); //分频数为 64,重载值为 500,溢出时间为 1s
LED0=0;
while(1)
{
if(KEY_Scan(0)==WKUP_PRES) //如果 WK_UP 按下,喂狗
{
IWDG_Feed();
//喂狗
}
delay_ms(10);
}
}
上面的代码,鉴于篇幅考虑,我们没有把头文件给列出来(后续实例将会采用类同的方
式处理),因为以后我们包含的头文件会越来越多,大家想看,可以直接打开光盘相关源码查
看。至此,独立看门狗的实验代码,我们就全部编写完了,接着要做的就是下载验证了,看看
我们的代码是否真的正确。11.4 下载验证
在编译成功之后,我们就可以下载代码到 NANO STM32F4 开发板上,实际验证一下,我
们的程序是否正确。下载代码后,可以看到 DS0 不停的闪烁,证明程序在不停的复位,否则只
会 DS0 常亮。这时我们试试不停的按 KEY_UP 按键,可以看到 DS0 就常亮了,不会再闪烁。
说明我们的实验是成功的。11.5 STM32CubeMX 配置 IWDG
使用 STM32CubeMX 工具配置 IWDG 生成初始化代码的步骤非常简单,我们只需要使能
IWDG,同时配置 IWDG 的预分频系数和自动装载值即可。
首先我们看看使能 IWDG 的方法,在 System Core 界面的一栏选择 IWDG,然后勾选上
Activated 选项即可使能 IWDG。操作方法如下图 11.5.1:

图 11.5.1 IWDG 配置选项
接下来依次点击 Configuration->IWDG,进入 IWDG 参数配置界面。进入配置界面后,我
们依次配置 IWDG 的预分频系数和自动装载值,这两个参数的含义我们在前面已经讲解。
IWDG
Configuration 配置界面如下图 11.5.2 所示:

图 11.5.2 IWDG 参数配置界面
这里我们配置预分频系数为 64,同时自动装载值为 500 即可。配置完成后生成实验工程。
在生成的工程中,打开 main 文件可以看到生成的函数 MX_IWDG_Init 和看门狗实验工程中的
IWDG_Init 函数内容一致,不同的是 IWDG_Init 函数的这两个参数是通过入口参数传入的。当然,对于合适启动看门狗以及何时喂狗的操作软件是无法确定的,还需要用户根据自己需求在合适的程序段中编写这两项操作。

stm32看门狗_「正点原子NANO STM32开发板资料连载」第十一章 独立看门狗实验相关推荐

  1. 看门狗寄存器c语言代码_「正点原子NANO STM32F103开发板资料连载」第十一章 看门狗实验...

    1)实验平台:[正点原子] NANO STM32F103 开发板 2)摘自<正点原子STM32 F1 开发指南(NANO 板-HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 ...

  2. stm32 文件系统dma大小_「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验...

    1)实验平台:[正点原子] NANO STM32F103 开发板 2)摘自<正点原子STM32 F1 开发指南(NANO 板-HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 ...

  3. 实验5-9 使用函数输出水仙花数_正点原子STM32F407探索者开发板资料连载第五十三章 手写识别实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五十三章 手写识别实 ...

  4. 异步fifo_正点原子开拓者FPGA开发板资料连载第十五章 IP核之FIFO实验

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  5. stm32 ucosii消息队列 串口_正点原子STM32F407探索者开发板资料连载第六十三章 UCOSII 实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weix ...

  6. fpga驱动rgb液晶屏_正点原子开拓者FPGA开发板资料连载第五十四章基于的数字识别实验...

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  7. 共阳数码管段码表_正点原子开拓者FPGA开发板资料连载第十一章 静态数码管显示实验...

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  8. hal库开启中断关中断_「正点原子NANO STM32开发板资料连载」第十章 外部中断实验...

    1)实验平台:ALIENTEK NANO STM32F411 V1开发板 2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第十章 外 ...

  9. 韦东山 IMX6ULL和正点原子_「正点原子NANO STM32开发板资料连载」第三章 MDK5 软件入门1...

    1)实验平台:ALIENTEK NANO STM32F411 V1开发板 2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三章 M ...

最新文章

  1. 动态sql拼接单引号与 变量赋值
  2. 使用微信开发者工具添加小程序底部导航栏报错
  3. 单位阶跃信号是周期信号吗_iPhone12的信号有改观吗?
  4. Maven 的一个问题
  5. 在线分流框架下的AB Test
  6. tomcat7简单优化
  7. 视觉SLAM十四讲 第9讲 卡尔曼滤波
  8. linux搭建http代理服务器
  9. 快速有效分离RNA——土壤RNA纯化试剂盒
  10. 客户流失预测——相关论文学习笔记
  11. PPT居然还可以一键换色!学会这4招再也不怕色了……
  12. 10步搞定App内测发布(蒲公英内测平台)
  13. Cesium 实现卫星效果
  14. 测试独立显卡显存好坏的软件,显卡显存测试小软件(Artifact Tester)
  15. uniapp 基础知识学习
  16. 如何进行智慧城市顶层设计规划
  17. 小程序根据地址信息获取经纬度导航功能实现
  18. [EDI案例] 法雷奥/Valeo EDI解决方案
  19. 从麦当劳的管理谈品牌的细节塑造
  20. 火车票查询系统(一)——利用python实现监控12306余票查询

热门文章

  1. MFC常用类、成员函数、数组类、Cstring类、CTime类、CPoint类
  2. 集芯片的焊接技巧:从LQFP64说起
  3. linux几种时间函数总结
  4. X1000应用程序打包流程
  5. cmake (2)build方面的指令
  6. Html 教程 (4) <head>
  7. 区块链BaaS云服务(16)天德链TDBC“监管”
  8. (chap1 web网络基础) URI和URL
  9. 查看安卓模拟器 CPU版本
  10. [力扣leetcode39]组合总和及回溯法