依照STM32参考手册的说法:“独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即便主时钟发生毛病它也依然有用。IWDG最适合应用于那些需求看门狗作为一个在主程序之外,能够彻底独立作业,而且对时刻精度要求较低的场合。WWDG最适合那些要求看门狗在准确计时窗口起作用的应用程序。”
简略的说,STM32中的IWDG其中心便是一个12bits的向下递减的计数器,当计数器计数到零时就会触发体系复位。因而,要在每次计数到零之前将其复位到一个初始值。这个初始值就在重装载寄存器(IWDG_RLR)中寄存,其默认值为0xFFF,咱们也能够将其改为其他值。
计数器的时钟由LSI时钟经过分频后供给,预分频因子由预分频寄存器(IWDG_PR)的值来确认。详细的说IWDG_PR寄存器只要最低的3位是有用的,其他高位永久都为0,这最低的3位就决议了预分频因子,这3位的值与预分频因子的联系如下。
000: 预分频因子=4 100: 预分频因子=64 001: 预分频因子=8 101: 预分频因子=128010: 预分频因子=16 110: 预分频因子=256 011: 预分频因子=32 111: 预分频因子=256
除了上面介绍的两个寄存器,IWDG还有别的两个寄存器,合起来共四个寄存器,分别是:
键寄存器(IWDG_KR)
预分频寄存器(IWDG_PR)
重装载寄存器(IWDG_RLR)
状况寄存器(IWDG_SR)
所谓键寄存器(IWDG_KR),能够以为便是个操控寄存器,舱位看门狗,喂狗需求操作键寄存器,修正其他寄存器值也需求先操作键寄存器(IWDG_KR)。
舱位看门狗
向键寄存器(IWDG_KR)写入0xCCCC,发动看门狗作业。IWDG一旦发动了就不会中止,除非掐断单片机的供电。也便是说看门狗不受休眠或RESET的影响。
IWDG->KR = 0xCCCC;
STM32F10x_StdPeriph_Driver供给了如下函数。
void IWDG_Enable(void);
喂狗
向键寄存器(IWDG_KR)写入0xAAAA,这时计数器的值会复位为重装载寄存器(IWDG_RLR)的值。
不然,当计数器为0时,看门狗会发生复位。
IWDG->KR = 0xAAAA;
STM32F10x_StdPeriph_Driver供给了如下函数。
void IWDG_ReloadCounter(void);
修正预分频因子
向键寄存器(IWDG_KR)写入0x5555,向预分频寄存器(IWDG_PR)写入新值。
留意这两步之间不能有其他的对IWDG的操作。
IWDG->KR = 0x5555;IWDG->PR = value;
使用STM32F10x_StdPeriph_Driver则需求如下调用两个函数。
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(value);
修正重装载寄存器的值
向键寄存器(IWDG_KR)写入0x5555,向重装载寄存器(IWDG_RLR)写入新值。
留意这两步之间不能有其他的对IWDG的操作。
IWDG->KR = 0x5555;IWDG->RLR = value;
使用STM32F10x_StdPeriph_Driver则需求如下调用两个函数。
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetReload(value);
预分频寄存器、重装载寄存器与看门狗超时时刻的联系如下表所示。
上面的介绍都没有涉及到状况寄存器(IWDG_SR)。这个寄存器不太常用,需求了解的能够参看STM32参考手册。
别的,当用调试器调试代码时,咱们期望在发生断点时,计数器能够中止计数。这能够经过设置DBGMCU_CR的第8位(DBG_IWDG_STOP位)来完成。
0:看门狗计数器依然正常作业;
1:看门狗计数器中止作业。
操作代码如下:
DBGMCU->CR |= 0x100;
STM32F10x_StdPeriph_Driver中也供给了相应的操作函数:
DBGMCU_Config(DBGMCU_IWDG_STOP, ENABLE);