目录
1.判断是由RCC上电或者复位键导致的复位 还是有看门狗导致的复位;
2.开启LSI时钟(不需要我们操作,只需要知道有这一步就够了);
IWDG(独立看门狗)
1.判断是由RCC上电或者复位键导致的复位 还是有看门狗导致的复位;
RCC_GetFlagStatus();(查看标志位)
RCC_ClearFlag();(清除标志位)
2.开启LSI时钟(不需要我们操作,只需要知道有这一步就够了);
3.解除IWDG_PR和IWDG_RLR的写保护;
IWDG_WriteAccessCmd(); (0x555解除保护 0x000开启保护)
4.写入预分频器(PR)和重装载寄存器(RLR);
IWDG_SetPrescaler();(写预分频器)
IWDG_SetReload();(写重装值)
超时时间:T(iwdg) = T(lsi) × PR预分频系数 × (RL + 1)
其中:Tlsi = 1 / Flsi (0.025ms)
5.启动独立看门狗;
启动看门狗之前可以先喂一次狗
IWDG_Enable();(启动独立看门狗)
开启之后 不用手动打开写保护(喂狗或者启动独立看门狗的过程系统会自动开启写保护)
6.主循环中不断执行喂狗;
IWDG_ReloadCounter();(重新装载寄存器)喂狗
代码示例
独立看门狗
主函数
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
int main(void)
{
/*模块初始化*/
OLED_Init(); //OLED初始化
Key_Init(); //按键初始化
/*显示静态字符串*/
OLED_ShowString(1, 1, "IWDG TEST");
/*判断复位信号来源*/
if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET) //如果是独立看门狗复位
{
OLED_ShowString(2, 1, "IWDGRST"); //OLED闪烁IWDGRST字符串
Delay_ms(500);
OLED_ShowString(2, 1, " ");
Delay_ms(100);
RCC_ClearFlag(); //清除标志位
}
else //否则,即为其他复位
{
OLED_ShowString(3, 1, "RST"); //OLED闪烁RST字符串
Delay_ms(500);
OLED_ShowString(3, 1, " ");
Delay_ms(100);
}
/*IWDG初始化*/
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //独立看门狗写使能
IWDG_SetPrescaler(IWDG_Prescaler_16); //设置预分频为16
IWDG_SetReload(2499); //设置重装值为2499,独立看门狗的超时时间为1000ms
IWDG_ReloadCounter(); //重装计数器,喂狗
IWDG_Enable(); //独立看门狗使能
while (1)
{
Key_GetNum(); //调用阻塞式的按键扫描函数,模拟主循环卡死
IWDG_ReloadCounter(); //重装计数器,喂狗
OLED_ShowString(4, 1, "FEED"); //OLED闪烁FEED字符串
Delay_ms(200); //喂狗间隔为200+600=800ms
OLED_ShowString(4, 1, " ");
Delay_ms(600);
}
}