STM32 之 外部開門狗(iwdg)
即使主時鐘發(fā)生故障它也仍然有效。
窗口看門狗由從APB1時鐘分頻后得到的時鐘驅(qū)動,
通過可配置的時間窗口來檢測應(yīng)用程序非正常的過遲或過早的操作。
IWDG最適合應(yīng)用于那些需要看門狗作為一個在主程序之外,
能夠完全獨(dú)立工作,并且對時間精度要求較低的場合。
WWDG最適合那些要求看門狗在精確計(jì)時窗口起作用的應(yīng)用程序
IWDG主要性能
●自由運(yùn)行的遞減計(jì)數(shù)器
●時鐘由獨(dú)立的RC振蕩器提供(可在停止和待機(jī)模式下工作)
●看門狗被激活后,則在計(jì)數(shù)器計(jì)數(shù)至0x000時產(chǎn)生復(fù)位
下面是使用代碼:
{
RCC_LSICmd(ENABLE);//打開LSI
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);//等待直到LSI穩(wěn)定
}
=================================================================================
voidIWDG_Configuration(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);// 打開使能,因?yàn)?strong>iwdg的寄存器有寫保護(hù),必須先寫入0x5555,才能操作寄存器
IWDG_SetPrescaler(IWDG_Prescaler_256);// 獨(dú)立看門狗使用內(nèi)部低速振蕩器LSI,對LSI進(jìn)行256分頻
IWDG_SetReload(2500);// 設(shè)定獨(dú)立看門狗計(jì)數(shù)器的計(jì)數(shù)值(0x000~0xFFF;0~4095),復(fù)位時間為16s
IWDG_ReloadCounter();// 重載獨(dú)立看門狗計(jì)數(shù)器,向寄存器寫入0xAAAA,或者更新計(jì)數(shù)值
IWDG_Enable();// 開啟看門狗,向寄存器寫入0xCCCC即可
}
喂狗程序直接使用IWDG_ReloadCounter();函數(shù)。
其中 LSI_RCC_Configuration(); // 內(nèi)部低速時鐘配置 該函數(shù)可以不用,但是等低速內(nèi)部時鐘穩(wěn)定后再開外部看門狗比較好。
現(xiàn)在說說如何計(jì)算外部看門狗計(jì)數(shù)器復(fù)位的時間。
先給出datasheet上的預(yù)分頻和對應(yīng)的時間范圍:
我們來舉個例子:
比如上面的代碼所示,預(yù)分頻256,然后計(jì)數(shù)值是2500次,則外部看門狗計(jì)數(shù)器復(fù)位時間為16秒。
首先LSI是40KHz,這里不考慮其上下浮動的情況。
- 40000Hz / 256 = 156.25Hz 這里40KHz就是40000Hz進(jìn)行256分頻后,計(jì)數(shù)器的頻率為156.25Hz;
- 1 / 156.25Hz = 0.0064s156.25Hz換算成時間就是0.0064秒,即為每次計(jì)數(shù)用時0.0064秒;
- 0.0064s * 2500 = 16s 則2500次計(jì)數(shù)用時16秒,16秒后計(jì)數(shù)初值被減到零,觸發(fā)復(fù)位,被狗咬到。
如何測試:
stm32 的速率比較高,如果用LED作測試可能無法看到他的復(fù)位效果。
所以還是用仿真器比較好用,下面是一個示意:
評論