天天看點

STM8S——watchdog(IWDG)

IWDG工作原理:

  1、當鍵值寄存器(IWDG_KR)中寫入數值0xCC後,獨立看門狗就會被啟動,計數器開始從它的複位值0xFF開始遞減計數,當計數減到0x00時就會産生一個複位信号。

  2、使用IWDG_PR和IWDG_RLR寄存器配獨立看門狗。

  (1)IWDG_PR寄存器是用于選擇驅動計數器時鐘的預分頻系數。

  (2)當KEY_REFRESH的數值(0xAA)寫入到IWDG_KR寄存器時,獨立看門狗将用IWDG_RLR的數值重新整理計數器的内容,進而避免了産生看門狗的複位。

  3、IWDG_PR和IWDG_RLR寄存器具有寫保護功能,要修改它們前,需首先在IWDG_KR寄存器寫入KEY_ACCESS代碼(0x55);在IWDG_KR寫入0xAA将恢複寫保護狀态。

 IWDG工作細節:

1、為了避免程式忙跑跑死了沒反應,加上一個看門狗watchdog實時監控着程式,一旦程式沒有在規定的時間喂狗,則狗叫使得單片機複位。

2、Independent watchdog(IWDG)内部有時鐘源(128kHz),是以即使主時鐘挂了watchdog還是能繼續工作的。

   另外還有個Window watchdog (WWDG),比IWDG複雜得多,我們沒有采用。

STM8S——watchdog(IWDG)

3、由于内部是128kHz,是以watchdog能允許的最大延遲時間為510ms(當RL[7:0]= 0xFF時),最小延遲時間為2ms(當RL[7:0]= 0x00時);我們選取510ms。

STM8S——watchdog(IWDG)

  也就是說一旦打開看門狗,最遲每隔510ms就要進行喂狗操作,否則看門狗将會打開複位。

4、看門狗的實作不難,難點在于怎樣驗證自己設定的看門狗是否正确,難點在與想辦法測試watchdog。

   方法是在while(1)的循環裡延時510ms以上(如延時600ms),通過對相關寄存器特征值的顯示檢視,來判斷單片機是否被複位,若被複位則驗證成功。

5、值得注意的是,開門狗一旦打開就無法關閉,隻有通過不斷的喂狗來防止複位。

6、下面給出代碼思路并且附帶詳細注釋:

   由于延時函數如果延時太久會無法實作喂狗操作,是以應該在原來的Delay1ms()函數的基礎上,再另外定義一個newDelay()函數,目的是每次延時250ms時(即調用Delay1ms(250))喂狗;

   為了驗證代碼的可實作性,故意在主函數中調用Delay1ms(600),是以正确的執行結果應該是:執行Delay1ms(600),watchdog啟動複位,輸出timeout之類的提示;

   其中證明是否是watchdog啟動的複位:檢視RST->SR(Reset status register)中Bit1的值,為1表示An IWDG reset occurred,為0表示No IWDG reset occurred。