0%

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#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,喂狗时间不满足要求,程序被看门狗复位

}
}