stm32正点原子学习笔记(30)窗口看门狗

 

PCLK频率过高,要先除以4096,再预分频

恩????不应该是T小于W才能喂狗吗?

这里计算的是最大超时时间

 

硬件复位清除?

 

 main.h

 1 #include "exti.h"
 2 #include "wwdg.h"
 3 #include "delay.h"
 4 
 5 int main(void)
 6 {
 7     LedInit();
 8     delay_init();
 9     LED0=0;
10     delay_ms(200);
11     wwdg_init(0x7f,0x5f,WWDG_Prescaler_8);//喂狗成功则LED0熄灭,失败则复位,LED0闪烁
12     while(1)
13     {
14         LED0=1;
15     }
16 }

wwdg.c

 1 #include "wwdg.h"
 2 
 3 u8 wwdg_CNT=0x7f;//用于取后七位
 4 
 5 void wwdg_NVIC_init()
 6 {
 7     
 8     NVIC_InitTypeDef NVIC_InitStructure;
 9     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
10     
11     NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;
12     NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
13     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
14     NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
15     NVIC_Init(&NVIC_InitStructure);
16     
17 }
18 
19 void wwdg_init(u8 tr,u8 wr,u32 fprer)//初值,窗口值,预分频系数
20 {
21     RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
22     wwdg_CNT=tr&wwdg_CNT;
23     WWDG_SetPrescaler(fprer);
24     WWDG_SetWindowValue(wr);
25     WWDG_Enable(wwdg_CNT);
26     
27     WWDG_ClearFlag();
28     wwdg_NVIC_init();
29     WWDG_EnableIT();//开中断
30     
31 }
32 
33 
34 void wwdg_set_count(u8 cnt)
35 {
36     WWDG_Enable(cnt);
37 }
38 
39 
40 void WWDG_IRQHandler()
41 {
42     wwdg_set_count(wwdg_CNT);
43     WWDG_ClearFlag();
44     LED1=!LED1;
45     
46 }

wwdg.h

 1 #ifndef __WWDG_H
 2 #define __WWDG_H
 3 
 4 #include "sys.h"
 5 #include "led.h"
 6 
 7 void wwdg_init(u8 tr,u8 wr,u32 fprer);//初值,窗口值,预分频系数
 8 void wwdg_set_count(u8 cnt);
 9 
10 #endif

中断服务函数这里

不能交换位置

原因:

 https://blog.csdn.net/weixin_44174362/article/details/86529808

posted @ 2019-06-03 20:24  裂缘冰释  阅读(486)  评论(0编辑  收藏  举报