一、WDG简介
由于看门狗的代码很少所以就直接在main主函数中写了,没单独建文件
二、独立看门狗
涉及的按键可参考之前的key.c和key.h文件
独立看门狗配置流程:
1.开启时钟(LSI)
2.解除IWDG_PR和IWDG_RLR的写保护
3.写入预分频和重装值
4.启用独立看门狗
5.喂狗
相关函数:
IWDG_WriteAccessCmd() //写使能控制
IWDG_SetPrescaler() //写预分频器
IWDG_SetReload() //写重装值
IWDG_ReloadCounter() //重新装载寄存器(喂狗)
IWDG_Enable() //启动独立看门狗
IWDG_GetFlagStatus() //获取标志位状态
main.c文件
#include "stm32f10x.h"
#include "stm32f10x_iwdg.h"
#include "delay.h"
#include "OLED.h"
#include "key.h"
int main (void)
{
//初始化
OLED_Init();
key_Init();
OLED_ShowString(1,1,"IWDG TEST:");
//如果查看独立看门狗复位标志位==SET说明本次复位是独立看门狗导致的
//否则是正常复位导致的
if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET)
{
OLED_ShowString(2,1,"IWDGRST");
delay_ms(500);
OLED_ShowString(2,1,"");
delay_ms(100);
RCC_ClearFlag();
}else
{
OLED_ShowString(3,1,"RST");
delay_ms(500);
OLED_ShowString(3,1,"");
delay_ms(100);
}
//开启时钟
/*如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG*/
//解除写保护
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//写预分频器
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);
}
}
三、窗口看门狗
相关函数:
WWDG_DeInit(); //恢复缺省配置
WWDG_SetPrescaler( ); //写入预分频器
WWDG_SetWindowValue( ); //写入窗口值
WWDG_EnableIT(); //使能中断
WWDG_SetCounter(); //写入计数器
WWDG_Enable( ); //使能窗口看门狗
FlagStatus WWDG_GetFlagStatus();
WWDG_ClearFlag();
涉及的按键可参考之前的key.c和key.h文件
main.c文件
#include "stm32f10x.h"
#include "stm32f10x_wwdg.h"
#include "delay.h"
#include "OLED.h"
#include "key.h"
int main (void)
{
//初始化
OLED_Init();
key_Init();
OLED_ShowString(1,1,"WWDG TEST:");
//如果查看独立看门狗复位标志位==SET说明本次复位是独立看门狗导致的
//否则是正常复位导致的
if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)==SET)
{
OLED_ShowString(2,1,"WWDGRST");
delay_ms(500);
OLED_ShowString(2,1,"");
delay_ms(100);
RCC_ClearFlag();
}else
{
OLED_ShowString(3,1,"RST");
delay_ms(500);
OLED_ShowString(3,1,"");
delay_ms(100); }
//开启时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
//写入预分频器
WWDG_SetPrescaler(WWDG_Prescaler_8);
//写入窗口值
WWDG_SetWindowValue(0x40|21);
//使能
WWDG_Enable(0x40|54);
while(1)
{
key_Getnum();
OLED_ShowString(4,1,"FEED");
delay_ms(20);
OLED_ShowString(4,1," ");
delay_ms(20);
WWDG_SetCounter(0x40|54);
}
}