WDG简介
IWDG(独立看门狗)
看门狗能在停机和待机模式下工作,从上节我们能得知,IWDG复位也能唤醒待机模式下的主机
独立看门狗以LSI作为时钟源,不过这个时钟不需要通过RCC库函数来开启,在独立看门狗启动后,LSI会自动开启。
通过配置预分频器PR和重装载寄存器RLR,就能设置最晚的喂狗时间。
上图为超时时间的计算公式,其中LSI固定为40kHz
初始化配置模板:
//初始化独立看门狗 1000ms
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//解除写保护
IWDG_SetPrescaler(IWDG_Prescaler_16);//配置预分频
IWDG_SetReload(2499);//写重装值(0~4096)
IWDG_ReloadCounter();//先喂一次狗 第一个周期会完整一些
IWDG_Enable();//启动独立看门狗
模板代码是配置了一个超时时间为1000ms的独立看门狗;
在配置之前要先解除写保护;
预分频器和重装寄存器可以自由组合;
喂狗操作由IWDG_ReloadCounter();只要在超时时间之内完成喂狗,独立看门狗就不会复位。
想要查看是否由独立看门狗引起的复位,可以调用RCC_GetFlagStatus(RCC_FLAG_IWDGRST)
不过下一次还想查看是否由它引起的复位,要在每次查看后手动清除标志位,RCC_ClearFlag();
WWDG(窗口看门狗)
这里与独立看门狗不懂,独立看门狗在超时时间之前喂狗就不会引起复位;窗口看门狗要在窗口时间和超时时间之间喂狗,由PCLK1作为时钟源,需要调用RCC库函数开启,并且进来后会有一个4096的分频,图中没标出来。
可见两个自减计数器都是6位的,但我们只能写入低5位,T6位是溢出标志位,所以只看低5位就是减到0时复位,看6位就是减到0x40时复位。
这里计算都是按照5位来计算的,所以最后写入寄存器时还需要“|”0x40,将最高位置1;
初始化配置模板
//窗口看门狗初始化 超时时间50ms 窗口时间30ms
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//与独立看门狗不同,需要手动开启时钟
WWDG_SetPrescaler(WWDG_Prescaler_8);//设定预分频
WWDG_SetWindowValue(0x40|21);//设定窗口值
/*
计算时用的是T[5:0],所以需要|上0x40,因为T[6:0]最高位为1
*/
WWDG_Enable(0x40|54);//使能同时喂第一次狗
模板代码配置了窗口时间30ms,超时时间50ms的窗口看门狗,所以在喂第一次狗后(代码最后一行),30ms之后、50ms之前要喂狗,否则会引起复位。
窗口看门狗喂狗则是调用WWDG_SetCounter(0x40|54);他既是使能函数,也是喂狗函数。
同样调用RCC_GetFlagStatus(RCC_FLAG_WWDGRST);查看是否由窗口看门狗引起复位