看门狗有一个输入旗子暗记和一个输出旗子暗记。输入旗子暗记也称“喂狗”,输出旗子暗记关联MCU的复位端。系统运行后启动看门狗计数器,看门狗开始计数,当计数满后未收到清零旗子暗记(喂狗),看门狗计数器溢出,触发看门狗中断,输出掌握MCU复位。
看门狗可分为独立于单片机芯片外的看门狗芯片和集成于单片机芯片内的看门狗外设两种。按照事情事理,独立看门狗和窗口看门狗是最为常见的两种看门狗类型。

STM32F103系列MCU内置两个看门狗外设(独立看门狗和窗口看门狗),供应了更高的安全性、韶光的精确性和利用的灵巧性。
独立看门狗IWDG(全称是Independent watchdog)最适宜运用于那些须要看门狗作为一个在主程序之外,能够完备独立事情,并且对韶光精度哀求较低的场合。
STM32F103系列MCU独立看门狗事理框图如下图:
图1:独立看门狗事理框图
注:在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末端0x000时,会产生一个复位旗子暗记(IWDG_RESET)。无论何时,只要在键寄存器IWDG_KR中写入0xAAAA, IWDG_RLR中的值就会被重新加载到计数器,从而避免产生看门狗复位。IWDG独立看门狗超时时间打算图2:独立看门狗超时打算公式
注:RLR表示重装载值(低11位有效),PRER表示预分频系数值(范围是0~6)。例如,按RLR为625、PRER为4来打算可得IWDG看门狗超时时间为1000ms即1s。IWDG独立看门狗配置步骤图3:独立看门狗配置步骤
软件设计IWDG寄存器搜集STM32F103供应了4个用于操作IWDG的寄存器,如下表所示:
表1:IWDG干系寄存器
序号
寄存器名
读/写
功能描述
1
IWDG_KR
只写
键寄存器。
2
IWDG_PR
读/写
预分频寄存器。
3
IWDG_RLR
读/写
重装载寄存器。
4
IWDG_SR
只读
状态寄存器。
每一种寄存用具体的描述在这里不做详细的先容,大家可以参考目录:“第1部分:开拓板硬件资料”“2 - 芯片资料”中“STM32英文参考手册_V15”或“STM32中文参考手册_V10”对应的IWDG章节的寄存器部分负责研读。
IWDG库函数搜集ST官方供应的终极库函数版本是V3.5版本,该版本库函数供应了6个与IWDG操作有关的库函数,如下表所示:
表2:IWDG干系库函数搜集
序号
函数名
功能描述
1
IWDG_WriteAccessCmd
使能或者失落能对寄存器IWDG_PR和IWDG_RLR的写操作。
2
IWDG_SetPrescaler
设置IWDG预分频值。
3
IWDG_SetReload
设置IWDG重装载值。
4
IWDG_ReloadCounter
按照IWDG重装载寄存器的值重装载IWDG计数器。
5
IWDG_Enable
使能IWDG。
6
IWDG_GetFlagStatus
检讨指定的IWDG标志位被设置与否。
注:关于IWDG预分频值和IWDG超时时间打算公式的预分频系数值PRER是两个不同的观点。关于函数void IWDG_SetPrescaler(u8 IWDG_Prescaler)的入参取值决定了IWDG预分频系数值,它们之间有一个对应关系,如下表所示。
表3:函数IWDG_SetPrescaler入参 IWDG_Prescaler取值
序号
IWDG_Prescaler值
功能描述
对应PRER值
1
IWDG_Prescaler_4
设置IWDG预分频值为4。
IWDG预分频系数值为0。
2
IWDG_Prescaler_8
设置IWDG预分频值为8。
IWDG预分频系数值为1。
3
IWDG_Prescaler_16
设置IWDG预分频值为16。
IWDG预分频系数值为2。
4
IWDG_Prescaler_32
设置IWDG预分频值为32。
IWDG预分频系数值为3。
5
IWDG_Prescaler_64
设置IWDG预分频值为64。
IWDG预分频系数值为4。
6
IWDG_Prescaler_128
设置IWDG预分频值为128。
IWDG预分频系数值为5。
7
IWDG_Prescaler_256
设置IWDG预分频值为256。
IWDG预分频系数值为6。
注:关于预分频寄存器(IWDG_PR)的低3位PR[2:0]为111和110时对应的预分频值都是256。其他库函数详细的描述在这里不做详细的先容,大家可以参考目录:“第1部分:开拓板硬件资料”--->“2 - 芯片资料”中“STM32固件库利用手册的中文翻译版”对应的IWDG章节的库函数部分负责研读。
IWDG独立看门狗实验(及时喂狗)注:本节对应的实验源码是:“实验2-7-1:IWDG独立看门狗(及时喂狗)”。新建工程可以参阅《1-5:利用标准库新建工程模板》工程须要用到的库文件
本例须要用到的c文件如下表所示,工程须要添加下表中的c文件。
表4:实验须要用到的c文件
序号
文件名
后缀
功能描述
1
stm32f10x_rcc
.c
复位与时钟掌握器。
2
stm32f10x_gpio
.c
通用输入输出。
3
stm32f10x_iwdg
.c
独立看门狗。
按下图所示将须要的c文件添加到工程。
图4:在新建工程中添加所需库函数c文件
头文件引用和路径设置须要引用的头文件由于在“main.c”文件中利用了标准库和我们自己建的软件延时函数,以是须要引用下面的头文件。
#include "stm32f10x.h"//delay这里报错的缘故原由是:delay函数用汇编实现的,导致了MDK误报。#include "delay.h"须要包含的头文件路径本例须要包含的头文件路径如下表:
表5: 头文件包含路径
序号
路径
描述
1
..\Lib\F10x_FWLIB\inc
标准库头文件路径。
2
..\User
stm32f10x_conf.h头文件在该路径,以是要包含。
3
..\User\bsp
自建的板卡干系的驱动文件路径。
MDK中点击魔术棒,打开工程配置窗口,按照下图所示添加头文件包含路径。
图5:添加头文件包含路径
编写代码首先是调用库函数完成独立看门狗IWDG的初始化配置,纵然能对寄存器IWDG_PR和IWDG_RLR的写操作,配置IWDG重装载值,配置IWDG预分频值,重装载计数值喂狗,启动开门狗。IWDG预分频值为64,则由表3可知IWDG预分频系数值为4,再由IWDG超时打算公式可打算出超时时间为1s。
代码清单:初始化配置独立看门狗IWDG
/ 描 述 : 初始化独立看门狗IWDG 入 参 : 无 返回值 : 无/void IWDG_Init(void){IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作IWDG_SetReload(625); //配置IWDG重装载值为625IWDG_SetPrescaler(IWDG_Prescaler_64); //配置IWDG预分频值为64IWDG_Feed(); //重装载计数值喂狗IWDG_Enable(); //启动开门狗}然后须要知道喂狗是通过重装载计数器实现的,喂狗函数如下:
代码清单:喂狗函数
/ 描 述 : 喂狗 入 参 : 无 返回值 : 无/void IWDG_Feed(void){IWDG_ReloadCounter(); //重装载计数值喂狗}末了,在主函数中加入延时以仿照代码运行韶光,不雅观察在小于1s的韶光间隔内喂狗,会不会涌现指示灯D1一直闪烁的征象。
代码清单:主函数
int main(void){/一旦没有在配置的独立看门狗超时时间内喂狗,则系统会复位,会重新实行下面的语句///初始化用于驱动指示灯D1、D2、D3、D4的引脚,并熄灭4个用户LEDleds_init();//初始化独立看门狗IWDG,配置独立看门狗超时时间为1sIWDG_Init();//软件延时500ms,该500ms已经占用了独立看门狗超时时间1s中的500mssw_delay_ms(500);//点亮开拓板指示灯D1led_on(LED_1);//主循环while(1){//软件延时400ms,该延时是仿照喂狗前实际实行用户运用代码所用时长sw_delay_ms(400);//喂狗IWDG_Feed();//软件延时400ms,该延时是仿照喂狗后实际实行用户运用代码所用时长sw_delay_ms(400);}}实验步骤解压“…\第3部分:标准库教程和实验源码\ 1 - 根本实验程序\”目录下的压缩文件“实验2-7-1:IWDG独立看门狗(及时喂狗)”,将解压后得到的文件夹拷贝到得当的目录,如“D\STM32F103ZET6”。启动MDK5.23。在MDK5中实行“Project→Open Project”打开“…\IWDG\projec”目录下的工程“IWDG.uvproj”。点击编译按钮编译工程。把稳查看编译输出栏,不雅观察编译的结果,如果有缺点,修处死式,直到编译成功为止。编译后天生的HEX文件“IWDG.hex”位于工程目录下的“Objects”文件夹中。点击下载按钮下载程序 。如果须要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。程序运行后,可以不雅观察到D1指示灯常亮。(解释单片机没有复位重启)IWDG独立看门狗实验(未及时喂狗)注:本节的实验源码是在“实验2-7-1:IWDG独立看门狗(及时喂狗)”的根本上修正。本节对应的实验源码是:“实验2-7-2:IWDG独立看门狗(未及时喂狗)”。工程须要用到的库文件本实验须要用到的c文件以及添加头文件包含路径的方法与先容“实验2-7-1:IWDG独立看门狗(及时喂狗)”完备一样,在此不再赘述。
编写代码关于独立看门狗IWDG的初始化配置和喂狗的函数设计与“实验2-7-1:IWDG独立看门狗(及时喂狗)”完备一样,在此不再赘述。
下面先容下主函数部分,利用延时函数实现的延时时间不一样,不雅观察在大于1s的韶光间隔内喂狗,指示灯D1会涌现什么实验征象。
代码清单:主函数
int main(void){/一旦没有在配置的独立看门狗超时时间内喂狗,则系统会复位,会重新实行下面的语句///初始化用于驱动指示灯D1、D2、D3、D4的引脚,并熄灭4个用户LEDleds_init();//初始化独立看门狗IWDG,配置独立看门狗超时时间为1sIWDG_Init();//软件延时500ms,该500ms已经占用了独立看门狗超时时间1s中的500mssw_delay_ms(500);//点亮开拓板指示灯D1,该语句也会占用独立看门狗的超时时间led_on(LED_1);//主循环while(1){//软件延时510ms,该延时是仿照喂狗前实际实行用户运用代码所用时长sw_delay_ms(510);//喂狗IWDG_Feed();//软件延时510ms,该延时是仿照喂狗后实际实行用户运用代码所用时长sw_delay_ms(510);}}实验步骤解压“…\第3部分:标准库教程和实验源码\ 1 - 根本实验程序\”目录下的压缩文件“实验2-7-1:IWDG独立看门狗(及时喂狗)”,将解压后得到的文件夹拷贝到得当的目录,如“D\STM32F103ZET6”。启动MDK5.23。在MDK5中实行“Project→Open Project”打开“…\IWDG\projec”目录下的工程“IWDG.uvproj”。点击编译按钮编译工程。把稳查看编译输出栏,不雅观察编译的结果,如果有缺点,修处死式,直到编译成功为止。编译后天生的HEX文件“IWDG.hex”位于工程目录下的“Objects”文件夹中。点击下载按钮下载程序 。如果须要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。程序运行后,可以不雅观察到D1指示灯闪烁。(解释单片机不断在复位重启)









