對STM32任何模塊使用前都要對其初始化、首先就是初始化外設(shè)時鐘,可以簡單看系統(tǒng)時鐘章節(jié)關(guān)于外設(shè)時鐘,看數(shù)據(jù)手冊如下:
看門狗由獨立內(nèi)部40M時鐘驅(qū)動,所以不需要我們在初始化時鐘配置寄存器。
讀數(shù)據(jù)手冊可以得知看門狗模塊使用的系統(tǒng)LSI時鐘,初始化配置之前要設(shè)置預(yù)分配寄存器IWDG_PR,以及設(shè)置IWDG_RLR兩個寄存器的值,由于寄存器有寫保護,根據(jù)數(shù)據(jù)手冊可知:
所以在設(shè)置之前寄存器之前必須先對IWDG_KR(鍵寄存器)再寫入0x5555,修改寄存器的值 。接下來看預(yù)分頻寄存器:
預(yù)分因子主要和看門狗的超時時間有關(guān) 看手冊可知:
(這里我沒有深究最大值的用處),接著我們看自動裝載寄存器:
設(shè)置IWDG_PR和IWDG_RLR的初值。
我們計算一下看門狗的喂狗時間(看門狗溢出時間)計算公式:
Tout=((4*2^prer)*rlr)/40
其中Tout就是看門狗溢出時間(單位ms),prer是看門狗時鐘預(yù)分頻值 (IWDG_PR值),范圍為0~7,rlr位看門狗重載值(IWDG_RLR)。
比如我們設(shè)置prer為4, rlr的值為625,我們就可以計算得到 Tout=64*625/40=1000ms,這樣,看門狗的溢出時間就是1S,只要在這一秒鐘 內(nèi),有一次吸入0XAAAA到IWDG_KR,就不會導(dǎo)致看門狗復(fù)位。
所以初始化函數(shù)如下:
void IWDG_Init(4,625)
{
IWDG->KR=0X5555; //解除寄存器保護
IWDG->PR=prer; // 寫入初始化分頻值
IWDG->RLR=rlr; // 寫入自動裝載值
IWDG->KR=0XAAAA; //開啟寄存器保護
IWDG->KR=0XCCCC; //啟動看門狗
}
初始化完成后 看門狗開始逐漸遞減計數(shù)到0000并復(fù)位 ,所以在復(fù)位之前要不斷喂狗,
即不斷重新加載數(shù)據(jù)到IWDG_RLR中防止復(fù)位
喂狗函數(shù)如下:
void IWDG_Feed(void)
{
IWDG->KR=0XAAAA;
}
至此基本的獨立看門狗的配置完成 初始化后 在適當?shù)胤秸{(diào)用喂狗程序即可。