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 的話,就不要去打開它,省得麻煩。
點擊(此處)摺疊或打開