WWDG

 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 }

 

转载于:https://www.cnblogs.com/KING9/p/8698313.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值