目录
1、独立看门狗的介绍(IWDG)
什么是看门狗
独立看门狗的本质
独立看门狗框架图
独立看门狗时钟
重装载寄存器
键寄存器
溢出时间计算公式
独立看门狗的实验
使用STM32CubeMX创建工程
1、配置SYS
2、配置RCC
3、配置时钟
4、配置GPIO-选按键对应的GPIO口
5、配置IWDG
6、配置串口
7、配置工程名称、工程路径
8、选择固件库
代码实现
效果图
2、窗口看门狗(WWDG)
窗口看门狗介绍
WWDG框图
控制寄存器
配置寄存器
状态寄存器
超时时间计算
窗口看门狗的实验
使用STM32CubeMX创建工程
1、配置SYS
2、配置RCC
3、配置时钟
4、配置GPIO
5、配置WWDG
6、配置工程名称、工程路径
7、选择固件库
代码实现
3、独立看门狗和窗口看门狗的异同点
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到外界电磁场的干扰,造成程序跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog)。
独立看门狗工作在主程序之外能够完全独立工作,他的时钟是专用的低速时钟(LSI),由VDD电压供电,在停止模式和待机模式下仍能工作。
简单举一个例子来说就是有一个程序员叫张三,老板养了一条狗用来监督张三持续工作,张三需要定时喂养这条狗以确保老板知道自己一直在努力工作,如果有一次没有喂养这条狗,那么狗就会反骨咬死张三,张三就会重新升天投胎为程序员继续工作,同时老板还是派这条狗来监督张三的工作,张三同样也需要定时喂养他,往复持续
本质是一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET
如果在计时器没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。
独立看门狗的时钟由独立的RC震荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。启用IWDG后,LSI时钟会自动开启。LSI时钟频率并不精确,F1用40kHz。
LSI经过一个8位的预分频器得到计数器时钟。
重装载寄存器是一个12位的寄存器,用于存放重装载值,低12位有效,即最大值为4096,这个值的大小决定着独立看门狗的溢出时间。
键寄存器IWDG_KR可以说是独立看门狗的一个控制寄存器,主要有三种控制方法,往这个寄存器写入下面三个不同的值有不同的效果。
开启独立看门狗,溢出时间为5秒,使用按键进行喂狗,不喂狗时反复执行main函数,导致串口一反复输出“程序开始执行”,喂狗时只执行一次main函数,只会往串口发送一次“程序开始执行”
独立看门狗喂狗函数HAL_IWDG_Refresh();
原型:HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
参数:IWDG_HandleTypeDef *hiwdg:独立看门狗句柄
实例:HAL_IWDG_Refresh(&hiwdg);
//main函数里面
//这里设置的看门狗是5秒,如果5秒内没有进行喂狗就会复位
HAL_UART_Transmit(&huart1,(uint8_t*)"程序开始运行》》》\r\n",strlen("程序开始运行》》》\r\n"),100);
while (1)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET){
//按下key1就开始喂狗
HAL_IWDG_Refresh(&hiwdg);
}
}
窗口看门狗用于监测单片机程序运行时效是否精准,主要检测软件异常,一般用于需要精准检测程序运行时间的场合。
窗口看门狗的本质时一个能产生系统复位信号和提前唤醒中断的6位计数器
产生复位的条件:
产生中断的条件:
在窗口期内重装载计数器的值,防止复位,也就是所谓的喂狗。
开启窗门看门狗,计数器值设置为0x7F(127),窗口值设置为0x5F(95),预分频器的时基为8,。不喂狗时反复执行main函数,导致LED1闪烁,喂狗时只执行一次main函数,LED1常亮。在提前唤醒中断服务函数进行喂狗,防止程序复位,LED1常亮,同时翻转LED2的状态。
以上三步和上面一样,这里就不重复了
这里两步与上面的也是一样的
//中断函数
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{ //发生中断喂狗
HAL_WWDG_Refresh(hwwdg);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);//发生中断对小灯的状态进行翻转
}
//mian函数部分
MX_GPIO_Init();
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);//在窗口看门狗初始化之前把led1拉低使它亮起来
HAL_Delay(300);
MX_WWDG_Init();
while (1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//窗口看门狗初始化完成之后就把led2拉高变暗,后续中断发生就产生翻转然后点亮
HAL_Delay(40);
}