看门狗(watchdog)

防止硬件因外界电磁场干扰或其他导致不能正常工作的,导致不可预料后果,对芯片进行实时检测的模块或芯片称为看门狗

看门狗工作过程

启动看门狗后,有一个计数器从最大值递减,计数器减到0就会导致系统复位。为了不让每次复位会在某个时间内喂狗,也就是修改相应的寄存器在计数器没减到0的时候把计数器值再次调大。

IWDG和WDOG(window)

独立看门狗和窗口看门狗的区别:
IWDG使用的是LSI低速时钟,即使主时钟故障,独立看门狗仍然可以正常工作,只有上限,下限是0
WDOG是从APB1时钟分频的时钟,**时间较精确,**适合精确计时的程序检测,有上限,下限计数器时间0x40

独立看门狗寄存器启动运行

1,键值寄存器(IWDG_KR)写入0xcccc,开启独立看门狗。计时器从0xfff开始递减,若减到1则复位
2,在键值寄存器中写入0xAAAA,计数器会自动装载(重装载寄存器)IWDG_RLR的值,也就是俗称的**喂狗**
3,如果程序异常,无法喂狗,进而系统复位

BIOS里的看门狗设置是什么东西 windows 看门狗_寄存器


BIOS里的看门狗设置是什么东西 windows 看门狗_BIOS里的看门狗设置是什么东西_02


IWDG_KR寄存器中写入0x5555,也就是取消写保护

独立看门狗时间计算

BIOS里的看门狗设置是什么东西 windows 看门狗_寄存器_03


分频系数=4*2^PR,所以每次一个时钟减一次,所以所有溢出时间是计时器的值RLR有关,

BIOS里的看门狗设置是什么东西 windows 看门狗_单片机_04

Tout=((4×2^PR) ×RLR) /40

常用函数

取消寄存器写保护:
      IWDG_WriteAccessCmd();
②  设置独立看门狗的预分频系数,确定时钟:
     IWDG_SetPrescaler();
③  设置看门狗重装载值,确定溢出时间:
    IWDG_SetReload();
④  使能看门狗
    IWDG_Enable();
⑤  应用程序喂狗:
   IWDG_ReloadCounter();

溢出时间计算:
   Tout=((4×2^prer) ×rlr) /40 (M3)



void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数:写PR
void IWDG_SetReload(uint16_t Reload);//设置重装载值:写RLR
void IWDG_ReloadCounter(void);//喂狗:写0xAAAA到KR
void IWDG_Enable(void);//使能看门狗:写0xCCCC到KR
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频 更新

窗口看门狗

喂狗时间

其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定0x3F)。独立看门狗限制喂狗时间在0-x内,x由相关寄存器决定。窗口看门狗的T6位就是在变为0就会复位,也就是下线值0x3f

BIOS里的看门狗设置是什么东西 windows 看门狗_单片机_05

窗口看门狗框图工作流程

首先,WWDG_CR看门狗启动位必须作用

第一种,WWDG_CR的后7位数据(计数器)大于WWDG_CFR时,通过比较器输出1,这时候喂狗(写入WWDG_CR)就会复位。可以看出WWDG_CFR记录的是上限值。

第二种:当WWDG_CR的T6位为0时,直接经过或门导致复位,所以不能减到0X40之下的0x3F.否则也触发复位

注意下图中的分频是在WWDG_CFR的第7,8位的值设置控制的。

BIOS里的看门狗设置是什么东西 windows 看门狗_寄存器_06


BIOS里的看门狗设置是什么东西 windows 看门狗_看门狗_07


BIOS里的看门狗设置是什么东西 windows 看门狗_寄存器_08

看门狗时间

BIOS里的看门狗设置是什么东西 windows 看门狗_BIOS里的看门狗设置是什么东西_09

常用寄存器

BIOS里的看门狗设置是什么东西 windows 看门狗_单片机_10


BIOS里的看门狗设置是什么东西 windows 看门狗_嵌入式硬件_11

BIOS里的看门狗设置是什么东西 windows 看门狗_BIOS里的看门狗设置是什么东西_12


BIOS里的看门狗设置是什么东西 windows 看门狗_BIOS里的看门狗设置是什么东西_13

程序设置和常用函数

使能看门狗时钟:
     RCC_APB1PeriphClockCmd();
②  设置分频系数:
     WWDG_SetPrescaler();
③ 设置上窗口值:
     WWDG_SetWindowValue();
④ 开启提前唤醒中断并分组(可选):
     WWDG_EnableIT();   
     NVIC_Init();
⑤ 使能看门狗:
     WWDG_Enable();
⑥ 喂狗:
    WWDG_SetCounter();
⑦编写中断服务函数
   WWDG_IRQHandler();   //一般将唤醒中断过程中喂狗