1. 程式人生 > >stm32F4XX之視窗看門狗 HAL庫

stm32F4XX之視窗看門狗 HAL庫

首先講一下獨立看門狗和視窗看門狗之間的區別。

獨立看門狗Iwdg——獨立於系統之外,因為有獨立時鐘,一般是外部低速時鐘。主要用於監視硬體錯誤。

視窗看門狗wwdg——系統內部的故障探測器,採用內部RCC時鐘,時鐘與系統相同。如果系統時鐘不走了,這個狗也就失去作用了。主要用於監視軟體錯誤

1)獨立看門狗沒有中斷,視窗看門狗有中斷

2)獨立看門狗有硬體軟體之分,視窗看門狗只能軟體控制

3)獨立看門狗只有下限,視窗看門狗又下限和上限

4)獨立看門狗是12位遞減的。視窗看門狗是7位遞減的

5)獨立看門狗是用的內部的大約40KHZ RC振盪器(不受系統時鐘限制,即使系統時鐘壞了也能工作),視窗看門狗是用的系統時鐘APB1ENR(系統時鐘要是掛了就完了)

總結起來的區別點大致有如下幾點

1:時鐘軟不同

2:是否產生中斷

3:監視功能分工不同

4:喂狗限制不同

接下來我們一起看一下視窗看門狗的相關內容。

1:簡介

視窗看門狗通常被用來監測,由外部干擾或不可預見的邏輯條件造成的應用程式背離正常的執行序列而產生的軟體故障。除非遞減計數器的值在 T6 位變成 0 前被重新整理,看門狗電路在 達到預置的時間週期時,會產生一個 MCU 復位。如果在遞減計數器達到視窗暫存器值之前 重新整理控制暫存器中的 7 位遞減計數器值,也會產生 MCU 復位。這意味著必須在限定的時間 視窗內重新整理計數器。

2:主要特性

● 可程式設計的自由執行遞減計數器
● 復位條件
— 當遞減計數器值小於 0x40 時復位(如果看門狗已啟用)
— 在視窗之外過載遞減計數器時復位(如果看門狗已啟用)
● 提前喚醒中斷 (EWI):當遞減計數器等於 0x40 時觸發(如果已使能且看門狗已啟用)

3:功能說明

如果啟用看門狗(WWDG_CR 暫存器中的 WDGA 位置 1),則當 7 位遞減計數器(T[6:0] 位)從 0x40 滾動到 0x3F(T6 已清零)時會引發復位。當計數器值大於視窗暫存器中所存 儲的值時,如果軟體過載計數器,則會產生復位。

應用程式在正常執行過程中必須定期地寫入 WWDG_CR 暫存器以防止 MCU 發生復位。只 有當計數器值低於視窗暫存器值時,才能執行此操作。儲存在 WWDG_CR 暫存器中的值必 須介於 0xFF 和 0xC0 之間。在系統復位後,看門狗總是處於關閉狀態。可通過設定 WWDG_CR 暫存器中的 WDGA 位 來使能看門狗,之後除非執行復位操作,否則不能再次關閉。

遞減計數器處於自由執行狀態:即使禁止看門狗,遞減計數器仍繼續遞減計數。當使能看門狗時,必須將 T6 位置 1,以防止立即復位。T[5:0] 位包含了看門狗產生復位之前的計時數目;復位前的延時時間在一個最小值和一個最大 值之間變化,這是因為寫入 WWDG_CR 暫存器時,預分頻值是未知的。配 置暫存器 (WWDG_CFR) 包含視窗的上限:為防止發生復位

如果在產生實際復位之前必須執行特定的安全操作或資料記錄,則可使用提前喚醒中斷(EWI)。通過設定 WWDG_CFR 暫存器中的 EWI 位使能 EWI 中斷。當遞減計數器的值為0x40 時,將生成 EWI 中斷。在復位器件之前,可以使用相應的中斷服務程式 (ISR) 來觸發特定操作(例如通訊或資料記錄)。在某些應用中,可以使用 EWI 中斷來管理軟體系統檢查和/或系統恢復/功能退化,而不會生 成 WWDG 復位。在這種情況下,相應的中斷服務程式 (ISR) 可用來過載 WWDG 計數器以 避免 WWDG 復位,然後再觸發所需操作。通過將 0 寫入 WWDG_SR 暫存器中的 EWIF 位來清除 EWI 中斷。

上圖中T[6:0]就是 WWDG_CR 的低七位,W[6:0]即是 WWDG->CFR 的低七位。T[6:0]就是視窗看門狗的計數器,而 W[6:0]則是視窗看門狗的上視窗,下視窗值是固定的(0X40)。當視窗看門狗的計數器在上視窗值之外被重新整理,或者低於下視窗值都會產生復位。上視窗值(W[6:0])是由使用者自己設定的,根據實際要求來設計視窗值,但是一定要確保視窗值視窗值大於 0X40,否則視窗就不存在了。
視窗看門狗的超時公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;

其中:
Twwdg:WWDG 超時時間(單位為 ms)
Fpclk1:APB1 的時鐘頻率(單位為 Khz)
WDGTB:WWDG 的預分頻係數
T[5:0]:視窗看門狗的計數器低 6 位

根據上面的公式,假設 Fpclk1=45Mhz,那麼可以得到最小-最大超時時間表如表 11.1.1 所示

                                            

4:暫存器描述

可以看出,這裡我們的 WWDG_CR 只有低八位有效,T[6:0]用來儲存看門狗的計數器值,隨時更新的,每個視窗看門狗計數週期(4096×2^ WDGTB)減 1。當該計數器的值從 0X40 變為 0X3F 的時候,將產生看門狗復位。WDGA 位則是看門狗的啟用位,該位由軟體置 1,以啟動看門狗,並且一定要注意的是該位一旦設定,就只能在硬體復位後才能清零了。

視窗看門狗的第二個暫存器是配置暫存器(WWDG_CFR),該暫存器的各位及其描述如下圖所示

該位中的 EWI 是提前喚醒中斷,也就是在快要產生復位的前一段時間(T[6:0]=0X40)來提醒我們,需要進行喂狗了,否則將復位!因此,我們一般用該位來設定中斷,當視窗看門狗的計數器值減到 0X40 的時候,如果該位設定,並開啟了中斷,則會產生中斷,我們可以在中斷裡面向 WWDG_CR 重新寫入計數器的值,來達到喂狗的目的。注意這裡在進入中斷後,必須在不大於 1 個視窗看門狗計數週期的時間(在 PCLK1 頻率為 42M 且 WDGTB 為 0 的條件下,該時間為 97.52us)內重新寫 WWDG_CR,否則,看門狗將產生復位!

最後我們要介紹的是狀態暫存器(WWDG_SR),該暫存器用來記錄當前是否有提前喚醒的標誌。該暫存器僅有位 0 有效,其他都是保留位。當計數器值達到 40h 時,此位由硬體置 1。它必須通過軟體寫 0 來清除。對此位寫 1 無效。即使中斷未被使能,在計數器的值達到 0X40的時候,此位也會被置 1。

最後附上相關程式碼

WWDG_HandleTypeDef WWDG_Handler;     //視窗看門狗控制代碼

//儲存WWDG計數器的設定值,預設為最大
u8 WWDG_CNT=0X7F;


//初始化視窗看門狗 	
//tr   :T[6:0],計數器值 
//wr   :W[6:0],視窗值 
//fprer:分頻係數(WDGTB),僅最低2位有效 
//Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=45Mhz
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
    WWDG_Handler.Instance=WWDG;
    WWDG_Handler.Init.Prescaler=fprer;   //設定分頻係數
    WWDG_Handler.Init.Window=wr;         //設定視窗值
    WWDG_Handler.Init.Counter=tr;        //設定計數器值
    HAL_WWDG_Init(&WWDG_Handler);        //初始化WWDG
    HAL_WWDG_Start_IT(&WWDG_Handler);    //開啟視窗看門狗  
}



//WWDG底層驅動,時鐘配置,中斷配置
//此函式會被HAL_WWDG_Init()呼叫
//hwwdg:視窗看門狗控制代碼
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{   
    __HAL_RCC_WWDG_CLK_ENABLE();    //使能視窗看門狗時鐘
        
    HAL_NVIC_SetPriority(WWDG_IRQn,2,3);    //搶佔優先順序2,子優先順序為3
    HAL_NVIC_EnableIRQ(WWDG_IRQn);          //使能視窗看門狗中斷
}



//視窗看門狗中斷服務函式
void WWDG_IRQHandler(void)
{
    HAL_WWDG_IRQHandler(&WWDG_Handler);//呼叫WWDG共用中斷處理函式
}



//中斷服務函式處理過程
//此函式會被HAL_WWDG_IRQHandler()呼叫
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
    HAL_WWDG_Refresh(&WWDG_Handler,WWDG_CNT);//更新視窗看門狗值
    LED1=!LED1; 
}