独立看门狗

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效

(1)功能描述:

==在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)

==无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位

==如果程序异常,就无法正常喂狗,从而系统复位

Stm32看门狗HAL_IWDG_Refresh无法重置看门狗_寄存器

键值寄存器IWDG_KR: 0~15位有效

预分频寄存器IWDG_PR:0~2位有效。具有写保护功能,要操作先取消写保护

重装载寄存器IWDG_RLR:0~11位有效。具有写保护功能,要操作先取消写保护。

状态寄存器IWDG_SR:0~1位有效

(2)库函数操作


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);//状态:重装载/预分频 更新


(3)操作步骤


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

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

//比如我们设定 prer 值为 4,rlr 值为 625,那么就可以得到 Tout=64×625/40=1000ms,这样,
//看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不
//会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准
//确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位


窗口看门狗

窗口看门狗时钟来源PCLK1(APB1总线时钟)分频后。之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。

工作示意图:

Stm32看门狗HAL_IWDG_Refresh无法重置看门狗_stm32_02

T[6:0]就是 WWDG_CR (控制寄存器)的低七位,W[6:0]即是 WWDG->CFR 的低七位。T[6:0] 就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40)。 当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。

上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保 窗口值大于 0X40,否则窗口就不存在了

Stm32看门狗HAL_IWDG_Refresh无法重置看门狗_看门狗_03

启动位:该位由软件置 1,以启动看门狗,并且一定要注意的是该 位一旦设置,就只能在硬件复位后才能清零了。

MCU复位的两种情况:

(1)当喂狗的时候如果计数器的值大于某一设定数值W[6:0]时,此设定数值在WWDG_CFR(配置)寄存器定义

(2)当计数器的数值从0x40减到0x3F时【T6位跳变到0】

配置过程:

//使能看门狗时钟:
     RCC_APB1PeriphClockCmd();
//设置分频系数:
     WWDG_CNT=tr&WWDG_CNT;   //WWDG_CNT用来保存初始的WWDG_CR计算器的值
     WWDG_SetPrescaler();
//设置上窗口值:
     WWDG_SetWindowValue();
//开启提前唤醒中断并分组(可选):
     WWDG_EnableIT();   
     NVIC_Init();
//使能看门狗:
     WWDG_Enable();
//喂狗:
     WWDG_SetCounter();
//编写中断服务函数
     WWDG_IRQHandler();


//窗口看门狗的超时公式如下:
//Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
//其中:
//Twwdg:WWDG 超时时间(单位为 ms)
//Fpclk1:APB1 的时钟频率(单位为 Khz)
//WDGTB:WWDG 的预分频系数
//T[5:0]:窗口看门狗的计数器低 6 位