獨(dú)立看門(mén)狗(IWDG)概述
STM32F10xxx系列內(nèi)置兩個(gè)看門(mén)狗(獨(dú)立看門(mén)狗和窗口看門(mén)狗),提供了更高的安全性、時(shí)間的精確性和使用的靈活性。兩個(gè)看門(mén)狗設(shè)備(獨(dú)立看門(mén)狗和窗口看門(mén)狗)可用來(lái)檢測(cè)和解決由軟件錯(cuò)誤引起的故障;當(dāng)計(jì)數(shù)器達(dá)到給定的超時(shí)值時(shí),觸發(fā)一個(gè)中斷(僅適用于窗口型看門(mén)狗)或產(chǎn)生系統(tǒng)復(fù)位。
獨(dú)立看門(mén)狗(IWDG)由專(zhuān)用的低速內(nèi)部時(shí)鐘(LSI)驅(qū)動(dòng),即使主時(shí)鐘發(fā)生故障它也仍然有效。
窗口看門(mén)狗由從APB1時(shí)鐘分頻后得到的時(shí)鐘驅(qū)動(dòng),通過(guò)可配置的時(shí)間窗口來(lái)檢測(cè)應(yīng)用程序非正常的過(guò)遲或過(guò)早的操作。
IWDG最適合應(yīng)用于那些需要看門(mén)狗作為一個(gè)在主程序之外,能夠完全獨(dú)立工作,并且對(duì)時(shí)間精度要求較低的場(chǎng)合。
WWDG適合要求看門(mén)狗在精確計(jì)時(shí)窗口起作用的應(yīng)用程序。
IWDG主要性能
● 自由運(yùn)行的遞減計(jì)數(shù)器
● 時(shí)鐘由獨(dú)立的RC振蕩器提供(可在停止和待機(jī)模式下工作)
● 看門(mén)狗被激活后,則在計(jì)數(shù)器計(jì)數(shù)至0x000時(shí)產(chǎn)生復(fù)位
IWDG功能描述
獨(dú)立看門(mén)狗模塊的功能框圖
在鍵寄存器(IWDG_KR)中寫(xiě)入0xCCCC,開(kāi)始啟用獨(dú)立看門(mén)狗;此時(shí)計(jì)數(shù)器開(kāi)始從其復(fù)位值0xFFF遞減計(jì)數(shù)。當(dāng)計(jì)數(shù)器計(jì)數(shù)到末尾0x000時(shí),會(huì)產(chǎn)生一個(gè)復(fù)位信號(hào)(IWDG_RESET)。
無(wú)論何時(shí),只要在鍵寄存器(IWDG_KR)中寫(xiě)入0xAAAA, 重裝載寄存器(IWDG_RLR)中的值就會(huì)被重新加載到12位遞減計(jì)數(shù)器,從而避免產(chǎn)生看門(mén)狗復(fù)位 。
硬件看門(mén)狗
如果用戶(hù)在選擇字節(jié)中啟用了“硬件看門(mén)狗”功能,在系統(tǒng)上電復(fù)位后,看門(mén)狗會(huì)自動(dòng)開(kāi)始運(yùn)行;如果在計(jì)數(shù)器計(jì)數(shù)結(jié)束前,若軟件沒(méi)有向鍵寄存器寫(xiě)入相應(yīng)的值,則系統(tǒng)會(huì)產(chǎn)生復(fù)位。
寄存器訪問(wèn)保護(hù)
預(yù)分頻寄存器(IWDG_PR)和重裝載寄存器(IWDG_RLR)具有寫(xiě)保護(hù)功能。要修改這兩個(gè)寄存器的必須先向IWDG_KR寄存器中寫(xiě)入0x5555。以不同的值寫(xiě)入這個(gè)寄存器將會(huì)打亂操作順序,寄存器將重新被保護(hù)。重裝載操作(即寫(xiě)入0xAAAA)也會(huì)啟動(dòng)寫(xiě)保護(hù)功能。
狀態(tài)寄存器指示預(yù)分頻值和遞減計(jì)數(shù)器是否正在被更新。
看門(mén)狗超時(shí)時(shí)間
IWDG寄存器描述
?
?
?
IWDG寄存器映像
IWDG固件庫(kù)函數(shù)
獨(dú)立看門(mén)狗相關(guān)的庫(kù)函數(shù)和定義分布在文件 stm32f10x_iwdg.h 和 stm32f10x_iwdg.c 中。
1)取消寄存器寫(xiě)保護(hù)(向 IWDG_KR 寫(xiě)入 0X5555)
通過(guò)這步,我們?nèi)∠?IWDG_PR 和 IWDG_RLR 的寫(xiě)保護(hù),使后面可以操作這兩個(gè)寄存器,設(shè)置 IWDG_PR 和 IWDG_RLR 的值。這在庫(kù)函數(shù)中的實(shí)現(xiàn)函數(shù)是:
這個(gè)函數(shù)的功能開(kāi)啟/取消寫(xiě)保護(hù),即使能/失能寫(xiě)權(quán)限。
2)設(shè)置獨(dú)立看門(mén)狗的預(yù)分頻系數(shù)和重裝載值
設(shè)置看門(mén)狗的分頻系數(shù)的函數(shù)是:
設(shè)置看門(mén)狗的重裝載值的函數(shù)是:
設(shè)置好看門(mén)狗的分頻系數(shù) prer 和重裝載值就可以知道看門(mén)狗的喂狗時(shí)間(也就是看門(mén)狗溢出時(shí)間),該時(shí)間的計(jì)算方式為:
Tout=((4×2^prer) ×rlr) /40
其中 Tout 為看門(mén)狗溢出時(shí)間(單位為 ms);prer 為看門(mén)狗時(shí)鐘預(yù)分頻值(IWDG_PR 值),范圍為 0~7;rlr 為看門(mén)狗的重裝載值(IWDG_RLR 的值);
比如我們?cè)O(shè)定 prer 值為 4,rlr 值為 625,那么就可以得到 Tout=64×625/40=1000ms,這樣,看門(mén)狗的溢出時(shí)間就是 1s,只要你在一秒鐘之內(nèi),有一次寫(xiě)入 0XAAAA 到 IWDG_KR,就不會(huì)導(dǎo)致看門(mén)狗復(fù)位(當(dāng)然寫(xiě)入多次也是可以的)。這里需要提醒大家的是,看門(mén)狗的時(shí)鐘不是準(zhǔn)確的 40Khz,所以在喂狗的時(shí)候,最好不要太晚了,否則,有可能發(fā)生看門(mén)狗復(fù)位。
3)重載計(jì)數(shù)值喂狗(向 IWDG_KR 寫(xiě)入 0XAAAA)
庫(kù)函數(shù)里面重載計(jì)數(shù)值的函數(shù)是:
通過(guò)這句,將使 STM32 重新加載 IWDG_RLR 的值到看門(mén)狗計(jì)數(shù)器里面。即實(shí)現(xiàn)獨(dú)立看門(mén)狗的喂狗操作。
4) 啟動(dòng)看門(mén)狗(向IWDG_KR 寫(xiě)入 0XCCCC)
庫(kù)函數(shù)里面啟動(dòng)獨(dú)立看門(mén)狗的函數(shù)是:
通過(guò)這句,來(lái)啟動(dòng) STM32 的看門(mén)狗。
注意 IWDG 在一旦啟用,就不能再被關(guān)閉!想要關(guān)閉,只能重啟,并且重啟之后不能打開(kāi) IWDG,否則問(wèn)題依舊,如果不用 IWDG 的話,就不要去打開(kāi)它,免得麻煩。
通過(guò)上面 4 個(gè)步驟,我們就可以啟動(dòng) STM32 的看門(mén)狗了,使能了看門(mén)狗,在程序里面就 必須間隔一定時(shí)間喂狗,否則將導(dǎo)致程序復(fù)位。
IWDG(獨(dú)立看門(mén)狗)實(shí)驗(yàn)
硬件設(shè)計(jì)
本實(shí)驗(yàn)用到的硬件資源有:
1) 指示燈 DS0
2) WK_UP 按鍵
3) 獨(dú)立看門(mén)狗
需要 2 個(gè) IO 口,一個(gè)用來(lái)輸入喂狗信號(hào),另外一個(gè)用來(lái)指示程序是否重啟。喂狗我們采用板上的 WK_UP 鍵來(lái)操作,而程序重啟,則是通過(guò) DS0 來(lái)指示的。
軟件設(shè)計(jì)
在工程文件目錄下面新建兩個(gè)文件夾分別為:wdg.c和wdg.h。并在把源文件添加到工程,和添加頭文件的路徑。
wdg.c 里面的代碼如下:
該代碼一共有 2 個(gè)函數(shù),void IWDG_Init(u8 prer,u16 rlr)是獨(dú)立看門(mén)狗初始化函數(shù),就是按照上面介紹的步驟 1~4 來(lái)初始化獨(dú)立看門(mén)狗的。該函數(shù)有 2 個(gè)參數(shù),分別用來(lái)設(shè)置與預(yù)分頻數(shù)與重裝寄存器的值的。
void IWDG_Feed(void)函數(shù),該函數(shù)用來(lái)喂狗,因?yàn)?STM32 的喂狗只需要向鍵值寄存器寫(xiě)入 0XAAAA 即可,也就是調(diào)用 IWDG_ReloadCounter()函數(shù),所以,我們這個(gè)函數(shù)也是簡(jiǎn)單的很。
wdg.h 里面的代碼如下:
main.c中的代碼:
按鍵輸入和看門(mén)狗,在看門(mén)狗開(kāi)啟后馬上點(diǎn)亮 LED0(DS0),并進(jìn)入死循環(huán)等待按鍵的輸入,一旦 WK_UP 有按鍵,則喂狗,否則等待 IWDG 復(fù)位的到來(lái)。
實(shí)驗(yàn)現(xiàn)象
上電后DS0 不停的閃爍,證明程序在不停的復(fù)位,否則只會(huì) DS0 常亮。如果不停的按 WK_UP 按鍵,可以看到 DS0 就常亮了,不會(huì)再閃爍,則說(shuō)明程序在不斷的復(fù)位,喂狗成功。
評(píng)論