05 STM32F4的独立看门狗(IWDG)

1、综述

  (1)看门狗是什么,能解决什么问题?
  出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”;看门狗所起的作用如下:在程序启动后正常运行中,系统不能复位,而在系统跑飞(程序异常执行)的情况下,系统复位,程序重新运行。

  (2)STM32F407的内部自带了两个看门狗:独立看门狗(IWDG )和窗口看门狗(WWDG)。
  (3)独立看门狗由内部专门的32kHz低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。
  (4)需要注意,独立看门狗的时钟是一个内部的RC时钟,所以并不是准确的32kHz,而是在15~47kHz之间的一个可变化的时钟,只是,我们在估算的时候,以32kHz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。


2、相关寄存器

  (1)关键字寄存器 IWDG_KR
  <1>在关键字寄存器 IWDG_KR中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器减到零时,会产生一个复位信号。
  <2>在计数器减到零之前,也就是复位之前,只要给关键字寄存器 IWDG_KR中写入0xAAAA,计数器中就会重新装载一个固定的值,而避免复位。这个固定的值来源于另一个寄存器,叫做IWDG_RLR(后面介绍)。
  <3>而这个RLR寄存器具有写保护的功能,也就是说,不能让外界随随便便修改里面的数值,我们要想修改它,必须先向IWDG_KR寄存器中写入0x5555。


  (2)重装载寄存器 IWDG_RLR
  据上面所述,这个寄存器用来保存重装载到计数器中的值。该寄存器是一个32位寄存器,低12位有效。上面也提到,计数器(最大)是从0xFFF递减计数的,所以,只用了RLR寄存器的低12位。


  (3)预分频寄存器 IWDG_PR
  该寄存器用来设置看门狗时钟的分频系数,可以设置4个值:4分频、8分频、16分频、32分频。32位寄存器,低三位有效。该寄存器和RLR一样,也具有写保护功能。我们要想修改它,也必须先向IWDG_KR寄存器中写入0x5555。


3、配置独立看门狗的步骤

  (1)取消寄存器写保护(向IWDG_KR寄存器中写入0x5555)

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

  (2)设置独立看门狗的预分频系数和重装载值
  设置看门狗的分频系数(PR寄存器)的函数是:

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数

  设置看门狗的重装载值(RLR寄存器)的函数是:

void IWDG_SetReload(uint16_t Reload);//设置重装载值

  (3)重装载计数值喂狗(向IWDG_KR中写入0xAAAA)

IWDG_ReloadCounter();//重装载计数器的值

  (4)启动看门狗(向IWDG_KR中写入0xCCCC)

IWDG_Enable();//使能看门狗

  注意:<1>IWDG一旦启动,就不能再被关闭,想要关闭,只能重启,并且重启之后不能打开它,否则就又不能再关闭......
  注意:<2>启动了看门狗,在程序里面就必须间隔一定时间去喂狗,否则将导致程序复位。


4、实例代码

#include "iwdg.h"


//初始化独立看门狗
void IWDG_Init(u8 prep, u16 rlr)//两个入口参数:与分频系数,重装载值
{
    //取消寄存器写保护
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
    
    //设置独立看门狗的预分频系数,确定时钟
    IWDG_SetPrescaler(prep);
    
    //设置看门狗重装载值,确定溢出时间
    IWDG_SetReload(rlr);
    
    //重装载计数值喂狗
    IWDG_ReloadCounter();//向KR寄存器写入0xAAAA
    
    //使能看门狗
    IWDG_Enable();
}

//喂狗
void IWDG_Feed(void)
{
    IWDG_ReloadCounter();//向KR寄存器写入0xAAAA
}

5、有关独立看门狗溢出时间的计算

  设置好看门狗狗的分频系数和重装载值,就可以知道看门狗的喂狗时间(溢出时间)。怎么来分析呢?
  首先,看门狗的时钟是32kHz(不准确,有的教材上按40kHz计算),这个时钟的意思,就是看门狗计数器每隔1/32毫秒,下降一个值。如果预分频系数prep设置为4,也就是64分频(4×2^(prep)),那么,分频后的看门狗时钟成为了0.5kHz,也就是,计数器每隔2ms变化一次。而计数器从多少开始计数呢?这取决于我们写入RLR重装载寄存器里的值是多少,假如我们写入rlr = 500,那么,它就经过1000ms,也就是1秒的时间,才能减到0。在这1秒中的时间间隔之内去喂狗,看门狗就不会复位。
  综上分析,溢出时间Tout的计算公式为:Tout = 4 × 2^(prep) × rlr / 32[ms]。

你可能感兴趣的:(05 STM32F4的独立看门狗(IWDG))