一.前言
今天,我們要通過實驗學習和認識一下看門狗的使用,看門狗是為了防止防止程序跑飛的,通過不斷的喂狗,使看門狗能持續監管程序的運行狀態,當程序跑飛時,能及時把程序拽回來。
二.原理與分析
在CPU 可能受到一個軟件顛覆的情況下,看門狗定時器(WDT)用作一個恢復的方法。當軟件在選定時間間隔內不能清除WDT 時,WDT 必須就復位系統。看門狗可用於受到電氣噪音、電源故障、靜電放電等影響的應用,或需要高可靠性的環境。如果一個應用不需要看門狗功能,可以配置看門狗定時器為一個間隔定時器,這樣可以用於在選定的時間間隔產生中斷。這也是我們學習看門狗的作用,我們首先要配置WDT寄存器,WDT寄存器如下:
這次實驗選用的是看門狗模式,時間間隔1秒檢測一次,清除位也要配置,相當於喂狗。
三.程序
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0 //P1_0連接LED1
#define LED2 P1_1 //P1_1連接LED2
#define LED3 P1_4 //P1_4連接LED3
//函數聲明 void LED_IO_Init(void); void Watchdog_Init(void); void FeetDog(void); void Delayms(uint xms);
/********************* 函 數 名 : main 功能描述 : WatchDog測試(通過注釋掉“喂狗函數”來觀察實驗現象) 輸入參數 : NONE 輸出參數 : NONE 返 回 值 : NONE ****************/
void main(void)
{
LED_IO_Init(); //LED IO初始化
Watchdog_Init(); //看門狗初始化
while(1)
{
LED1=~LED1;
Delayms(1000); //通過注釋測試,可以看到LCD1以少於1s的時間間隔閃爍,說明系統在不停地復位 //
FeetDog(); // 防止程序跑飛
} }
/*************** 函 數 名 : LED_IO_Init 功能描述 : LED_IO初始化函數 輸入參數 : NONE 輸出參數 : NONE 返 回 值 : NONE *********/
void LED_IO_Init(void)
{
P1DIR=0xff;
LED1=0; //點亮LED1
LED2=0; //點亮LED2,指示作用
LED3=1; //點亮LED3,指示作用
}
/************************ 函 數 名 : Watchdog_Init 功能描述 : 看門狗初始化函數 輸入參數 : NONE 輸出參數 : NONE 返 回 值 : NONE *************************/
void Watchdog_Init(void)
{
WDCTL = 0x00; //這是必須的,打開IDLE才能設置看門狗
WDCTL |= 0x08; //時間間隔一秒,看門狗模式
}
/************************ 函 數 名 : FeetDog 功能描述 : 喂狗函數 輸入參數 : NONE 輸出參數 : NONE 返 回 值 : NONE ************************/
void FeetDog(void) { WDCTL = 0xa0; WDCTL = 0x50; }
/*************************** 函 數 名 : Delayms 功能描述 : 毫秒延時 輸入參數 : xms:延時時間,如 i=xms 即延時i/2毫秒 輸出參數 : none 返 回 值 : none ***********************/
void Delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
四.總結
通過上面這個程序,我們可以看出,主程序里一直在執行FeetDog()這個函數,也就是說一直在喂狗,使看門狗不進行復位,如果沒有喂狗這個函數,看門狗就要咬人了,也就是讓程序不斷的復位,從頭開始執行,看門狗在實際項目應用中,還是很常見的,希望大家多多理解。