定义
看门狗的实质是一个定时器,在启动后,须要在肯定工夫内再给它一个信号,俗称“喂狗”,如果没有按时“喂狗”,阐明MCU可能处于非正常状态,这时看门狗就向MCU发送个复位信号,使整个零碎重启,从新进入失常的工作状态。看门狗命令在程序的中断中领有最高的优先级。
独立看门狗( Independent Watchdog, IWDG)
时钟:独立看门狗的时钟源来自LSI(外部低速时钟),意味着不受内部晶振电路影响,同时就算零碎主时钟产生故障时,也能够失常工作。应用外部晶振,也象征精度并不高,因而只适宜利用在对工夫精度要求比拟低的场合。
计数:独立看门狗的计数器是一个12位的递加计数器,计数最大值为0xFFF,当计数器递加到0时,就会产生一个复位信号,重启整个零碎。如果在递加到0之前,将重装载数值写入递加计数器,就会由重装载数值开始递加到0,如此重复,就永远不会到0,就不会产生复位信号,这个重装载计数值写入递加计数器的过程就叫“喂狗”。
重装载数值来自重装载寄存器( IWDG_RLR), 这个值大小决定独立看门狗的溢出工夫(复位倒计时)。
/** STM32* 函数名: void IWDG_Init(uint16_t period)* 输出参数: period-设置喂狗周期,单位 ms* 输入参数:无* 返回值:无* 函数作用:初始化独立看门狗的喂狗工夫* 刷新工夫计算: Prescaler/LSI*Reload*/void IWDG_Init(uint16_t period) { hiwdg.Instance = IWDG; // 抉择独立看门狗 hiwdg.Init.Prescaler = IWDG_PRESCALER_256; // 设置预分频 hiwdg.Init.Reload = 40000/256*period/1000; // 设置重装载值 if (HAL_IWDG_Init(&hiwdg) != HAL_OK) // 初始化独立看门狗 { Error_Handler(); }}
总结:独立看门狗蕴含一个12位递加计数器,从用户定义的t开始递加到0,必须在t~0之间喂狗,否则复位重启。
窗口看门狗( Windowwatchdog, WWDG)
窗口看门狗,蕴含一个7位递加计数器,从用户定义的t开始递加到64,必须在t~64之间喂狗,在t之前或者64之后喂狗,也会导致复位重启。这里的t值,称之为窗口下限,由用户自定义设置;这里的64,称之为窗口上限,是零碎固定的。窗口看门狗计数器必须在上窗口和下窗口之间被刷新(喂狗),不能过早,也不能过晚,这也就窗口看门狗中的“窗口”含意。
时钟:窗口看门狗的时钟源来自PCLK1(最高36MHz),通过4096分频,再通过WWDG_CFG的Bits[8:7]位WDGTB分频失去, WDGTB反对2^n分频( 0≤n≤3)。
计数:窗口看门狗的计数器是一个7位的递加计数器,计数最大值为0x7F,当计数器递加到0x3F时,就会产生一个复位信号,重启整个零碎。当递加计数器递加到0x40时,如果使能了提前唤醒中断( WWDG_CFG的Bits[9]位EWI设置为1),则会产生提前唤醒中断,在该中断能够保留重要数据或者向WWDG_CR从新写入新计数器值,实现喂狗操作。一旦0x40变为0x39,零碎将进行复位,因而必须在一个窗口看门狗计数周期内实现喂狗操作。WWDG_CR的Bits[7]位WDGA为窗口看门狗使能位,当为1时,窗口看门狗才工作。
窗口:窗口看门狗的WWDG_CFG的Bits[6:0]位为窗口上边界值,该值应小于计数器最大值0x7F,大于窗口下边界值0x3F。
窗口看门狗初始化
“HAL_WWDG_Init()--HAL库零碎函数”函数会回调“ HAL_WWDG_MspInit()--HAL库零碎函数”进行硬件相干初始化。
窗口看门狗中断解决
使能中断后,当窗口看门狗计数到0x40时,会进去提前唤醒中断,在该中断处理函数里,用户能够保留数据或喂狗。
/** 函数名: void WWDG_IRQHandler(void)* 输出参数:无* 输入参数:无* 返回值:无* 函数作用: WWDG 的中断处理函数*/ void WWDG_IRQHandler(void) { HAL_WWDG_IRQHandler(&hwwdg); // HAL库的零碎函数} /** 函数名: void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg)* 输出参数: hwwdg-WWDG 句柄* 输入参数:无* 返回值:无* 函数作用:提前唤醒中断回调函数*/ void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg) { ClearWWDG(); // 用户函数内调用HAL库的零碎函数“ HAL_WWDG_Refresh()”刷新计数器值,实现喂狗操作 printf("-------复位前保留数据------\n\r"); printf("--------- 软件喂狗 --------\n\r");}