3F 是0111111
40 是1000000
0X7F 127
0X5F 95 127-95=32
注意:中断是在0x40,在0x40喂狗则程序不会复位
在0x5F之前喂狗会复位,减小到63以下也会复位
在0x5F与0x3F之间喂狗会继续执行,不会复位
WWDG_HandleTypeDef WWDG_Handler; //窗口看门狗句柄
//初始化窗口看门狗
//tr :T[6:0],计数器值
//wr :W[6:0],窗口值
//fprer:分频系数(WDGTB),仅最低2位有效
//Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=42Mhz
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
WWDG_Handler.Instance=WWDG;
WWDG_Handler.Init.Prescaler=fprer; //设置分频系数
WWDG_Handler.Init.Window=wr; //设置窗口值
WWDG_Handler.Init.Counter=tr; //设置计数器值
WWDG_Handler.Init.EWIMode=WWDG_EWI_ENABLE; //使能提前唤醒中断
HAL_WWDG_Init(&WWDG_Handler); //初始化WWDG
}
//WWDG底层驱动,时钟配置,中断配置
//此函数会被HAL_WWDG_Init()调用
//hwwdg:窗口看门狗句柄
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
__HAL_RCC_WWDG_CLK_ENABLE(); //使能窗口看门狗时钟
HAL_NVIC_SetPriority(WWDG_IRQn,2,3); //抢占优先级2,子优先级为3
HAL_NVIC_EnableIRQ(WWDG_IRQn); //使能窗口看门狗中断
}
//窗口看门狗中断服务函数
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&WWDG_Handler);//调用WWDG共用中断处理函数
}
//中断服务函数处理过程,中断在0x40
//此函数会被HAL_WWDG_IRQHandler()调用
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg) //数到0x40 喂狗,就不会复位了
{
HAL_WWDG_Refresh(&WWDG_Handler);//更新窗口看门狗值
LED1=!LED1;
}
//中断服务函数处理过程
//此函数会被HAL_WWDG_IRQHandler()调用
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
delay_ms(2);
HAL_WWDG_Refresh(&WWDG_Handler);//更新窗口看门狗值
LED1=!LED1;
}
注意:延时2ms时,标红代码不会执行,因为已经复位喂狗
同时,while里面函数也正常运行