STM32之看門狗(獨立與窗口)


     廣大的互聯網網友們,大家早上中午晚上好,我是某某某、、對於狗、、看過《忠犬八公》的我、無不深深的被狗的義氣與靈氣所震撼、、我也覺得在所有mcu中用看門狗來形容讓系統復位的功能是很恰當的、也很形象、但是偷偷說一句:我本人很怕狗、、但是看門狗卻很可愛、、在STM32中存在着兩條忠犬:獨立看門狗和窗口看門狗,其英文簡稱為:IWDG和WWDG。

     IWDG篇:::接下來先看IWDG,對此縮寫,我就不解釋了、、本人六級也在積極准備中,獨立看門口這個“獨立”,恕小弟不才,目前只知道其獨立的含義是指在整個系統時鍾中,IWDG是有30~60KHZ提供,並且掛在ABP橋上,但不使用ABP1橋的時鍾(注:請記住這一點,待會講WWDG時這是非常明顯的區別之一(注意:IWDG我看到是有掛在ABP1上的,但是我還搞不懂為什么還要單獨用40KHZ提供,希望有高手見到時能指教指教)。所以對於IWDG來說,時鍾是不固定的,但最好不要超過這個范圍,因為有可能會引起系統的不穩定,當我翻開“葵花寶典”第STM32篇中文參考手冊時,發現了一個重要之處,詳情請看圖:

     看到我美麗的塗鴉沒?沒錯了、、參考手冊里是采用40KHZ的晶振頻率,但是也要注意:這里的40KHZ也是不固定的、只是我們計算是大概當作以40KHZ來算、借用初高中物理實驗題經典的一句台詞:在誤差允許的范圍之內,是可以接受的、、

     說到這,可能有些人不明白為什么要用我們人類最忠誠的狗來看門,以保系統正常運行、那小弟在這里就按我個人的見解說一說哈:打個比喻,你有100萬放在家里,你養了一條狗,看着門,有天小偷潛入你家里,正好你在不遠處聽到你家的狗在狂叫,注意不遠處,這個距離除於你的速度就是時間、、在這個時間內,如果你趕不上(你已經無能為力了),這時候100萬會不會不安全呢?答案是不會的、因為你家的狗很厲害,你還沒回來,狗看情勢不對,把小偷給“自宮”了,,在這里就相當於小狗監視着整個房子,當發生不測了,就會做出反應、、而這個反應就是我們現在所說的讓系統復位、、看來這狗練過“葵花寶典”、、

    那我們要怎么來好好的“照顧”我們的忠犬呢??首先、狗必須是活性的雄狗、再者狗需要被保護、、就給狗買個人壽保險吧、、所以看到參考手冊有個寄存器

鍵寄存器(IWDG_KR):要把忠犬激活,所以使用時要在鍵寄存器(IWDG_KR)寫入0xCCCC、、如果你想改造忠犬,讓它變得更加凶猛,那你得向鍵寄存器(IWDG_KR)寫入0x5555;

但是你放心,不需要你寫、、咱們有庫呀、、來看“葵花寶典”第STM32篇之固件庫之IWDG:

接下來、狗的厲害程度和反應時間我們也是可以來設置的、、當然、對於搞定小偷你肯定是希望狗越猛越好,反應時間越快越好,但是在我們MCU里卻是不好說,得按實際情況來設定,同樣請看:

可以看到其形參有如下幾個:

1 #define WWDG_Prescaler_1    ((uint32_t)0x00000000)
2 #define WWDG_Prescaler_2    ((uint32_t)0x00000080)
3 #define WWDG_Prescaler_4    ((uint32_t)0x00000100)
4 #define WWDG_Prescaler_8    ((uint32_t)0x00000180)

啊哈、、還有一個重裝載值:

這樣我們就可以計算狗的反應時間了:Tout = ((4*2^prer)*rlr)/40     其中prer為預分頻值:0~7  rlr為重裝載值

如果你以為這樣就能使狗幫你看門了、、那你就有點天真了、、狗嘛,要經過后天的多次訓練,才能達到看門的目的,在這里我們也一樣,我們叫“喂狗”操作、、這種喂狗就是在小偷沒來之前要經常訓練的、、這樣就不會整體誤報有小偷了、、也就是防止系統復位,影響正常的生活(系統運行),那如何喂狗呢??拿狗糧??NO、、還是不用你哈、、庫為我們做好了一切准備啦,請看:

神奇吧、、哈哈、、接下來、、我們只要不讓狗睡覺就行了、、就是要開啟看門狗:

好了,我們來總結下,請看代碼哈:

 1 void IWDG_Init(void)
 2 {
 3     //1/取消寄存器寫保護
 4        //2/設置獨立看門狗的預分頻器和重裝載值
 5    //3/重裝載值實現喂狗
 6      //4/開啟看門狗
 7     
 8       IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  
 9     
10       IWDG_SetPrescaler(IWDG_Prescaler_4);          
11     
12       IWDG_SetReload(625);                           
13       
14       IWDG_ReloadCounter();
15     
16       IWDG_Enable();                                
17 }
18 
19 void IWDG_Feed(void)
20 {
21    IWDG_ReloadCounter();              //實現喂狗操作
22 }

   備注:IWDG最適合應用於那些需要看門狗作為一個在主程序之外,能夠完全獨立工作,並且對時間精度要求較低的場合。

   

   WWDG篇::: 了解了獨立看門狗,對於窗口看門狗的一些相似的概念也就差不多理解了、、啊哈、、剛開始叫大家注意的地方在這里用到了:沒錯了、、你們都是聰明的、、已經猜到了我說什么了:WWDG不具有獨立的晶振頻率,而是掛在ABP1上的,請看圖(注意:我還是不明白我為什么IWDG也掛在這但是不用這里的時鍾,而單獨使用40KHZ的RC時鍾,請恕小弟尚未吃透,望懂的人能指教指教):

    

在這里,防御更加精確,WWDG最適合那些要求看門狗在精確計時窗口起作用的應用程序。有兩種情況會產生MCU復位:請看工作原理圖:

第一:T[6:0]就是窗口看門狗的計數器,而W[6:0]則是窗口看門狗的上窗口,下窗口值是固定的(0x40),當窗口看門狗的計數器在上窗口值之外被刷新時會產生復位

第二:當窗口看門狗的計數器低於下窗口值時也會產生復位、、

   從這個圖我們可以看出、、當計數器的值從0x40變到0x3f時,T6位產生下降沿,從而知道系統發生復位、、但是呢、、是不是只有這條路可以走呢??啊哈、、條條大路通羅馬嘛、、來請看:

      對,在這里,我們是用提前喚醒中斷來實現看門狗的監控:所謂的提前喚醒就是:主人、、主人、、你趕緊的呀、、快着火了、、就是在復位發生之前喚醒你緊張的心理,使得系統不被復位,我們采用中斷的方式,利用這位來設置中斷,當窗口看門狗的計數器值減到0x40的時候,該位就會產生中斷請求,所以我們就可以在中斷服務函數里進行喂狗操作,記住,速度要快,不能超過一個窗口看門狗計數周期的時間,一提到中斷、、大家有想到什么貓膩沒??沒錯了、、就是要配置中斷優先級、、這步待會來哈、、不急、、

    同樣,我們翻開固件庫可以看到:(由於篇幅為題,大家可以去看固件庫各個函數的參數哈,敬請原諒)

     

所以我們來總結下步驟:

1、使能WWDG的時鍾

2、設置窗口值和預分頻系數

3、開啟WWDG中斷並設置中斷優先級

4、設置計數器初始值並使能看門狗

5、編寫中斷服務程序(函數名請注意哈)

請看我的代碼(注意紅色字體哈):

   u8 COUNT = 0X7F;

1
void WWDG_Init(u8 count,u8 wr,u32 fprer) 2 { 3 10 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); 11 COUNT = count & COUNT; //初始化計數值 12 WWDG_SetPrescaler(fprer); 13 WWDG_SetWindowValue(wr); 14 WWDG_Enable(COUNT); 15 WWDG_ClearFlag(); 16 WWDG_NVIC_Init(); 17 WWDG_EnableIT(); //使能中斷 18 }
19 void WWDG_NVIC_Init(void) 20 { 21 NVIC_InitTypeDef NVIC_InitStructure; 22 NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; // PA0 ÉèÖÃÖжÏÓÅÏȼ¶ 23 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; 24 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; 25 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 26 NVIC_Init(&NVIC_InitStructure); 27 } 28 29 void WWDG_IRQHandler(void) 30 { 31 WWDG_SetCounter(COUNT); 32 WWDG_ClearFlag(); //此處請記得清零 33 LED1 = !LED1; 34 }


 

  本篇博客從內容安排上較偏重於獨立看門狗、因為獨立看門狗理解了,我相信窗口看門狗的一些相似的概念也能很快理解的、、還是那句話:請高手賜教,也希望不懂的人能看得懂我寫的、、請多多指教、、

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM