IWDG
iwdg溢出时间计算:
IWDG溢出时间计算公式:
寄存器设置分频系数的方法:
iwdg配置步骤:
1,取消PR/RLR寄存器写保护,设置IWDG预分频系数和重装载值,启动IWDG
HAL_IWDG_Init()
2,及时喂狗,即写入0xAAAA 到IWDG_KR
HAL_IWDG_Refresh()
源码
wdg.c
#include "./BSP/WDG/wdg.h"
IWDG_HandleTypeDef g_iwdg_handle;
void iwdg_init(uint8_t prer, uint16_t rlr) //IWDG初始化函数,设置参数方便后续代码修改
{
g_iwdg_handle.Instance = IWDG;
g_iwdg_handle.Init.Prescaler = prer;
g_iwdg_handle.Init.Reload = rlr;
HAL_IWDG_Init(&g_iwdg_handle);
}
void iwdg_feed(void) //喂狗函数
{
HAL_IWDG_Refresh(&g_iwdg_handle);
}
wdg.h
#ifndef __WDG_H
#define __WDG_H
#include "./SYSTEM/sys/sys.h"
void iwdg_init(uint8_t prer, uint16_t rlr);
void iwdg_feed(void);
#endif
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/WDG/wdg.h"
int main(void)
{
uint8_t len;
uint16_t times = 0;
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟为72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
printf("您还没有喂狗,请及时喂狗!!!\r\n");
iwdg_init(IWDG_PRESCALER_32 ,1250); //预分频系数为32,重装载值为1250,溢出时间约为1s
while (1)
{
delay_ms(1000);
iwdg_feed();
printf("已经喂狗\r\n");
}
}
WWDG
WWDG 超时时间计算:
程序预设:计数器值为0x7F,窗口值为0x5F,预分频系数(2^WDGTB)为8
WWDG配置步骤:
1,WWDG工作参数初始化 HAL_WWDG_Init()
2,WWDG Msp初始化 HAL_WWDG_MspInit() 配置NVIC、CLOCK等
3,设置优先级,使能中断 HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
4,编写中断服务函数 WWDG_IRQHandler() àHAL_WWDG_IRQHandler
5,重定义提前唤醒回调函数 HAL_WWDG_EarlyWakeupCallback()
6,在窗口期内喂狗 HAL_WWDG_Refresh()
源码
wdg.c
#include "./BSP/WDG/wdg.h"
#include "./BSP/LED/led.h"
WWDG_HandleTypeDef g_wwdg_handle;
void wwdg_init(uint8_t tr, uint8_t wr, uint16_t fprer) //窗口看门狗初始化函数
{
g_wwdg_handle.Instance = WWDG;
g_wwdg_handle.Init.Counter = tr;
g_wwdg_handle.Init.Prescaler = fprer;
g_wwdg_handle.Init.Window = wr;
g_wwdg_handle.Init.EWIMode = WWDG_EWI_ENABLE;
HAL_WWDG_Init(&g_wwdg_handle);
}
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg) //WWDG MSP回调函数
{
__HAL_RCC_WWDG_CLK_ENABLE();
HAL_NVIC_SetPriority(WWDG_IRQn, 2, 3);
HAL_NVIC_EnableIRQ(WWDG_IRQn);
}
void WWDG_IRQHandler(void) //WWDG中断服务函数
{
HAL_WWDG_IRQHandler(&g_wwdg_handle);
}
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg) //WWDG提前唤醒回调函数
{
LED1(1);
}
wdg.h
#ifndef __BSP_H
#define __BSP_H
#include "./SYSTEM/sys/sys.h"
extern WWDG_HandleTypeDef g_wwdg_handle;
void wwdg_init(uint8_t tr, uint8_t wr, uint16_t fprer);
#endif
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/WDG/wdg.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟,72M */
delay_init(72); /* 初始化延时函数 */
usart_init(115200); //波特率设置为115200
led_init(); /* 初始化LED */
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\r\n");
wwdg_init(0x7f, 0x5f, WWDG_PRESCALER_8); //窗口看门狗初始化
while(1)
{
delay_ms(29); //30到58之间能喂狗成功
HAL_WWDG_Refresh(&g_wwdg_handle);
}
}
IWDG和WWDG的主要区别