STM32基础教程 p15独立看门狗

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(); 

4 具体例子

如何看到程序复位现象,这里用一个灯亮灭的程序演示,这里的程序,灯只亮灭一次,设置看门狗程序1S复位一次,当看门狗工作时,灯会1s亮一次。

在这里插入图片描述

在这里插入图片描述

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值