单片机:STM32F407
开发板:DMF407电机开发板
平台:keil V5.31
HSE 为8MHZ
HSI为16MHZ



配置:
WWDG_HandleTypeDef wwdg_handler; /* 窗口看门狗句柄 */
/**
* @brief 初始化窗口看门狗
* @param tr: T[6:0],计数器值
* @param tw: W[6:0],窗口值
* @note fprer:分频系数(WDGTB),范围:WWDG_PRESCALER_1~WWDG_PRESCALER_8,表示2^WDGTB分频
* Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=42Mhz
* @retval 无
*/
void wwdg_init(uint8_t tr, uint8_t wr, uint32_t 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 */
}
/**
* @brief WWDG底层驱动,时钟配置,中断配置
此函数会被HAL_WWDG_Init()调用
* @param hwwdg:窗口看门狗句柄
* @retval 无
*/
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); /* 使能窗口看门狗中断 */
}
/**
* @brief 窗口看门狗中断服务程序
* @param 无
* @retval 无
*/
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&wwdg_handler); /* 调用WWDG共用中断处理函数 */
}
/**
* @brief 中断服务函数处理过程
此函数会被HAL_WWDG_IRQHandler()调用
* @param 无
* @retval 无
*/
extern uint32_t irqnum;
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(&wwdg_handler); /* 更新窗口看门狗值 */
LED1_TOGGLE(); /* 绿灯闪烁 */
irqnum++;
}
主函数:
extern WWDG_HandleTypeDef wwdg_handler; /* 窗口看门狗句柄 */
uint32_t temp=0;
uint32_t random_num=0;
uint32_t PCLK1=0;
uint32_t PCLK2=0;
uint32_t feednum=0;
uint32_t irqnum=0;
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
LED0(0); /* 点亮LED0(红灯) */
delay_ms(300); /* 延时100ms再初始化看门狗,LED0的变化"可见" */
PCLK1=HAL_RCC_GetPCLK1Freq();
PCLK2=HAL_RCC_GetPCLK2Freq();
printf("\nreset,PCLK1=%d,PCLK2=%d,r=%d\n",PCLK1,PCLK2,random_num);
wwdg_init(0x7F, 0x5F, WWDG_PRESCALER_8);/* 计数器值为7F,窗口寄存器为5F,分频数为8 */
while(1)
{
printf("temp=%d,irqnum=%d,feednum=%d\n",temp,irqnum,feednum);
if(temp<34)
{
temp++;
}
else
{
LED0_TOGGLE(); /* 关闭LED0(红灯) */
HAL_WWDG_Refresh(&wwdg_handler); /* 更新窗口看门狗值 */
temp=0;
feednum++;
}
delay_us(1000);
}
}
测试结果:
1、当temp<6时,喂狗就复位

2、temp<7,可以喂狗

3、temp<12,可以喂狗

4、temp<13,可以喂狗,喂11次触发复位

5、temp<14,可以喂狗触发复位

6、temp<20,可以喂狗触发复位

7、temp<21,可以喂狗触发EWI中断

8、temp<24,可以喂狗触发EWI中断,1000次后触发复位

9、temp<25,可以喂狗触发EWI中断,100次后触发复位

10、temp<26,可以喂狗触发EWI中断,11次后触发复位

11、temp<27,可以喂狗触发EWI中断,12次后触发复位

12、temp<28,可以喂狗触发EWI中断,1次后触发复位
