STM32F103ZET6獨立看門狗


1、IWDG簡介 

  STM32F103ZET6的獨立看門狗(IWDG)是由內部LSI(內部約40KHZ低速時鍾)時鍾驅動的。由於IWDG是由內部低速時鍾驅動,所以就算主時鍾發生故障,IWDG依然能夠工作。

  由於LSI是一個內部RC時鍾,所以時鍾不是很准確的40KHZ,而是在30KHZ~60KHZ之間變化的時鍾,所以IWDG時間的計算並不是很准確,只能是一個大概的值。一般用40KHZ來估算。

  IWDG的計數器是一個遞減計數器,當IWDG被激活后,計數器開始向下遞減計數,當計數器計數至0x0000時產生復位信號,使芯片復位。

  當芯片處於停止和待機模式下工作時,IWDG依然繼續工作。

2、IWDG工作原理

  當IWDG被激活后,IWDG的計數器開始向下遞減計數,當IWDG的計數器的值遞減到0x000時,芯片就會復位。所以為了保證芯片正常工作,必須在IWDG的計數器的值遞減到0x000之前,重新給IWDG的計數器賦值,否者芯片就會不斷的復位。

  必須注意的是:IWDG一旦啟用,就不能在被關閉,想要關閉IWDG,只能復位,並且在復位后不能打開IWDG。

3、IWDG的配置

  IWDG的寄存器並不復雜,只有IWDG_KR鍵值寄存器、IWDG_PR分頻寄存器、IWDG_RLR重裝載寄存器這3個寄存器。

  IWDG_KR鍵值寄存器:

  當向IWDG_KR寄存器寫入0xCCCC后,IWDG就開始工作,IWDG的計數器從IWDG_RLR寄存器的值開始向下遞減計數,當計數到0x0000時,就會產生一個復位信號。

  當向IWDG_KR寄存器寫入0xAAAA后,IWDG_RLR中的值就會重新加載到IWDG計數器中,從而避免IWDG產品復位信號。

  需要注意的是IWDG_RLR和IWDG_PR這兩個寄存器是有寫保護的,當操作這兩個寄存器的時候,必須先向IWDG_KR寄存器寫入0x5555,之后才能操作IWDG_RLR和IWDG_PR這兩個寄存器。

  IWDG_PR寄存器:

  IWDG_PR寄存器是IWDG的預分頻寄存器。IWDG_PR寄存器可以對IWDG的時鍾進行分頻,分頻系數從4分頻到256分頻。IWDG_PR寄存器只用到了低3位,PR[2:0]組成IWDG的分頻系數。如下:

      • PR[2:0] = 000: 4分頻
      • PR[2:0] = 001: 8分頻
      • PR[2:0] = 010: 16分頻
      • PR[2:0] = 011: 32分頻
      • PR[2:0] = 100: 64分頻
      • PR[2:0] = 101: 128分頻
      • PR[2:0] = 110: 256分頻
      • PR[2:0] = 111: 256分頻

  IWDG_RLR寄存器:

  IWDG_RLR寄存器只有低12位有效,所以IWDG的計數值最大只有0xFFF。

  IWDG的配置流程:

  首先向IWDG_KR寫入0x5555,取消IWDG_PR和IWDG_RLR的寫保護;

  取消寫保護之后設置IWDG_PR和IWDG_RLR的值;

  為了將IWDG_RLR寄存器的值加載到IWDG的計數器中,將0xAAAA的值寫入IWDG_KR寄存器中。

  最后將值0xCCCC寫入IWDG_KR寄存器中啟動IWDG。

  IWDG的時間計算:

  假設IWDG的預分頻系數為pr,重裝載值為rlr,那么IWDG的時間計算公式為:

  T = ((4*2^pr)*rlr)/40000 (計算后的單位為秒)

4、HAL庫操作IWDG

  IWDG初始化代碼如下:

void IWDG_Init(void) { IWDG_HandleTypeDef IWDG_Handle; IWDG_Handle.Instance = IWDG; IWDG_Handle.Init.Prescaler = IWDG_PRESCALER_4; IWDG_Handle.Init.Reload = 0xFFF; HAL_IWDG_Init(&IWDG_Handle); }

  IWDG_Handle是IWDG的句柄。

  IWDG_Handle.Instance = IWDG是將句柄指向外設IWDG。

  IWDG_Handle.Init.Prescaler = IWDG_PRESCALER_4是設定IWDG的分頻系數。

  IWDG_Handle.Init.Reload = 0xFFF是設定IWDG的重裝載值。

  HAL_IWDG_Init(&IWDG_Handle)是將句柄傳入HAL_IWDG_Init函數對IWDG進行初始化。

  IWDG重新更新計數器(喂狗)代碼如下:

void IWDG_CLR(void) { IWDG_HandleTypeDef IWDG_Handle; IWDG_Handle.Instance = IWDG; HAL_IWDG_Refresh(&IWDG_Handle); }

  將句柄參數傳入HAL_IWDG_Refresh函數,HAL_IWDG_Refresh函數的作用是更新IWDG的計數值,防止IWDG的計數值計算到0x0000時產生復位信號。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM