一、独立看门狗功能

定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级。

二、启动STM32的独立看门狗步骤

   ①、向IWDG_KR寄存器写入0X5555。  用于取消IWDG_PR和IWDG_RLR的写保护,使后面可以操作这两个寄存器。

设置IWDG_PR和IWDG_RLR的值,设置看门狗的分频系数和重装载的值。

看门狗的喂狗时间计算方式:Tout=((4×2^prer) ×rlr) /40

其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);比如我们设定 prer 值为 4,rlr 值为 625,那么就可以得Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。
 
这里需要提醒大家的是,看门狗的时钟不是准确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
  ②向 IWDG_KR 写入 0XAAAA。
通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。即实现独立看门狗的喂狗操作。
  ③向 IWDG_KR 写入 0XCCCC。
通过这句,来启动 STM32 的看门狗。注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧。
所以在这里提醒,如果不用 IWDG 的话,就不要去打开它,免得麻烦。
 
三、软件设计
 
wdg.c
#include "wdg.h"
//初始化独立看门狗
//prer:分频数:0~7(只有低 3 位有效!)
//分频因子=4*2^prer.但最大值只能是 256!
//rlr:重装载寄存器值:低 11 位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG->KR=0X5555;//使能对 IWDG->PR 和 IWDG->RLR 的写
 IWDG->PR=prer; //设置分频系数 
 IWDG->RLR=rlr; //从加载寄存器 IWDG->RLR 
IWDG->KR=0XAAAA;//reload 
 IWDG->KR=0XCCCC;//使能看门狗
}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG->KR=0XAAAA;//reload 
}

wdg.h

#ifndef __WDG_H
#define __WDG_H
#include "sys.h"
void IWDG_Init(u8 prer,u16 rlr);
void IWDG_Feed(void);
#endif

主函数

int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化与 LED 连接的硬件接口
KEY_Init(); //按键初始化
delay_ms(300); //让人看得到灭
IWDG_Init(4,625); //与分频数为 64,重载值为 625,溢出时间为 1s 
LED0=0; //点亮 LED0
while(1)
{
if(KEY_Scan(0)==WKUP_PRES)IWDG_Feed();//如果 WK_UP 按下,则喂狗
delay_ms(10);
};
}
12-28 04:11