一.独立看门狗
1.环境配置
先看时钟树 看独立看门狗是由哪个时钟源来进行使能
明显能够看到是由LSI作为看门狗的时钟来源
由于外接晶振一般会比内部时钟源更加精确,所以我们这里的时钟源选用外部晶振的时钟
也就是我们下一步要配置RCC
配置看门狗的分频系数和重装载值 我这里通过公式得到时间周期是1s 具体读者可以自行进行计算 这里的一个主要注意点就是计数器是从上向下计数 的,也就是我们的重装载的值到0进行递减
setup开始编码
2.编码注意点
1.注意独立看门狗没有中断服务函数 只要窗口服务函数才有
2.喂狗函数需要引用iwdg.h 的头文件 否则无法调用函数
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
{
/* Reload IWDG counter with value defined in the reload register */
__HAL_IWDG_RELOAD_COUNTER(hiwdg);
//这这里里面函数将计数的寄存器清零,充分计数
/* Return function status */
return HAL_OK;
}
二、窗口看门狗
顾名思义,时间段是一个窗口,不能太早也不能太迟 太早喂狗或者是太迟喂狗都会产生复位信号,同时窗口看门狗允许中断的产生
我们可以在中断服务函数里面加入自己的服务函数,相比于独立看门狗更加灵活
基本原理就是有几个值 递减计数器 、窗口上限(重载值)、窗口下限、
注意下窗口是定值 0x3f
总结:窗口看门狗有两种情况会产生复位
1,喂狗时间大于窗口上限值
2,计数器值从0x40减到0x3F
如果启动看门狗并且允许中断,当递减计数器等于0x40时,会产生唤醒中断EWI,它可以用于喂狗避免WWDG复位
1.环境配置
上窗口的值是80 下然后不分配 计数器从127向下进行计数
使能中断 计数器到0x40将产生中断
接着配置中断优先级等等
2.编码阶段
1.使能时钟,窗口看门狗不同于独立看门狗,是受APB1时钟控制,需要进行使能
__HAL_RCC_WWDG_CLK_ENABLE();
2.编写中断服务函数和回调函数处理逻辑
void WWDG_IRQHandler(void)
{
/* USER CODE BEGIN WWDG_IRQn 0 */
/* USER CODE END WWDG_IRQn 0 */
HAL_WWDG_IRQHandler(&hwwdg);
/* USER CODE BEGIN WWDG_IRQn 1 */
/* USER CODE END WWDG_IRQn 1 */
}
__weak void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(hwwdg);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_WWDG_EarlyWakeupCallback could be implemented in the user file
*/
}