窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
窗口看门狗的超时公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
Twwdg:WWDG 超时时间(单位为 ms)
Fpclk1:APB1 的时钟频率(单位为 Khz)
WDGTB:WWDG 的预分频系数
T[5:0]:窗口看门狗的计数器低 6 位
DS0(连接在PF9) ,DS1(连接在PF10。程序一运行则开启WWDG,并使得DS0亮300ms后关闭,进入死循环。等待WWDG中断的到来,在中断里面,喂狗,并执行DS1的翻转操作。所以可以看到DS1不停的闪烁,而DS0只在刚启动的时候闪一下。
窗口看门狗.c文件如下。- u8 WWDG_CNT=0X7F;
- //初始化窗口看门狗
- //tr :T[6:0],计数器值 wr :W[6:0],窗口值
- //fprer:分频系数(WDGTB),仅最低 2 位有效
- //Fwwdg=PCLK1/(4096*2^fprer). 一般 PCLK1=42Mhz
- void WWDG_Init(u8 tr,u8 wr,u32 fprer)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
- //使能窗口看门狗时钟
- WWDG_CNT=tr&WWDG_CNT; //初始化 WWDG_CNT.
- WWDG_SetPrescaler(fprer); //设置分频值
- WWDG_SetWindowValue(wr); //设置窗口值
- WWDG_SetCounter(WWDG_CNT);//设置计数值
- WWDG_Enable(WWDG_CNT); //开启看门狗
- NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn; //窗口看门狗中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //抢占优先级为 2
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //响应优先级为 3
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能窗口看门狗
- NVIC_Init(&NVIC_InitStructure);
- WWDG_ClearFlag();//清除提前唤醒中断标志位
- WWDG_EnableIT();//开启提前唤醒中断
- }
- //窗口看门狗中断服务程序
- void WWDG_IRQHandler(void)
- {
- WWDG_SetCounter (WWDG_CNT); //重设窗口看门狗值
- WWDG_ClearFlag();//清除提前唤醒中断标志位
- LED1=!LED1;
- }
复制代码
全部程序51hei下载地址:
STM32F4窗口看门狗.7z
(294.42 KB, 下载次数: 15)
|