一、IWDG簡介
獨立看門狗 (Independent Watchdog, IWDG ),什么是看門狗?字面意思——看門的,有陌生人來,就會叫。實際在嵌入式領域里,看門狗也是這種作用,當軟件程序發(fā)生故障或者程序跑飛時,看門狗會產(chǎn)生復位信號,復位系統(tǒng)。
二、STM32的IWDG
2.1 STM32的IWDG簡介
STM32內(nèi)置兩個看門狗,提供了更高的安全性、時間的精確性和使用的靈活性。兩個看門狗設備(獨立看門狗和窗口看門狗)可用來檢測和解決由軟件錯誤引起的故障;當計數(shù)器達到給定的超時值時,觸發(fā)一個中斷(僅適用于窗口型看門狗)或產(chǎn)生系統(tǒng)復位。
獨立看門狗(IWDG)由專用的低速時鐘(LSI)驅(qū)動,即使主時鐘發(fā)生故障它也仍然有效。窗口看門狗由從APB1時鐘分頻后得到的時鐘驅(qū)動,通過可配置的時間窗口來檢測應用程序非正常的過遲或過早的操作。
IWDG最適合應用于那些需要看門狗作為一個在主程序之外,能夠完全獨立工作,并且對時間精 度要求較低的場合。WWDG最適合那些要求看門狗在精確計時窗口起作用的應用程序。
- ? 自由運行的12位遞減計數(shù)器
- ? 時鐘由獨立的RC振蕩器提供(可在停止和待機模式下工作)
- ? 看門狗被激活后,則在計數(shù)器計數(shù)至0x000時產(chǎn)生復位
一旦使能IWDG,就無法關閉。只有等到復位之后,才能將IWDG關閉。
2.2 喂狗
通過上面的簡介可以知道,獨立看門狗實際就是一個12位的遞減計數(shù)器,當計數(shù)器的值遞減到0的時候,就會產(chǎn)生復位。但是,如果我們在計數(shù)值遞減到0之前,重新給計數(shù)器賦值,那么就不會再產(chǎn)生復位。這個操作叫做喂狗。
2.3 IWDG框圖
IWDG框圖
IWDG的框圖很好理解,IWDG由一個由獨立的RC振蕩器提供時鐘。經(jīng)過一個8位的預分頻器對時鐘信號進行分頻。12位遞減計數(shù)器按照設置好的初始值和輸入時鐘遞減。當遞減計數(shù)器遞減到0時,產(chǎn)生獨立看門狗復位。
在產(chǎn)生復位之前,如果將重裝載寄存器傳遞給遞減計數(shù)器,那么就會重新開始遞減,這叫做喂狗。
鍵寄存器也叫做關鍵字寄存器,往該寄存器寫入不同的值,有不同的作用
- ? 寫入 0x5555 ——表示允許訪問IWDG_PR和IWDG_RLR寄存器
- ? 寫入 0xAAAA ——將重載寄存器的值傳遞到遞減計數(shù)器,也就是喂狗
- ? 寫入 0xCCCC ——啟動獨立看門狗功能
中文參考手冊中給出了一個時間表
IWDG的溢出時間表
時間的計算方法是,時間 = 重裝載寄存器值 / (輸入時鐘頻率 / 4 * 2^預分頻系數(shù))
為什么是4 * 2^預分頻系數(shù),可以看一下中文參考手冊對于預分頻寄存器的描述
預分頻寄存器描述
三、IWDG配置步驟
? 開啟寄存器訪問(允許訪問IWDG_PR和IWDG_RLR寄存器)
? 設置IWDG預分頻系數(shù)和重裝載值
? 將重裝載寄存器的值傳遞到遞減計數(shù)器(喂狗)
? 開啟IWDG
四、IWDG配置程序
44.1 IWDG初始化程序
/*
*==============================================================================
*函數(shù)名稱:IWDG_Init
*函數(shù)功能:初始化IWDG
*輸入參數(shù):pre:預分頻系數(shù)(0~6);rlr:重裝載值(0~0xFFF)
*返回值:無
*備 注:獨立看門狗復位時間計算公式:t=(4*2^pre*rlr)/40(ms)
*==============================================================================
*/
void IWDG_Init (u8 pre,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 取消寄存器寫保護
IWDG_SetPrescaler(pre); // 設置預分頻系數(shù) 0-6
IWDG_SetReload(rlr); // 設置重裝載值
IWDG_ReloadCounter(); // 重裝載初值
IWDG_Enable(); // 打開獨立看門狗
}
4.2 喂狗
/*
*==============================================================================
*函數(shù)名稱:IWDG_FeedDog
*函數(shù)功能:喂狗
*輸入?yún)?shù):無
*返回值:無
*備 注:無
*==============================================================================
*/
void IWDG_FeedDog (void)
{
IWDG_ReloadCounter(); // 重裝載初值
}
五、應用實例
初始化IWDG,配置2s內(nèi)不及時喂狗就會復位。通過按下按鍵WK UP喂狗。串口打印復位和喂狗信息。IWDG初始化程序如下
IWDG_Init(4,1250); // 看門狗初始化,2s不及時喂狗,復位
main函數(shù)如下
u8 gKeyValue = 0; // 記錄按鍵鍵值變量
int main(void)
{
Med_Mcu_Iint(); // 系統(tǒng)初始化
printf("復位系統(tǒng)rn");
while(1)
{
gKeyValue = Med_KeyScan(); // 獲取按鍵鍵值
// WK UP按下
if (gKeyValue == 1)
{
IWDG_FeedDog(); // 喂狗
printf ("喂狗rn");
}
}
}
效果如下
IWDG效果
按下WK UP喂狗,不會產(chǎn)生系統(tǒng)復位。
一旦2s內(nèi),未按下WK UP,就會產(chǎn)生系統(tǒng)復位。
-
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
STM32
+關注
關注
2270文章
10895瀏覽量
355728 -
IWDG
+關注
關注
0文章
21瀏覽量
5211 -
rc振蕩器
+關注
關注
3文章
48瀏覽量
9562 -
獨立看門狗
+關注
關注
0文章
24瀏覽量
3827
發(fā)布評論請先 登錄
相關推薦
評論