1 独立看门狗(IWDG)简介
独立看门狗(IWDG) :STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看
门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给
定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门
狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟
或过早的操作。
IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精
度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。
在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值
0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。
无论何时,只要在键寄存器IWDG_KR中写入0xAAAA, IWDG_RLR中的值就会被重新加载到
计数器,从而避免产生看门狗复位 。
处理器的时钟
低速的内部时钟,在处理器内部;
高速的外部时钟HSE和低速的外部时钟LSE,在处理器外部,用的都是外部的晶振(8MHz和32.76kHz);
1.1 看门狗的作用
解决设备因为内部和外部电磁干扰,造成的设备死机等,需要复位,用看门狗的方式实现芯片复位。
独立看门狗依赖处理器内部的内部低速时钟LSI,即使外部时钟全部损坏,依旧可以正常工作;
1.2 喂狗(setDog)
2 独立看门狗(IWDG)的使用
查看芯片手册,看看独立看门狗的使用涉及的寄存器有哪些
由系统框图可知,独立看门狗(IWDG)的时钟来自LSI(时钟频率在40kHz),涉及的寄存器主要是1.8V供电区的4个寄存器
状态寄存器标志IWDG的状态;
预分频寄存器标志LSI的分频系数(比如1分频,2分频,3分频等。。。。。。)
重装载寄存器标志装载数值
键寄存器
2.1 键寄存器
写入0x5555表示允许访问IWDG_PR(预分频寄存器)和IWDG_RLR寄存器(重装载寄存器)
这里可以看出IWDG_PR(预分频寄存器)和IWDG_RLR寄存器具有写保护功能,要使用这两个寄存器就要取消写保护功能,写上在键寄存器(IWDG_KR)0x5555
写入0xCCCC,启动看门狗工作(若选择了硬件看门狗则不受此命令字限制)。
**软件必须以一定的间隔写入0xAAAA,否则,当计数器为0时,看门狗会产生复位。**这一步就是喂狗,在少于一定周期内喂狗;
2.2 预分频寄存器(IWDG_PR)
这些位具有写保护设置,参见17.3.2节。通过设置这些位来选择计数器时钟的预分频因子。要
改变预分频因子,IWDG_SR寄存器的PVU位必须为0。
000: 预分频因子=4 100: 预分频因子=64
001: 预分频因子=8 101: 预分频因子=128
010: 预分频因子=16 110: 预分频因子=256
011: 预分频因子=32 111: 预分频因子=256
注意:对此寄存器进行读操作,将从VDD电压域返回预分频值。如果写操作正在进行,则读回
的值可能是无效的。因此,只有当IWDG_SR寄存器的PVU位为0时,读出的值才有效。
2.2.1独立看门狗减一次计数需要的时间
T1 = (主频分频后的)频率的倒数
2.2.2 独立看门后的复位时间
Time = T1 (主频分频后的)频率的倒数 * 重装载寄存器(IWDG_RLR);
2.3 重装载寄存器(IWDG_RLR)
2.4状态寄存器(IWDG_SR)
3 独立看门狗库函数代码实现
1定义
独立看门狗(IWDG)用来解决应软件或者硬件引起的处理器故障。它也可以在停止(Stop)模式和待命
(Standby)模式下工作。
Section 12.1 IWDG 寄存器结构描述了固件函数库所使用的数据结构,Section 12.2 固件库函数介绍了函数
库里的所有函数
3.1 独立看门狗的寄存器结构
为了访问 IWDG 寄存器, _IWDG 必须在文件“stm32f10x_conf.h”中定义如下:
#define _IWDG
// An highlighted block
IWDG 外设声明于文件“stm32f10x_map.h”: MAP映射
#define PERIPH_BASE ((u32)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
#define IWDG_BASE (APB1PERIPH_BASE + 0x3000)
#ifndef DEBUG
...
#ifdef _IWDG
#define IWDG ((IWDG_TypeDef *) IWDG_BASE)
#endif /*_IWDG */
...
#else /* DEBUG */
...
#ifdef _IWDG
EXT IWDG_TypeDef *IWDG;
#endif /*_IWDG */
...
#endif
使用 Debug 模式时,初始化指针 IWDG 于文件“stm32f10x_lib.c”:
#ifdef _IWDG
IWDG = (IWDG_TypeDef *) IWDG_BASE;
#endif /*_IWDG */
为了访问 IWDG 寄存器, _IWDG 必须在文件“stm32f10x_conf.h”中定义如下:
#define _IWDG
3.2 IWDG库函数
3.3 代码实现
1:编写独立看门狗初始化函数
1.1 使能看门狗(在启动看门狗之前先使能看门狗)
// An highlighted block
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
1.2 预分频函数
IWDG_SetPrescaler
// An highlighted block
/* Set IWDG prescaler to 8 */
IWDG_SetPrescaler(IWDG_Prescaler_8);
1.3 函数IWDG_SetReload
/* Set IWDG reload value to 0xFFF */
IWDG_SetReload(0xFFF);
1.4 函数IWDG_ReloadCounter
将设置的重装载值放置到装载函数里
/* Reload IWDG counter */
IWDG_ReloadCounter();
以上就是设置好看门狗的参数了,接着开始使能看门狗寄存器
2.0 函数IWDG_Enable
/* Reload IWDG counter */
IWDG_ReloadCounter();