一.独立看门狗(IWDG)
1.IWDG简介
- IWDG本质上是一个12位的递减经济暑期,计数器从初始值一直减到0是,系统会产生一个复位信号,CPU接收到这个信号后,会重新启动系统。
- 在计数器减到0之前,如果通过程序给他喂一次食物 “喂狗”,那么就不会产生复位信号,系统也将正常运行。
2.IWDG配置所需函数
HAL_IWDG_Init() //初始化函数
HAL_IWDG_Refresh() //喂狗函数
3.IWDG溢出时间计算
- Tout:看门狗溢出时间
- Fiwdg:看门狗的时钟频率
- psc:看门狗预分频系数
- rlr:看门狗装载值
- 看门狗的超时时间(40kHz的输入时钟(LSI))
例:算出1秒
1s = 1250 * 32/40
二.窗口看门狗
1.WWDG简介
窗口看门狗的本质是一个能传声复位信号和提前唤醒中断的计数器。
产生复位条件:
- 递减计数器从0X40减到0X3F是复位。
- 计数器的值大于W[6:0]值喂狗会复位
产生中断条件
- 当递减计数器等于0X40时可产生提前唤醒中断
2.WWDG所需函数
HAL_WWDG_Init(); //初始化
HAL_WWDG_MspInit();
__HAL_RCC_WWDG_CLK_ENABLE(); //时钟开启函数
HAL_NVIC_SetPriority(); //中断优先级函数
HAL_NVIC_EnableIRQ(); //启动中断函数
WWDG_IRQHandler(); //中断服务函数
HAL_WWDG_EarlyWakeupCallback(); //提前唤醒和回调函数
HAL_WWDG_Refresh(); //喂狗
3.WWDG溢出时间计算
窗口看门狗的时序图
这里使用的是F1系列所以用的是APB1 = 36Mhz,如果用其他系列的根据手册计算。
从0X3F开始到0X7F最多可以计数64个数。
例如,计数器的值为0X7F(127),窗口的值设置为0X50(80)。 127-80 = 47,计47个数
超时时间计算:(4096 * 2^3 *47) / 32 = 42.7ms;
4.WWDG配置步骤
5.窗口看门狗喂狗实验
实验目的:
开启窗口看门狗,计数器值设置为 0X7F ,窗口值设置为 0X50 ,预分频系数为 8 。在 while 循环里喂狗, 同时翻转 LED1 状态;在提前唤醒中断服务函数进行喂狗,同时翻转 LED2 状态
wwdg.c
#include "wwdg.h"
#include "led.h"
WWDG_HandleTypeDef wwdg_handler = {0};
//设置预分频系数,重装载值,及窗口值
void wwdg_init(uint8_t TR,uint8_t wr,uint32_t psc)
{
wwdg_handler.Instance = WWDG;
wwdg_handler.Init.Prescaler = psc;
wwdg_handler.Init.EWIMode = WWDG_EWI_ENABLE;
wwdg_handler.Init.Counter = TR; //计数器的值
wwdg_handler.Init.Window = wr;
HAL_WWDG_Init(&wwdg_handler);
}
//MSP初始化
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
__HAL_RCC_WWDG_CLK_ENABLE();
HAL_NVIC_SetPriority(WWDG_IRQn,2,2);
HAL_NVIC_EnableIRQ(WWDG_IRQn);
}
//中断服务函数
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&wwdg_handler);
}
//提前唤醒回调函数
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
led2_toggle();
}
/*喂狗函数*/
void wwdg_feed(void)
{
HAL_WWDG_Refresh(&wwdg_handler);
}
wwdg.h
#ifndef __WWDG_H__
#define __WWDG_H__
#include "sys.h"
void wwdg_init(uint8_t TR,uint8_t wr,uint32_t psc);
void wwdg_feed(void);
#endif
实验结果
- 超时时间:(4096 * 2^3 *47) / 32 = 42.7ms;
- 1.在main.c的while循环中当delay_ms设置为43毫秒时,程序正常运行。
- 2.设置为42毫秒时,程序一直重启,实验完成。
三.窗口看门狗和独立看门狗的区别
对比点 | 独立看门狗 | 窗口看门狗 |
时钟源 | 独立时钟LSI(40KHz),不精确 | PCLK1(36MHZ),精确 |
复位条件 | 递减计数到0 | 窗口期外喂狗或减到0X3F |
中断 | 无 | 计数器减到0x40可产生中断 |
递减计数器位数 | 12位(最大计数范围:4096~0) | 7位(最大计数范围:127~63) |
喂狗方式 | 写入键寄存器,重装固定值RLR | 直接写入计数器,写多少重装多少 |
应用场合 | 防止程序跑飞,死循环,死机 | 检测程序时效,防止软件异常 |