//時間計算(大概):Tout=((4*2^prer)*rlr)/40 (ms)
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(prer);
IWDG_SetReload(rlr);
IWDG_ReloadCounter();
IWDG_Enable();
}
餵狗可通過調用如下函數進行:
IWDG_ReloadCounter();//reload
另外要注意不要使用硬體時鐘中斷餵狗,因為硬體時鐘中斷一般都有較高優先級且獨立於主控程序,這樣有時會出現主控程序雖然跑飛了,但仍能夠正常餵狗的現象。獨立看門狗能夠在一定程度上監控著程序正常運行,然而我認為更加強大,應用更靈活及更能保證程序穩定運行的還屬窗口看門狗,雖然它開始時不太好理解。控制寄存器(WWDG_CR)中的值必須在0xFF與0xC0之間, 因為它的第0至第6位為遞減計數器CNT,在它的第6位變為0時將產生復位,所以在初始化時需要為1,第7位WDGA是用來設置啟動或禁止窗口看門狗的,當為1進才會啟動窗口看門狗,所以第6和第7位都需為1,即WWDG_CR 的值需要大於等於0xC0 。配置寄存器(WWDG_CFR) 第0至第6位 是設置窗口邊界值用的,只有當遞減計數器CNT的值小於邊界值時才可以餵狗,過早不行,狗還不餓,撐死了。並且7位遞減計數器CNT減少到0x3F時即T6位變為0,此時MCU也會復位,過晚了,狗餓死了。所以必須在指定的時間範圍餵狗,過早或過晚都將產生復位,而這樣設計可以減少軟體跑飛了卻仍能夠歪打正著地餵狗的發生概率。狀態寄存器(WWDG_CFR) 只用到了第0位,EWIF(Early wakeup interrupt flag )是提前喚醒中斷標識,當遞減計數器CNT的值到達0X40(若再減少一次則T6位變為0,產生復位)時此位由硬體置1,且需用軟體清0,注意無論中斷是否使能此位都會被硬體置1。而提前喚醒中斷使能設置是在配置寄存器(WWDG_CFR)第9位EWI(Early wakeup interrupt),此位需由軟體置1,則會在當遞減計數器CNT的值到達0X40時產生中斷,並且與EWIF不同,此位是由硬體清0。另外控制寄存器(WWDG_CR)中第7位WDGA(Activation bit)激活位,需用軟體來置1,以啟動窗口看門狗,並且一旦啟動後,只能在復位或重啟後由硬體來清0。配置寄存器(WWDG_CFR)的第8位和第7位WDGTB[1:0]用來設置時基(Timer base)預分頻數。 //窗口看門狗中斷服務設置程序
void WWDG_NVIC_Init()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG 中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //搶佔2 子優先級3 組2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //搶佔2,子優先級3,組2
NVIC_Init(&NVIC_InitStructure); //NVIC 初始化
}
//保存WWDG 計數器的設置值,默認為最大.
u8 WWDG_CNT=0x7f;
//初始化窗口看門狗
//tr :T[6:0],計數器值
//wr :W[6:0],窗口值
//fprer:分頻係數(WDGTB ),僅最低2 位有效
//Fwwdg=PCLK1/(4096*2^fprer).
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 時鐘使能
WWDG_CNT=tr&WWDG_CNT; //初始化WWDG_CNT.
WWDG_SetPrescaler(fprer); //設置IWDG 預分頻值
WWDG_SetWindowValue(wr); //設置窗口值
WWDG_Enable(WWDG_CNT); //使能看門狗,設置counter
WWDG_ClearFlag(); //清除提前喚醒中斷標誌位 (註:若沒有此句則會在初始化後先進入中斷一次)
WWDG_NVIC_Init(); //初始化窗口看門狗NVIC
WWDG_EnableIT(); //開啟窗口看門狗中斷
}
以上代碼朋友們也可以跳到庫函數代碼中自己研究下,另外要說明下的是WWDG_EnableIT(); 函數相關代碼
#define CFR_EWI_BB (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4))
用到位帶操作,具體理解可參照《Cortex-M3權威指南》第五章的位帶操作相關介紹(具體89頁)。