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 }