來我們看看wwdg.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;
}
wwdg.c文件一共包含兩個函數。第一個函數void WWDG_Init(u8 tr,u8 wr,u8 fprer)用來設置 WWDG的初始化值。包括看門狗計數器的值和看門狗比較值等。該函數就是按照我們上面5 個步驟的思路設計出來的代碼。注意到這里有個全局變量WWDG_CNT,該變量用來保存最初設置WWDG_CR計數器的值。在后續的中斷服務函數里面,就又通過WWDG_SetCounter函數把該數值放回到WWDG_CR上。
最后在中斷服務函數里面,先重設窗口看門狗的計數器值,然后清除提前喚醒中斷標志。最后對LED1(DS1)取反,來監測中斷服務函數的執行狀況。
wwdg.h 頭文件內容比較簡單,這里我們就不做過多講解。
在完成了以上部分之后,我們就回到主函數,代碼如下:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
delay_init(168); //初始化延時函數
LED_Init(); //初始化 LED 端口
KEY_Init(); //初始化按鍵
LED0=0; //點亮 LED0
delay_ms(300);
WWDG_Init(0x7F,0X5F,WWDG_Prescaler_8);
//計數器值為 7f,窗口寄存器為5f,分頻數為8
while(1)
{
LED0=1; //熄滅 LED 燈
}
}
該函數通過 LED0(DS0)來指示是否正在初始化。而 LED1(DS1)用來指示是否發生了中斷。我們先讓 LED0亮 300ms,然后關閉以用于判斷是否有復位發生了。在初始化 WWDG 之后,我們回到死循環,關閉LED1,并等待看門狗中斷的觸發/復位。
在編譯完成之后,我們就可以下載這個程序到探索者 STM32F4 開發板上,看看結果是不是和我們設計的一樣。
上一篇:STM32操作訪問內部Flash
下一篇:STM32f4獨立看門狗實驗代碼
推薦閱讀
史海拾趣