在微控制器執行的過程中,我們可能會遇到程式陷入死迴圈的情況。很顯然我們需要對這種情況進行提前的預防。看門狗就是用來進行該工作的。看門狗分為獨立看門狗和視窗看門狗,這一節介紹的是獨立看門狗。
stm32的獨立看門狗由內部專門的40khz低速時鐘驅動,與系統主時鐘分開工作,也就是說,主時鐘損壞時,看門狗仍然可以正常使用。這個低速時鐘是乙個rc時鐘,並不是很精確,頻率在30~60khz之間。
看門狗的作用就是在一定時間內(通過定時計數器實現) 沒有接收餵狗訊號(表示 mcu 已經掛了),便實現處理器的自動復位重啟(傳送復位訊號)。設定看門狗的步驟如下:
設預分頻係數為prer,重裝載值為rlr,則餵狗的時間計算公式為(t的單位為ms):
\[t=\frac \times r l r}
\]$\frac $ 即 $\frac $ 是乙個週期的長度,也就是計數器加一所需要的時間。\(4\times 2^\)是預分頻係數的值。預分頻係數乘以週期得到的是分頻後計數器加一所用的時間。而這個時間再乘以重裝載值rlr得到的是一次餵狗的時間。
可能有人會問,\(2^\)不是預分頻係數了嗎?為什麼還要乘以4?這裡可以看一下庫函式中對分頻係數的一系列預定義。可以看到,當設定prer引數為0時,預分頻係數為4,也就是說,我們設定引數為0時,預分頻係數都不是0,而是4。因此,這裡需要把這個4乘進去。#define iwdg_prescaler_4 ((uint8_t)0x00)
#define iwdg_prescaler_8 ((uint8_t)0x01)
#define iwdg_prescaler_16 ((uint8_t)0x02)
#define iwdg_prescaler_32 ((uint8_t)0x03)
#define iwdg_prescaler_64 ((uint8_t)0x04)
#define iwdg_prescaler_128 ((uint8_t)0x05)
#define iwdg_prescaler_256 ((uint8_t)0x06)
int main(void)
delay_ms(10);
}}
#ifndef __wdg_h
#define __wdg_h
#include "sys.h"
void iwdg_init(u8 prer, u16 rlr); //獨立看門狗初始化函式
void iwdg_feed(void); //餵狗函式
#endif
#include "wdg.h"
void iwdg_init(u8 prer, u16 rlr)
void iwdg_feed(void)
至此,我們就完成了獨立看門狗的學習。為了手中微控制器的性命,還是盡量讓看門狗發揮一點作用吧。
IWDG 獨立看門狗
本章參考資料 stm32f4xx 中文參考手冊 iwdg 章節。學習本章時,配合 stm32f4xx 中文參考手冊 iwdg 章節一起閱讀,效果會更佳,特別是涉及到暫存器說明的部分。iwdg 簡介stm32 有兩個看門狗,乙個是獨立看門狗另外乙個是視窗看門狗,獨立看門狗號稱寵 物狗,視窗看門狗號稱警...
stm32獨立看門狗實驗
alientek mini stm32開發板v1.9範例 5 獨立看門狗實驗 正點原子 alientek 技術論壇 www.openedv.com stm32f103rbt6屬於中容量版本的mcu 看門狗的原理 微控制器系統在外界的干擾下會出現程式跑飛的現象導致出現死迴圈,看門狗電路就是為了避免這種...
STM32 獨立看門狗異常復位
程式中使用了定時器來執行餵狗操作,void tim4 irqhandler void if g iwdg cnt 200 iwdg feed 每隔100ms喂一次狗 tim clearitpendingbit tim4,tim it update 看門狗定時1s復位,iwdg config iwdg...