STM32系列 STM32F4xx 獨立看門狗(IWDG)

0 前言

    因爲單片機的工做經常會受到來自外界電磁場的干擾,形成各類寄存器和內存數據混亂,會致使程序指針錯誤,不在程序區,取出錯誤的程序指令等,都會陷入死循環,程序的正常運行被打斷,由單片機控制的系統沒法正常工做,會形成整個系統陷入停滯狀態,發生不可預料的後果。ide

1 簡介

    STM32F4xx具備兩個看門狗外設,都可用於檢測並解決由軟件錯誤致使的故障,當計數器達到給定的超時值時,觸發一箇中斷(僅適用於窗口型看門狗)或產生系統復位。ui

    獨立看門狗(IWDG)由其專用的低速時鐘(LSI)驅動,所以,即使在主時鐘發生故障時仍然保持工做狀態。窗口看門狗(WWDG)時鐘由APB1時鐘經預分頻後提供,經過可配置的時間窗口來檢測應用程序非正常的過遲或過早的操做。spa

    LSI RC 可做爲低功耗時鐘源在停機和待機模式下保持運行,因此,在MCU進入停機或待機模式時,看門狗仍能正常運行,因此須要定時喚醒喂狗,不然,MCU復位重啓。指針

    獨立看門狗適用於那些須要看門狗做爲一個在主程序外,可以徹底獨立工做,而且對時間精度要求較低的場合。窗口看門狗適合那些要求看門狗在精確計時窗口起做用的應用程序。code

2 獨立看門狗特性

  • 自由運行遞減計數器
  • 時鐘由獨立RC振盪器提供(可在待機和中止模式下運行)
  • 當遞減計數器值達到0x000時產生復位(若是看門狗已激活)

3 獨立看門狗功能說明

    當經過對關鍵字寄存器(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

4 IWDG寄存器

  1. 關鍵字寄存器(IWDG_KR)
    Key register
    在這裏插入圖片描述
    位31:16 保留,必須保持復位值。
    位15:0 KEY[15:0]:鍵值(Key value)(只寫位,讀爲0000h)
            必須每一個一段時間便經過軟件對這些位寫入鍵值AAAAh,不然當計數器計數到0時,看門狗會產生復位。
            寫入鍵值5555h可以使能對IWDG_PR和IWDG_RLR寄存器的訪問
            寫入鍵值CCCCh可啓動看門狗(選中硬件看門狗選項的狀況除外)
  2. 預分頻寄存器(IWDG_PR)
    Prescaler register在這裏插入圖片描述
    位31:3 保留,必須保持復位值。
    位2:0 PR[2:0]: 預分頻器(Prescaler divider)
        這些位受寫訪問保護,經過設置這些位來選擇計數器始終的預分頻因子,若要更改預分頻器的分頻係數,IWDG_SR的PVU位必須爲0。
        000:4分頻
        001:8分頻
        010:16分頻
        011:32分頻
        100:64分頻
        101:128分頻
        110:256分頻
        111:256分頻
  3. 重載寄存器(IWDG_RLR)
    Reload register在這裏插入圖片描述
    位31:12 保留,必須保持復位值。
    位11:0 RL[11:0]:看門狗計數器重載值(Watchdog counter reload value)
        這些位受寫訪問保護,每次對IWDG_KR寄存器寫入值AAAAh時,這個值就會重裝載到看門狗計數器中,以後,看門狗計數器便從該裝載的值開始遞減計數。若要更改重載值,IWDG_SR中的RVU位必須爲0。
  4. 狀態寄存器(IWDG_SR)
    Status register在這裏插入圖片描述
    位31:2 保留,必須保持復位值。
    位1 RVU:看門狗計數器重載值更新(Watchdog counter reload value update)
        經過硬件將該位置1以指示重載值正在更新,只有在RVU位爲0時纔可更新。
    位0 PVU:看門狗預分頻器值更新(Watchdog prescaler value update)
        經過硬件將該位置1以指示預分頻器值正在更新,只有在PVU位爲0時纔可更新。

5 代碼實現

/*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()定時喂狗。

6 題外話

    STM32F系列的MCU看門狗開啓以後是關閉不了的,因此在進入待機和停機以後,須要定時喚醒去喂狗,喂狗的時間很短,與ST確認,STM32LXXX和STM8系列,能夠在進入待機和停機以前經過用戶選線字節凍結看門狗。

文章參考資料: 《STM32F4xx中文參考手冊》 《STM32F4xx Reference manual》

相關文章
相關標籤/搜索