STM32—窗口看门狗
一、WWDG简介
1,WWDG的全称:Window watchdog,即窗口看门狗
2,WWDG的本质:能产生系统复位信号和提前唤醒中断的计数器
3,WWDG的特性:递减的计数器
当递减计数器值从 0x40减到0x3F时复位(即T6位跳变到0)
计数器的值大于W[6:0]值时喂狗会复位
提前唤醒中断 (EWI):当递减计数器等于 0x40 时可产生
4,喂狗:在窗口期内重装载计数器的值,防止复位
WWDG的作用
1,作用:用于监测单片机程序运行时效是否精准,主要检测软件异常
2,应用:需要精准检测程序运行时间的场合
二、WWDG工作原理
三、WWDG框图
四、WWDG寄存器
控制寄存器 (WWDG_CR)
配置寄存器 (WWDG_CFR)
状态寄存器 (WWDG_SR)
五、WWDG超时时间计算
WWDG最短最长超时时间(F1为例)
六、WWDG配置步骤
相关HAL库函数介绍
七、示例(验证窗口看门狗功能)
#include "./BSP/WWDG/wwdg.h"
#include "./BSP/LED/led.h"
#include "./SYSTEM/delay/delay.h"
WWDG_HandleTypeDef g_wwdg_handle;
void wwdg_init(uint8_t tr,uint8_t wr,uint32_t fprer)
{
g_wwdg_handle.Instance = WWDG;//基地址
g_wwdg_handle.Init.Window = wr;//窗口值
g_wwdg_handle.Init.Prescaler = fprer;//分频系数
g_wwdg_handle.Init.Counter = tr;//计数值
g_wwdg_handle.Init.EWIMode = WWDG_EWI_ENABLE;//提前唤醒中断使能
HAL_WWDG_Init(&g_wwdg_handle);
}
/* MSP回调函数 */
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(&g_wwdg_handle);
}
/* 重新定义中断唤醒函数 */
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
//delay_ms(1);
HAL_WWDG_Refresh(&g_wwdg_handle);
LED0_TOGGLE();
}
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/WWDG/wwdg.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 初始化时钟, 72Mhz */
delay_init(72);
led_init(); /* LED初始化 */
usart_init(115200); /* 波特率115200 */
if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET)
{
printf("窗口看门狗复位\r\n");
__HAL_RCC_CLEAR_RESET_FLAGS();
}
else
{
printf("外部复位\r\n");
}
delay_ms(500);
printf("请在窗口期喂狗\r\n");
wwdg_init(0x7f,0x5f,WWDG_PRESCALER_8);
while(1)
{
//delay_ms(90);
HAL_WWDG_Refresh(&g_wwdg_handle);
LED1_TOGGLE();
}
}