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時產生復位信號。