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