STM32之獨立看門狗原理
STM32的獨立看門狗由內部專門的40Khz低速時鐘驅動,即主時鐘發生故障,它也仍然有效,這裡我們需要注意獨立看門狗的時鐘不是準確的40Khz,二是在30~60Khz之間變化的一個時鐘,只是我們估算以40Khz來計算,看門狗對時間要求不是很青雀,時鐘有點偏差還是可以接受的。
獨立看門狗相關的幾個暫存器
1.1. 鍵值暫存器(IWDG_KR)
暫存器各位描述如下:
獨立看門狗工作原理:在鍵值暫存器(IWDG_KR)中寫入0XCCCC,開始啟用獨立看門狗,此時計數器開始從其復位值OXFFF遞減計數,當計數器計數到末尾0X000的時候,會產生一個復位訊號(IWDG_RESET),無論何時,只要暫存器IWDG_KR中被寫入0XAAAA
預分頻暫存器(IWDG_PR)和過載暫存器(IWDG_RLR)的防寫 :IWDG_PR和IWDG_RLR暫存器具有防寫功能,要想修改這兩個暫存器的值,首先要向IWDG_KR中寫入0X5555。以不同的值寫入這個暫存器或者重灌載(寫入0XAAAA)都會重新啟動防寫。
1.2. 預分頻暫存器(IWDG_PR)
該暫存器是用來設定看門狗的時鐘分頻係數,最低為4,最高位256,雖然是32位暫存器,我們只使用了最低3位,其他保留,預分頻暫存器各位定義如下:
1.3. 計數重灌載暫存器(IWDG_RLR)
該暫存器儲存重灌載計數器中的值
2. 獨立看門狗啟動過程
這樣,只要我們對以上三個暫存器進行相應設定,我們就可以啟動STM32獨立看門狗了,啟動過程如下:
2.1. 1、向IWDG_KR中吸入0X5555
通過這一步我們取消了IWDG_PR和IWDG_RLR的防寫,下一步我們設定他們初值。
設定IWDG_PR和IWDG_RLR的初值。
我們計算一下看門狗的喂狗時間(看門狗溢位時間)計算公式
Tout=((4*2^prer)*rlr)/40
其中Tout就是看門狗溢位時間(單位ms),prer是看門狗時鐘預分頻值(IWDG_PR值),範圍為0~7,rlr位看門狗過載值(IWDG_RLR)。比如我們設定prer為4,rlr的值為625,我們就可以計算得到Tout=64*625/40=1000ms,這樣,看門狗的溢位時間就是1S,只要在這一秒鐘內,有一次吸入0XAAAA到IWDG_KR,就不會導致看門狗復位
2.2. 2、向IWDG_KR中寫入0XAAAA
通過這句可以將過載暫存器(IWDG_RLR)中的計數初值載入到看門狗計數器中(也可以時鐘該命令喂狗)。
2.3. 3、向IWDG_KR中寫入0XCCCC
通過這句我們就啟動了STM32的看門狗了,使能了看門狗,在程式裡面我們就必須間隔一定的時間就喂狗,否則導致程式復位,利用這一點,我們通過一個LED來指示是否復位,驗證獨立看門狗。
STM32中看門狗核心在晶片內部,不需要外部電路,這裡我們使用到了外部電路中的2個IO口,一個用來輸入喂狗訊號,一個用來指示程式是否復位,喂狗使用WK_UP按鍵,程式重啟指示使用DS0。