1 #include "stm32f4xx.h"
2 #include "sys.h"
3 #include "delay.h"
4 #include "usart.h"
5 #include "led.h"
6 #include "key.h"
7 #include "wwdg.h"
8
10 int main(void){
11
12 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
13 delay_init(168); //初始化延时函数
14 LED_Init(); //初始化LED端口
15 KEY_Init(); //初始化按键
16 LED0=0; //点亮LED0
17 delay_ms(300);
18 WWDG_Init(0x7F,0X5F,WWDG_Prescaler_8); //计数器值为7f,窗口寄存器为5f,分频数为8
19 while(1)
20 {
21 LED0=1; //熄灭LED灯
22 }
23 }
24
25 #include "wwdg.h"
26 #include "led.h"
27
28 //保存WWDG计数器的设置值,默认为最大.
29 u8 WWDG_CNT=0X7F;
30 //初始化窗口看门狗
31 //tr :T[6:0],计数器值
32 //wr :W[6:0],窗口值
33 //fprer:分频系数(WDGTB),仅最低2位有效
34 //Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=42Mhz
35 void WWDG_Init(u8 tr,u8 wr,u32 fprer){
36
37 NVIC_InitTypeDef NVIC_InitStrcter;
38
39 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
40 WWDG_CNT = tr&WWDG_CNT;//初始化
41
42
43
44 WWDG_SetPrescaler(fprer);//设置分频值WDGTB WWDG_CFR[7,8]
45
46 WWDG_SetWindowValue(wr);//设置窗口值 WWDG_CFR[0..6] 0x5f 101 1111
47 /*这里我们的 WWDG_CR 只有低八位有效, T[6: 0]用来存储看门狗的计数器值,
48 随时更新的,每个窗口看门狗计数周期( 4096× 2^ WDGTB)减 1。当该计数器的值从 0X40 变
49 为 0X3F 的时候,将产生看门狗复位。
50 WDGA 位则是看门狗的激活位,该位由软件置 1,以启动看门狗,并且一定要注意的是该
51 位一旦设置,就只能在硬件复位后才能清零了。
52 */
53 WWDG_Enable(WWDG_CNT);//开启看门狗,WWDG_CR[7] 并设置了初始值WWDG_CR[0..6]0x7f 111 1111
54
55
56 NVIC_InitStrcter.NVIC_IRQChannel = WWDG_IRQn;
57 NVIC_InitStrcter.NVIC_IRQChannelPreemptionPriority=0x02;
58 NVIC_InitStrcter.NVIC_IRQChannelSubPriority=0x03;
59 NVIC_InitStrcter.NVIC_IRQChannelCmd=ENABLE;
60
61 NVIC_Init(&NVIC_InitStrcter);
62
63 /*
64 状态寄存器( WWDG_SR),该寄存器用来记录当前是否有提前唤醒
65 的标志。该寄存器仅有位 0 有效,其他都是保留位。当计数器值达到 40h 时,此位由硬件置 1。
66 它必须通过软件写 0 来清除。对此位写 1 无效。 即使中断未被使能, 在计数器的值达到 0X40
67 的时候, 此位也会被置 1。
68 */
69 WWDG_ClearFlag();//清除提前唤醒标志位 WWDG_SR
70
71 /*EWI 是提前唤醒中断,也就是在快要产生复位的前一段时间( T[6:0]=0X40) 来
72 提醒我们,需要进行喂狗了,否则将复位!因此,我们一般用该位来设置中断,当窗口看门狗
73 的计数器值减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中断,向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。注意这里在进入中断后, 必
74 须在不大于 1 个窗口看门狗计数周期的时间(在 PCLK1 频率为 42M 且 WDGTB 为 0 的条件下,
75 该时间为 97.52us)内重新写 WWDG_CR,否则,看门狗将产生复位!
76 */
77 WWDG_EnableIT();//开启提前唤醒中断WWDG_CFR[9] EWI
78
79 }
80
81 void WWDG_IRQHandler(){
82
83 WWDG_SetCounter(WWDG_CNT);//重设看门狗
84 WWDG_ClearFlag();
85 LED1=!LED1;
86
87
88
89
90
91 }