目錄
1、窗口看門狗概述
2、常用寄存器和庫函數配置
3、窗口看門狗實驗
1、窗口看門狗概述
之所以稱為窗口就是因為其喂狗時間是一個有上下限的范圍內(窗口),你可以通過設定相關寄存器,設定其上限時間(下限固定)。喂狗的時間不能過早也不能過晚。
而獨立看門狗限制喂狗時間在0-x內,x由相關寄存器決定。喂狗的時間不能過晚。
窗口看門狗工作示意圖:
?窗口看門狗工作過程總結:
STM32F的窗口看門狗中有一個7位的遞減計數器T[6:0],它會在出現下述2種情況之一時產生看門狗復位:
- 當喂狗的時候如果計數器的值大于某一設定數值W[6:0]時,此設定數值在WWDG_CFG寄存器定義。
- 當計數器的數值從0x40減到0x3F時[T6位跳變到0]。
如果啟動了看門狗并且允許中斷,當遞減計數器等于0x40時產生早期喚醒中斷(EWI),它可以用于喂狗以避免WWDG復位。
為什么要窗口看門狗:
對于一般的看門狗,程序可以在它產生復位前的任意時刻刷新看門狗,但這有一個隱患,有可能程序跑亂了又跑回到正常的地方,或跑亂的程序正好執行到了刷新看門狗操作,這樣的情況下一般的看門狗就檢測不出來了。
如果使用窗口看門狗,程序員可以根據程序正常執行的時間設置刷新看門狗的一個時間窗口,保證不會提前刷新看門狗也不會滯后刷新看門狗,這樣可以檢測出程序沒有按照正常的路徑運行非正常地跳過了某些程序段的情況。
窗口看門狗其他注意事項:
- 上窗口值W[6:0]必須大于下窗口0x40.否則就無窗口了。
- 窗口看門狗時鐘來源PCLK1(APB1總線時鐘)分頻后。
2、常用寄存器和庫函數配置
- 控制寄存器WWDG_CR
- 配置寄存器WWDG_CFR
- 狀態寄存器WWDG_SR
窗口看門狗配置過程:
- 使能看門狗時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); //使能窗口看門狗時鐘
- 設置分頻系數
WWDG_SetPrescaler(fprer); //設置分頻值
- 設置上窗口值
WWDG_SetWindowValue(wr); //設置窗口值
- 開啟提前喚醒中斷并分組(可選)
WWDG_EnableIT();//開啟提前喚醒中斷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_Enable(WWDG_CNT); //開啟看門狗
- 喂狗
WWDG_SetCounter(WWDG_CNT); //重設窗口看門狗值
- 編寫中斷服務函數
//窗口看門狗中斷服務程序 void WWDG_IRQHandler(void) {WWDG_SetCounter(WWDG_CNT); //重設窗口看門狗值WWDG_ClearFlag();//清除提前喚醒中斷標志位LED1=!LED1; }
3、窗口看門狗實驗
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "wwdg.h"//ALIENTEK 探索者STM32F407開發板 實驗7
//窗口看門狗實驗 -庫函數版本
//技術支持:www.openedv.com
//淘寶店鋪:http://eboard.taobao.com
//廣州市星翼電子科技有限公司
//作者:正點原子 @ALIENTEK int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2delay_init(168); //初始化延時函數LED_Init(); //初始化LED端口KEY_Init(); //初始化按鍵LED0=0; //點亮LED0delay_ms(300);WWDG_Init(0x7F,0X5F,WWDG_Prescaler_8); //計數器值為7f,窗口寄存器為5f,分頻數為8 while(1){LED0=1; //熄滅LED燈}
}
wwdg.c
#include "wwdg.h"
#include "led.h"
//
//本程序只供學習使用,未經作者許可,不得用于其它任何用途
//ALIENTEK STM32F407開發板
//看門狗 驅動代碼
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//創建日期:2014/6/12
//版本:V1.0
//版權所有,盜版必究。
//Copyright(C) 廣州市星翼電子科技有限公司 2014-2024
//All rights reserved
//********************************************************************************
//V1.1 20140504
//增加了窗口看門狗相關函數。
// //保存WWDG計數器的設置值,默認為最大.
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; //搶占優先級為2NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子優先級為3NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能窗口看門狗NVIC_Init(&NVIC_InitStructure);WWDG_ClearFlag();//清除提前喚醒中斷標志位WWDG_EnableIT();//開啟提前喚醒中斷
}//窗口看門狗中斷服務程序
void WWDG_IRQHandler(void)
{WWDG_SetCounter(WWDG_CNT); //重設窗口看門狗值WWDG_ClearFlag();//清除提前喚醒中斷標志位LED1=!LED1;
}
效果視頻:
7、窗口看門狗實驗