14-2独立看门狗&窗口看门狗

IWDG常用函数

1
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);

写使能控制

1
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);

写预分频器,即写PR寄存器

1
void IWDG_SetReload(uint16_t Reload);

写重装值,即写RLR寄存器

1
void IWDG_ReloadCounter(void);

重新装载寄存器(喂狗)

1
void IWDG_Enable(void);

启用看门狗使能

1
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);

获取标志位状态

1
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);

查看RCC标志位,查看时钟Ready和各种Reset标志位

独立看门狗

main.c

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
#include "stm32f10x.h"                  // Device header#include "Delay.h"#include "OLED.h"#include "KEY.h"  int main(void){	OLED_Init();	KEY_Init(); 	OLED_ShowString(1,1,"IWDG TEST"); 	if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)//查看RCC标志位,是不是IWDG复位	{		OLED_ShowString(2,1,"IWDGRST");		Delay_ms(500);		OLED_ShowString(2,1,"       ");		Delay_ms(500); 		RCC_ClearFlag();//清除标志位	}	else	{		OLED_ShowString(3,1,"RST");		Delay_ms(500);		OLED_ShowString(3,1,"   ");		Delay_ms(500);	} 	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//解除写保护	//根据预分频值和重装值,超时时间是1000ms	IWDG_SetPrescaler(IWDG_Prescaler_16);//配置预分频	IWDG_SetReload(2499);//配置重装值	IWDG_ReloadCounter();//先喂一次狗	IWDG_Enable();//使能看门狗	while(1)	{		Key_GetNum();//获取按键值		IWDG_ReloadCounter();//喂狗		OLED_ShowString(4,1,"FEED");		Delay_ms(200);		OLED_ShowString(4,1,"    ");		Delay_ms(600); 		//Delay_ms(800);//延时800ms,程序不会被看门狗复位		//Delay_ms(1200);//延时1200ms,喂狗时间不满足要求,程序被看门狗复位 	}} 

WWDG常用函数

1
void WWDG_DeInit(void);

WWDG恢复缺省配置

1
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

WWDG写入预分频值

1
void WWDG_SetWindowValue(uint8_t WindowValue);

WWDG写入窗口值

1
void WWDG_EnableIT(void);

WWDG使能中断

1
void WWDG_SetCounter(uint8_t Counter);

WWDG写入计数器(喂狗)

1
void WWDG_Enable(uint8_t Counter);

WWDG使能窗口看门狗

1
FlagStatus WWDG_GetFlagStatus(void);

WWDG获取标志位

1
void WWDG_ClearFlag(void);

WWDG清除标志位

窗口看门狗

main.c

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
#include "stm32f10x.h"                  // Device header#include "Delay.h"#include "OLED.h"#include "KEY.h"  int main(void){	OLED_Init();	KEY_Init(); 	OLED_ShowString(1,1,"WWDG TEST"); 	if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)//查看RCC标志位,是不是WWDG复位	{		OLED_ShowString(2,1,"WWDGRST");		Delay_ms(500);		OLED_ShowString(2,1,"       ");		Delay_ms(500); 		RCC_ClearFlag();//清除标志位	}	else	{		OLED_ShowString(3,1,"RST");		Delay_ms(500);		OLED_ShowString(3,1,"   ");		Delay_ms(500);	}	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//开启窗口看门狗时钟 	WWDG_SetPrescaler(WWDG_Prescaler_8);//设置预分频值	WWDG_SetWindowValue(0x40 | 21);//设置窗口值,窗口时间30ms	WWDG_Enable(0x40 | 54);//使能,超时时间50ms   	while(1)	{		Key_GetNum();//获取按键值  		OLED_ShowString(4,1,"FEED");		Delay_ms(20);		OLED_ShowString(4,1,"    ");		Delay_ms(20); 		WWDG_SetCounter(0x40 | 54);//WWDG喂狗 		//Delay_ms(800);//延时800ms,程序不会被看门狗复位		//Delay_ms(1200);//延时1200ms,喂狗时间不满足要求,程序被看门狗复位 	}}  
🔍 ×