【轉】STM32 獨立看門狗簡介

STM32 的獨立看門狗由內部專門的 40Khz 低速時鐘驅動,即便主時鐘發生故障,它也仍然有效css

看門狗的原理:單片機系統在外界的干擾下會出現程序跑飛的現象致使出現死循環,看門狗電路就是爲了不這種狀況的發生。看門狗的做用就是在必定時間內(經過定時計數器實現)沒有接收喂狗信號(表示 MCU 已經掛了),便實現處理器的自動復位重啓(發送復位信號) 。函數

鍵值寄存器(IWDG_KR)中寫入 0xCCCC,開始啓用獨立看門狗;此時計數器開始從其復位值 0xFFF 遞減計數。當計數器計數到末尾 0x000 時,會產生一個復位信號(IWDG_RESET)。不管什麼時候,只要鍵寄存器 IWDG_KR 中被寫入 0xAAAA,  IWDG_RLR 中的值就會被從新加載到計數器中從而避免產生看門狗復位  。ui

IWDG_PR 和 IWDG_RLR 寄存器具備寫保護功能。要修改這兩個寄存器的值,必須先向IWDG_KR 寄存器中寫入 0x5555。將其餘值寫入這個寄存器將會打亂操做順序,寄存器將從新被保護。重裝載操做(即寫入 0xAAAA)也會啓動寫保護功能。spa

只要對以上三個寄存器進行相應的設置,咱們就能夠啓動 STM32 的獨立看門狗,啓動過程能夠按以下步驟實現(獨立看門狗相關的庫函數和定義分佈在文件 stm32f10x_iwdg.h 和stm32f10x_iwdg.c 中) :code

1)取消寄存器寫保護(向 IWDG_KR 寫入 0X5555)it

經過這步,咱們取消 IWDG_PR 和 IWDG_RLR 的寫保護,使後面能夠操做這兩個寄存器,設置 IWDG_PR 和 IWDG_RLR 的值。這在庫函數中的實現函數是:class

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);原理

2)設置獨立看門狗的預分頻係數和重裝載值 循環

設置看門狗的分頻係數的函數是:程序

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);  //設置 IWDG 預分頻值

設置看門狗的重裝載值的函數是:

void IWDG_SetReload(uint16_t Reload); //設置 IWDG 重裝載值

設置好看門狗的分頻係數 prer 和重裝載值就能夠知道看門狗的喂狗時間 (也就是看門狗溢出時間) ,該時間的計算方式爲:

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

其中 Tout 爲看門狗溢出時間(單位爲 ms) ;prer 爲看門狗時鐘預分頻值(IWDG_PR 值),範圍爲 0~7;rlr 爲看門狗的重裝載值(IWDG_RLR 的值) ;

好比咱們設定 prer 值爲 4, rlr 值爲 625,那麼就能夠獲得 Tout=64×625/40=1000ms,這樣,看門狗的溢出時間就是 1s,只要你在一秒鐘以內,有一次寫入 0XAAAA 到 IWDG_KR,就不會致使看門狗復位(固然寫入屢次也是能夠的)。這裏須要提醒你們的是,看門狗的時鐘不是準確的 40Khz,因此在喂狗的時候,最好不要太晚了,不然,有可能發生看門狗復位。

3)重載計數值喂狗(向 IWDG_KR 寫入 0XAAAA)

庫函數裏面重載計數值的函數是:

IWDG_ReloadCounter();   //按照 IWDG 重裝載寄存器的值重裝載 IWDG 計數器

經過這句,將使 STM32 從新加載 IWDG_RLR 的值到看門狗計數器裏面。 即實現獨立看門狗的喂狗操做。

4)  啓動看門狗(向 IWDG_KR 寫入 0XCCCC)

庫函數裏面啓動獨立看門狗的函數是:

IWDG_Enable();   //使能 IWDG

經過這句,來啓動 STM32 的看門狗。注意 IWDG 在一旦啓用,就不能再被關閉!想要關閉,只能重啓,而且重啓以後不能打開 IWDG,不然問題依舊,因此在這裏提醒你們,若是不用 IWDG 的話,就不要去打開它,省得麻煩。

點擊(此處)摺疊或打開

  1. #include "sys.h"
  2. #include "iwdg.h"
  3. /**
  4.  * 初始化獨立看門狗
  5.  * prer:分頻數:0~7(只有低 3 位有效!)
  6.  * 分頻因子=4*2^prer.但最大值只能是 256!
  7.  * rlr:重裝載寄存器值:低 11 位有效.
  8.  * 時間計算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
  9.  */
  10. void IWDG_Init(u8 prer,u16 rlr)
  11. {
  12.     IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* 使能對寄存器IWDG_PR和IWDG_RLR的寫操做*/
  13.     IWDG_SetPrescaler(prer);    /*設置IWDG預分頻值:設置IWDG預分頻值*/
  14.     IWDG_SetReload(rlr);     /*設置IWDG重裝載值*/
  15.     IWDG_ReloadCounter();    /*按照IWDG重裝載寄存器的值重裝載IWDG計數器*/
  16.     IWDG_Enable();        /*使能IWDG*/
  17. }
  18. /**
  19.  * 喂獨立看門狗
  20.  */
  21. void IWDG_Feed(void)
  22. {
  23.     IWDG_ReloadCounter();    /*reload*/
  24. }
相關文章
相關標籤/搜索