welcom ! Handel home

2014年6月17日 星期二

ST32教程(13)

 STM32筆記之十三:惡搞,兩隻看門狗

a)        
目的:

瞭解兩種看門狗(我叫它:系統運行故障探測器和獨立系統故障探測器,新手往往被這個並不形象的象形名稱搞糊塗)之間的區別和基本用法。

b)        
相同:

都是用來探測系統故障,通過編寫代碼定時發送故障清零信號(高手們都管這個代碼叫做喂狗),告訴它系統運行正常。一旦系統故障,程式清零代碼(喂狗)無法執行,其計數器就會計數不止,直到記到零並發生故障中斷(狗餓了開始叫喚),控制CPU重啟整個系統(不行啦,開始咬人了,快跑……)。

c)        
區別:

獨立看門狗Iwdg——我的理解是獨立於系統之外,因為有獨立時鐘,所以不受系統影響的系統故障探測器。(這條狗是借來的,見誰偷懶它都咬!)主要用於監視硬體錯誤。

視窗看門狗wwdg——我的理解是系統內部的故障探測器,時鐘與系統相同。如果系統時鐘不走了,這個狗也就失去作用了。(這條狗是老闆娘養的,老闆不幹活兒他不管!)主要用於監視軟體錯誤。

d)        
初始化函式定義:鑒於兩隻狗作用差不多,使用過程也差不多初始化函數栓一起了,用的時候根據情況刪減。

void WDG_Configuration(void);

e)        
初始化函式呼叫:

WDG_Configuration();

f)        
初始化函數

void WDG_Configuration()                //
看門狗初始化

{

//
軟體看門狗初始化

  WWDG_SetPrescaler(WWDG_Prescaler_8); //
時鐘8分頻4ms

// (PCLK1/4096)/8= 244 Hz (~4 ms)

   WWDG_SetWindowValue(65);                    //
計數器數值

  WWDG_Enable(127);                   //
啟動計數器,設置喂狗時間

// WWDG timeout = ~4 ms * 64 = 262 ms

   WWDG_ClearFlag();                   //
清除標誌位元

  WWDG_EnableIT();                    //
啟動中斷

//
獨立看門狗初始化

  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//
啟動寄存器讀寫

  IWDG_SetPrescaler(IWDG_Prescaler_32);//40K
時鐘32分頻

  IWDG_SetReload(349);                 //
計數器數值

  IWDG_ReloadCounter();                //
重啟計數器

  IWDG_Enable();                       //
啟動看門狗

}

g)        RCC
初始化:只有軟體看門狗需要時鐘初始化,獨立看門狗有自己的時鐘不需要但是需要systic工作相關設置。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

h)        
獨立看門狗使用systic的中斷來喂狗,所以添加systic的中斷打開代碼就行了。軟體看門狗需要在NVIC打開中斷添加如下代碼:

  NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; //
通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //
佔先中斷等級

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      //
回應中斷優先順序

  NVIC_Init(&NVIC_InitStructure);                        //
打開中斷

i)        
中斷程式,軟體看門狗在自己的中斷中喂狗,獨立看門狗需要使用systic的定時中斷來喂狗。以下兩個程式都在stm32f10x_it.c文件中。

void WWDG_IRQHandler(void)

{

  WWDG_SetCounter(0x7F);          //
更新計數值

WWDG_ClearFlag();               //
清除標誌位元

}

void SysTickHandler(void)

{  IWDG_ReloadCounter();         //
重啟計數器(喂狗)

}

j)        
注意事項:

i.        
有狗平常沒事情可以不理,但是千萬別忘了喂它,否則死都不知道怎麼死的!

ii.        
初始化程式的調用一定要在systic的初始化之後。

iii.        
獨立看門狗需要systic中斷來喂,但是systic做別的用處不能只做這件事,所以我寫了如下幾句代碼,可以不影響systic的其他應用,其他systic週期代碼也可參考:

第一步:在stm32f10x_it.c中定義變數

int Tic_IWDG;           //
喂狗迴圈程式的頻率判斷變數

第二步:將SysTickHandler中喂狗代碼改為下面:

Tic_IWDG++;             //
變數遞增

if(Tic_IWDG>=100)       //
100systic週期喂狗

{  IWDG_ReloadCounter();//
重啟計數器(喂狗)

  Tic_IWDG=0;          //
變數清零




沒有留言: