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_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的分頻係數。如下:
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_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)
將控制代碼引數傳入hal_iwdg_refresh函式,hal_iwdg_refresh函式的作用是更新iwdg的計數值,防止iwdg的計數值計算到0x0000時產生復位訊號。
STM32F103ZET6學習總結
1.任何外設在使用之前,必須先使能相應的時鐘。2.使用不同外設時,gpio引腳應該如何配置?1 gpio mode ain 模擬輸入 2 gpio mode in floating 浮空輸入 3 gpio mode ipd 下拉輸入 4 gpio mode ipu 上拉輸入 5 gpio mode ...
STM32F103ZET6移植FreeRTOS過程
2.解壓 我們需要幾個檔案 1 在freertosv9.0.0 freertos source 下的所有c檔案 ps 並不是所有都一定要用,按需要取 2 在freertosv9.0.0 freertos source include整個資料夾 3 在freertosv9.0.0 freertos s...
STM32F103ZET6 電容觸控按鍵
開關閉合,電容充電,直至電容兩端電壓 v1 rc電路充放電公式 vt v0 v1 v0 1 exp t rc v0 為電容上的初始電壓值 v1 為電容最終可充到或放到的電壓值 vt 為t時刻電容上的電壓值。如果v0為0,也就是從0v開始充電。那麼公式簡化 vt v1 1 exp t rc 結論 同樣...