[ZigBee] 12、ZigBee之看門狗定時器——餓了就咬人的GOOD DOG


 

引言:硬件中的看門狗,不是門衛的意思,而是一只很凶的狗!如果你不按時喂它,它就會讓系統重啟!這反而是我們想要的功能~

 

1、看門狗概述

  看門狗定時器(WDT,Watch Dog Timer)是單片機的一個組成部分,它實際上是一個計數器,一般給看門狗一個數字,程序開始運行后看門狗開始倒計數。如果程序運行正常,過一段時間CPU應發出指令讓看門狗復位,重新開始倒計數。如果看門狗減到0就認為程序沒有正常工作,強制整個系統復位。因此可以用看門狗防止程序在跑飛的時候回不到正常模式。

  看門狗可用於受到電氣噪音、電源故障、靜電放電等影響的應用,或需要高可靠性的環境。如果一個應用不需要看門狗功能,可以配置看門狗定時器為一個間隔定時器,這樣可以用於在選定的時間間隔產生中斷。

  The features of the Watchdog Timer are as follows:

● 四個可選的定時器間隔
● 看門狗模式
● 定時器模式
● 在定時器模式下產生中斷請求

 

  WDT 可以配置為一個看門狗定時器或一個通用的定時器。WDT 模塊的運行由WDCTL 寄存器控制。看門狗定時器包括一個15 位計數器,它的頻率由32kHz 時鍾源規定。注意用戶不能獲得15 位計數器的內容。在all power modes下,15 位計數器的內容保留,且當重新進入active mode,看門狗定時器繼續計數。

 

2、看門狗模式

  當系統重啟后看門狗定時器失能。To start the WDT in watchdog mode, the WDCTL.MODE[1:0] bits must be set to 10. The Watchdog Timer counter then starts incrementing from 0. When the timer is enabled in watchdog mode, it is not possible to disable the timer. Therefore, writing 00 or 01 to WDCTL.MODE[1:0] has no effect if the WDT is already operating in Watchdog mode.

  WDT 運行在一個頻率為32.768 kHz(當使用32 kHz XOSC時)的看門狗定時器時鍾上。這個時鍾頻率的超時期限等於1.9ms,15.625 ms,0.25 s 和1s,分別對應64,512,8192 和32768 的計數值設置。

  當計數器達到設定的計數值時,看門狗會對系統產生一個reset信號,如果在計數器到達設定值之前執行了看門狗clear序列,counter的值會被重置為0,並會繼續遞增。看們狗的clear序列包含:writing 0xA to WDCTL.CLR[3:0], followed by writing 0x5 to the same register bits within one watchdog clock period. 如果這個完整序列不能在watch dog時期結束前完成,看門狗就會產生一個系統reset信號。

  When the WDT has been enabled in watchdog mode, it is not possible to change the mode by writing to the WDCTL.MODE[1:0] bits and the timer interval value can not be changed.

 

3、定時器模式

  To start the WDT in timer mode, the WDCTL.MODE[1:0] bits must be set to 11. The timer is started and the counter starts incrementing from 0. When the counter reaches the selected interval value, the timer produces an interrupt request  (IRCON2.WDTIF/IEN2.WDTIE).

  In timer mode, it is possible to clear the timer contents by writing a 1 to WDCTL.CLR[0]. When the timer is cleared, the content of the counter is set to 0. Writing 00 or 01 to WDCTL.MODE[1:0] stops the timer and clears it to 0.

  The timer interval is set by the WDCTL.INT[1:0] bits. The interval cannot be changed during timer operation, and should be set when the timer is started. In timer mode, a reset is not produced when the timer interval has been reached.

  注意:如果看門狗模式被選擇,那只能等到芯片reset之后定時器模式才能被選擇。

 

4、工程DEMO

main code:

 1 /****************************************************************************
 2 * 文 件 名: main.c
 3 * 描    述: 打開看門狗后,得記得喂狗,不然系統就會不停地復位了
 4 ****************************************************************************/
 5 #include <ioCC2530.h>
 6 
 7 typedef unsigned char uchar;
 8 typedef unsigned int  uint;
 9 
10 #define LED1 P1_0       // P1.0口控制LED1
11 #define LED2 P1_1       // P1.1口控制LED2
12 
13 
14 /****************************************************************************
15 * 名    稱: DelayMS()
16 * 功    能: 以毫秒為單位延時 16M時約為535,系統時鍾不修改默認為16M
17 * 入口參數: msec 延時參數,值越大,延時越久
18 * 出口參數: 無
19 ****************************************************************************/
20 void DelayMS(uint msec)
21 { 
22     uint i,j;
23     
24     for (i=0; i<msec; i++)
25         for (j=0; j<535; j++);
26 }
27 
28 /****************************************************************************
29 * 名    稱: InitLed()
30 * 功    能: 設置LED燈相應的IO口
31 * 入口參數: 無
32 * 出口參數: 無
33 ****************************************************************************/
34 void InitLed(void)
35 {
36     P1DIR |= 0x03;      //P1.0、P1.1定義為輸出
37     LED1 = 1;           //默認LED燈為熄滅狀態
38     LED2 = 1;
39 }
40 
41 
42 void Init_Watchdog(void) 43 { 44 WDCTL = 0x00; //打開IDLE才能設置看門狗 45 WDCTL |= 0x08; //定時器間隔選擇,間隔一秒 46 } 47 
48 void FeetDog(void) //喂狗 49 { 50 WDCTL = 0xa0; //清除定時器。當0xA跟隨0x5寫到這些位,定時器被清除 51 WDCTL = 0x50; 52 LED2 = 0; //系統不復位LED2燈長亮 53 } 54 
55 /****************************************************************************
56 * 程序入口函數
57 ****************************************************************************/
58 void main(void)
59 {
60     InitLed();        //調用初始化函數
61     Init_Watchdog();
62 
63     while(1)
64     {         
65         //LED1 = ~LED1;   //僅指示作用。
66         DelayMS(300);
67         LED2=0;
68                
69         //FeetDog();     //喂狗系統將不再主動復位,LED2長亮
70                        //注釋FeetDog函數時系統不斷復位,LED2燈閃爍
71     }
72 }

 其中42~46行用於看門狗初始化:

42 void Init_Watchdog(void) 43 { 44 WDCTL = 0x00; //打開IDLE才能設置看門狗 45 WDCTL |= 0x08; //定時器間隔選擇,間隔一秒 46 }

第44行令WDCTL為0是因為下表WDCTL中關於MODE介紹——MODE[1:0]是用來模式選擇,這兩位用來在Watchdog模式或Timer模式啟動看門狗定時器。其中有個主意說明“如果在timer模式想切換到看門狗模式,第一步需要停止WDT,然后才能在看門狗模式啟動WDT。當處在看門狗模式,向這些位寫數據是無效的”。因此向MODE中寫00是使讓看門狗處於IDLE模式(停止timer),接着才能啟動WDT。

第45行是設置INT,選擇超期時限為1s(即設置INT[1:0]=00)

 

 

第48~53行是喂狗的函數,其中第50、51行設置設置WDCTL為0xa0,緊接着設置為0x50,使一個clear序列,用於清除定時器(第2節紅色字體部分由介紹)

48 void FeetDog(void) 49 { 50 WDCTL = 0xa0; //清除定時器。當0xA跟隨0x5寫到這些位,定時器被清除 51 WDCTL = 0x50; 52 LED2 = 0; //系統不復位LED2燈長亮 53 }

 

因此,整個工程的意思是:初始化看門狗並設置1s種的喂狗期限,如果整個工程執行過程中超過1s不喂狗,看門狗timer就會產生一個系統reset信號讓系統重置。因此代碼中69行如果注釋掉喂狗,帶來的結果就是系統不斷重啟LED2不斷閃爍;如果喂狗則LED2常亮。

 

 

Zigbee系列文章:

[ZigBee] 1、 ZigBee簡介

[ZigBee] 2、 ZigBee開發環境搭建

[ZigBee] 3、ZigBee基礎實驗——GPIO輸出控制實驗-控制Led亮滅

[ZigBee] 4、ZigBee基礎實驗——中斷

[ZigBee] 5、ZigBee基礎實驗——圖文與代碼詳解定時器1(16位定時器)(長文)

[ZigBee] 6、ZigBee基礎實驗——定時器3和定時器4(8 位定時器)

[ZigBee] 7、ZigBee之UART剖析(ONLY串口發送)

[ZigBee] 8、ZigBee之UART剖析·二(串口收發)

[ZigBee] 9、ZigBee之AD剖析——AD采集CC2530溫度串口顯示

[ZigBee] 10、ZigBee之睡眠定時器

[ZigBee] 11、ZigBee之睡眠定時器二

 

 

PS:如果您覺得還不錯,點個贊,讓更多人受益~

@beautifulzzzz 2016-07-20 continue~  
e-mail:beautifulzzzz@qq.com 
sina:http://weibo.com/beautifulzzzz?is_all=1

 


免責聲明!

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



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