因爲單片機的工做經常會受到來自外界電磁場的干擾,形成各類寄存器和內存數據混亂,會致使程序指針錯誤,不在程序區,取出錯誤的程序指令等,都會陷入死循環,程序的正常運行被打斷,由單片機控制的系統沒法正常工做,會形成整個系統陷入停滯狀態,發生不可預料的後果。ide
STM32F4xx具備兩個看門狗外設,都可用於檢測並解決由軟件錯誤致使的故障,當計數器達到給定的超時值時,觸發一箇中斷(僅適用於窗口型看門狗)或產生系統復位。ui
獨立看門狗(IWDG)由其專用的低速時鐘(LSI)驅動,所以,即使在主時鐘發生故障時仍然保持工做狀態。窗口看門狗(WWDG)時鐘由APB1時鐘經預分頻後提供,經過可配置的時間窗口來檢測應用程序非正常的過遲或過早的操做。spa
LSI RC 可做爲低功耗時鐘源在停機和待機模式下保持運行,因此,在MCU進入停機或待機模式時,看門狗仍能正常運行,因此須要定時喚醒喂狗,不然,MCU復位重啓。指針
獨立看門狗適用於那些須要看門狗做爲一個在主程序外,可以徹底獨立工做,而且對時間精度要求較低的場合。窗口看門狗適合那些要求看門狗在精確計時窗口起做用的應用程序。code
當經過對關鍵字寄存器(IWDG_KR)寫入值0xCCCC啓動獨立看門狗時,計數器開始從復位值0xFFF遞減計數。當計數器計數到終值(0x000)時會產生一個復位信號(IWDG復位)。blog
任什麼時候候將關鍵字0xAAAA寫到IWDG_KR寄存器中,IWDG_RLR的值就會被重載到計數器,從而避免產生看門狗復位。事件
硬件看門狗
若是經過選項字節位使能「硬件看門狗」功能,上電時將自動使能看門狗,若是在計數器計數結束前,若軟件沒有向關鍵字寄存器寫入相應的值,則系統會產生復位。圖片
關於選項字節內存
選項字節(字,地址0x1FFF C000) ...... USER:用戶選項字節
此字節用於配置如下用能:
選擇看門狗:硬件或軟件
進入停機模式時產生復位事件
進入待機模式時產生復位時間bit 7 nRST_STDBY
0:進入待機模式時產生復位
1:不產生復位bit 6 nRST_STOP
0:進入停機模式時產生復位
1:不產生復位bit 5 WDG_SW
0:硬件看門狗
1:軟件看門狗...... 注:關於bit7和bit6的說明
1.進入待機模式時產生復位:
此復位的使能方式是清零用戶選項字節中的nRST_STDBY位。使能後,只要成功執行進入待機模式序列,MCU就將復位,而非進入待機模式。
2.進入停機模式時產生復位:
此復位的使能方式是清零用戶選項字節中的nRST_STOP位。使能後,只要成功執行進入中止模式序列,MCU就將復位,而非進入待機模式。ci
32kHz(LSI)頻率條件下IWDG超時週期的最小值/最大值
預分頻器 | PR[2:0]位 | 最短超時(ms) RL[11:0] = 0x000 |
最長超時(ms) RL[11:0] = 0xFFF |
---|---|---|---|
/4 | 0 | 0.125 | 512 |
/8 | 1 | 0.25 | 1024 |
/16 | 2 | 0.5 | 2048 |
/32 | 3 | 1 | 4096 |
/64 | 4 | 2 | 8192 |
/128 | 5 | 4 | 16384 |
/256 | 6 | 8 | 32768 |
/*IWDG看門狗初始化*/ void IWDTDOG_Init(void) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_256); IWDG_SetReload((u16)(SYSWDG_TIMEOUT * 1000 /6.4 + 0.5)); IWDG_ReloadCounter(); } /*使能IWDG看門狗*/ void IWDG_Enable(void) { IWDG->KR = KR_KEY_ENABLE; } /*使能對IWDG_PR和IWDG_RLR寄存器的寫訪問*/ void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) { assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); IWDG->KR = IWDG_WriteAccess; } /*設置IWDG預分頻器的值*/ void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) { assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler)); IWDG->PR = IWDG_Prescaler; } /*設置IWDG的重載值*/ void IWDG_SetReload(uint16_t Reload) { assert_param(IS_IWDG_RELOAD(Reload)); IWDG->RLR = Reload; } /*將Reload register的值從新加載IWDG計數器,喂狗操做*/ void IWDG_ReloadCounter(void) { IWDG->KR = KR_KEY_RELOAD; }
至此,IWDG看門狗已經初始化完畢,並開啓,須要調用IWDG_ReloadCounter()定時喂狗。
STM32F系列的MCU看門狗開啓以後是關閉不了的,因此在進入待機和停機以後,須要定時喚醒去喂狗,喂狗的時間很短,與ST確認,STM32LXXX和STM8系列,能夠在進入待機和停機以前經過用戶選線字節凍結看門狗。
文章參考資料: 《STM32F4xx中文參考手冊》 《STM32F4xx Reference manual》