stm32學習筆記 F1系列獨立看門狗與窗口看門狗

看門狗解決的問題:
   在啓動正常運行的時候,系統不能復位。
   在系統跑飛(程序異常執行)的情況,系統復位,程序重新執行。
TM32內置兩個看門狗,提供了更高的安全性,時間的精確性和使用的靈活性。兩個看門狗設備(獨立看門狗/窗口看門狗)可以用來檢測和解決由軟件錯誤引起的故障。當計數器達到給定的超時值時,觸發一箇中斷(僅適用窗口看門狗)或者產生系統復位。
1)獨立看門狗(IWDG)由專用的低速時鐘(LSI)驅動,即使主時鐘發生故障它仍有效。
  獨立看門狗適合應用於需要看門狗作爲一個在主程序之外 能夠完全獨立工作,並且對時間精度要求低的場合。
2)窗口看門狗由從APB1時鐘分頻後得到時鐘驅動。通過可配置的時間窗口來檢測應用程序非正常的過遲或過早操作。  
   窗口看門狗最適合那些要求看門狗在精確計時窗口起作用的程序。

獨立看門狗功能描述:
1>在鍵值寄存器(IWDG_KR)中寫入0xCCCC,開始啓用獨立看門狗。此時計數器開始從其復位值0xFFF遞減,當計數器值計數到尾值0x000時會產生一個復位信號(IWDG_RESET)。
2>無論何時,只要在鍵值寄存器IWDG_KR中寫入0xAAAA(通常說的喂狗),自動重裝載寄存器IWDG_RLR的值就會重新加載到計數器,從而避免看門狗復位。
3>如果程序異常,就無法正常喂狗,從而系統復位。

獨立看門狗寄存器:
1>鍵值寄存器IWDG_KR: 0~15位有效
2>預分頻寄存器IWDG_PR:0~2位有效,預分頻因子爲:4×2^pr。具有寫保護功能,要操作先取消寫保護
3>重裝載寄存器IWDG_RLR:0~11位有效。具有寫保護功能,要操作先取消寫保護。
(在鍵值寄存器(IWDG_KR)中寫入0x5555,允許訪問IWDG_PR和IWDG_RLR寄存器。)
4>狀態寄存器IWDG_SR:0~1位有效

IWDG獨立看門狗操作庫函數
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消寫保護:0x5555使能
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//設置預分頻係數:寫PR
void IWDG_SetReload(uint16_t Reload);//設置重裝載值:寫RLR
void IWDG_ReloadCounter(void);//喂狗:寫0xAAAA到KR
void IWDG_Enable(void);//使能看門狗:寫0xCCCC到KR
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//狀態:重裝載/預分頻更新

獨立看門狗操作步驟
①  取消寄存器寫保護:
      IWDG_WriteAccessCmd();
②  設置獨立看門狗的預分頻係數,確定時鐘:
     IWDG_SetPrescaler();
③  設置看門狗重裝載值,確定溢出時間:。
    IWDG_SetReload();
④  使能看門狗
    IWDG_Enable();
⑤  應用程序喂狗:
   IWDG_ReloadCounter();

溢出時間計算:

   Tout=((4×2^prer) ×rlr) /40 (M3)



窗口看門狗:

之所以稱爲窗口就是因爲其喂狗時間是一個有上下限的範圍內(窗口),你可以通過設定相關寄存器,設定其上限時間(下限固定)。喂狗的時間不能過早也不能過晚。

而獨立看門狗限制喂狗時間在0-x內,x由相關寄存器決定。喂狗的時間不能過晚。

窗口看門狗工作過程總結:
STM32F的窗口看門狗中有一個7位的遞減計數器T[6:0],它會在出現下述2種情況之一時產生看門狗復位:
1>當喂狗的時候如果計數器的值大於某一設定數值W[6:0]時,此設定數值在WWDG_CFR寄存器定義。
2>當計數器的數值從0x40減到0x3F時【T6位跳變到0】 。
如果啓動了看門狗並且允許中斷,當遞減計數器等於0x40時產生早期喚醒中斷(EWI),它可以用於喂狗以避免WWDG復位。
爲什麼要窗口看門狗:
對於一般的看門狗,程序可以在它產生復位前的任意時刻刷新看門狗,但這有一個隱患,有可能程序跑亂了又跑回到正常的地方,或跑亂的程序正好執行了刷新看門狗操作,這樣的情況下一般的看門狗就檢測不出來了;如果使用窗口看門狗,程序員可以根據程序正常執行的時間設置刷新看門狗的一個時間窗口,保證不會提前刷新看門狗也不會滯後刷新看門狗,這樣可以檢測出程序沒有按照正常的路徑運行非正常地跳過了某些程序段的情況。
窗口看門狗其他注意事項:
1>上窗口值W[6:0]必須大於下窗口值0x40。否則就無窗口了。
2>窗口看門狗時鐘來源PCLK1(APB1總線時鐘)分頻後。
常用寄存器和庫函數描述:
控制寄存器WWDG_CR
void WWDG_Enable(uint8_t Counter);//啓動並設置初始值
void WWDG_SetCounter(uint8_t Counter);//喂狗
配置寄存器WWDG_CFR
void WWDG_EnableIT(void);//使能提前喚醒中斷
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
void WWDG_SetWindowValue(uint8_t WindowValue);
狀態寄存器WWDG_SR
FlagStatus WWDG_GetFlagStatus(void);
void WWDG_ClearFlag(void);
窗口看門狗配置過程:
① 使能看門狗時鐘:
     RCC_APB1PeriphClockCmd();
② 設置分頻係數:
     WWDG_SetPrescaler();
③ 設置上窗口值:
     WWDG_SetWindowValue();
④ 開啓提前喚醒中斷並分組(可選):
     WWDG_EnableIT();   
     NVIC_Init();
⑤ 使能看門狗:
     WWDG_Enable();
⑥ 喂狗:
    WWDG_SetCounter();
⑦ 編寫中斷服務函數
    WWDG_IRQHandler();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章