1.窗口看门狗概念
独立看门狗是可以早,但是不可以晚。
窗口看门口是不能过早,也不能过早。
示意图
意思:初值下降到W[6:0]前不能喂狗
小于3FH就会产生复位
2.窗口看门狗框图
首先时钟来源PCLK,经过预分频后作为窗口看门狗时钟
1.在WWDG_CR >WWDG_CFR的时候去喂狗的话,就会输出1,如果这时候启动位WDGA为1启动了,就会输出1,产生复位。
2.当减到0了,T6位为0了,经过取反,输出了1,又与启动位同时为1,就会产生复位
就是喂狗过早过晚都不行。
这是用于提前提醒窗口看门狗要喂狗了
2.窗口看门狗超时时间
注意事项
上窗口值必须大于下窗口值0x40,要不然连窗口都没有了。
2.窗口看门狗寄存器
1.WWDG_CR
第七位就是使能位
0到6位是当计数器,当从40h变成3fh时(T6变成0),就会产生看门狗复位
2.WWDG_CFR
位0-位6存上窗口值
位8-位7,确定分频系数
位9,是否提前唤醒中断
2.WWDG_SR
提前唤醒中断标志位
不管有没有中断,到达40h,都会置位
3.窗口看门狗HAl库函数
1.HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
初始化函数,分频系数,上窗口,转载值
2. HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg);
时钟使能,中断分组
3.HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg);
启动看门狗
3. HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg);
启动看门狗和中断
4.HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t Counter);
喂狗
5.HAL_WWDG_IRQHandler(WWDG_HandleTypeDef hwwdg);
中断处理函数,不说了,通用处理函数,还有一个回调函数
6.HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef hwwdg);
中断的回调函数
4.窗口看门狗配置过程
5.窗口看门狗代码
喂狗时候会打印
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
WWDG_HandleTypeDef hwwdg;
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg) //回调函数
{
__HAL_RCC_WWDG_CLK_ENABLE(); //使能时钟
HAL_NVIC_SetPriority(WWDG_IRQn,2,3);
HAL_NVIC_EnableIRQ(WWDG_IRQn);
}
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&hwwdg);
}
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
printf("123\r\n");
HAL_WWDG_Refresh(hwwdg,0x7f);
}
int main(void)
{
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
hwwdg.Instance = WWDG;
hwwdg.Init.Prescaler = WWDG_PRESCALER_1; //预分频系数(45M/4096=1373*8hz)
hwwdg.Init.Window = 0x5f; //上窗口值
hwwdg.Init.Counter = 0x7f; //计数值(0x7f-0x40+1=64)个时钟0.0466*8=0.37s
HAL_WWDG_Init(&hwwdg); //初始化
HAL_WWDG_Start_IT(&hwwdg); //使能窗口看门狗与提前唤醒中断
while(1)
{
}
}