MSP430F5529 (二)看門狗的設(shè)置
所謂的看門狗功能,是指可以監(jiān)控程序是否由于某些干擾或者錯(cuò)誤而跑飛。其原理就是發(fā)生故障的時(shí)間滿足規(guī)定的定時(shí)時(shí)間后,產(chǎn)生一個(gè)非屏蔽中斷,使系統(tǒng)復(fù)位。這樣當(dāng)在調(diào)試程序或預(yù)計(jì)程序在某個(gè)地方可能瞬時(shí)發(fā)生錯(cuò)誤時(shí)(如外部電路干擾),選用設(shè)置看門狗定時(shí)中斷可以避免程序跑飛。
當(dāng)然,它也可以用作一般的定時(shí)功能。
不過(guò)實(shí)際上,由于看門狗定時(shí)器(作看門狗使用時(shí))需要很嚴(yán)密的設(shè)置(否則程序容易經(jīng)常重啟),所以很多人都不會(huì)使用這項(xiàng)功能。所以,程序一開(kāi)始就加上一句話:WDTCTL=WDTPW+WDTHOLD來(lái)關(guān)閉看門狗。
2.1 WDT_A的簡(jiǎn)介
特點(diǎn):
①有8種可選定時(shí)時(shí)間;
②看門狗模式;
③定時(shí)器模式;
④看門狗控制寄存器存在密碼保護(hù);
⑤時(shí)鐘源可選,且具有時(shí)鐘源意外保護(hù);
⑥可以被終止來(lái)節(jié)省能源;
⑦無(wú)論是用作看門狗還是定時(shí)器,其間隔時(shí)間都無(wú)法隨意設(shè)定,只能從8種設(shè)定中選擇,當(dāng)然可以通過(guò)更改時(shí)鐘頻率來(lái)間接更改時(shí)間;
注意默認(rèn)設(shè)置:程序啟動(dòng),看門狗即啟動(dòng);監(jiān)控周期為32ms/32.768KHZ(也就是說(shuō)當(dāng)看門狗的時(shí)鐘頻率為32.768KHZ時(shí),每過(guò)32ms,如果不軟件清空,程序就會(huì)重啟);所用的時(shí)鐘源為SMCLK(實(shí)際頻率不是32.768KHZ,后面會(huì)提到)。
2.2 WDT_A的寄存器及操作
注意:所有的寄存器都存字操作和字節(jié)操作模式。例如對(duì)WDTCTL寄存器直接賦值是字操作,你也可以通過(guò)WDTCTL_L(低字節(jié)寄存器)、WDTCTL_H來(lái)進(jìn)行字節(jié)操作賦值。
該類寄存器只能賦值不要進(jìn)行“|=、&=”等邏輯操作。
2.2.1看門狗控制寄存器WDTCTL(Watchdog Timer Control)
該寄存器是一個(gè)16位帶有密碼保護(hù)的讀寫(xiě)寄存器。所謂的密碼保護(hù),是為了防止該寄存器被不小心篡改。那么是如何實(shí)現(xiàn)密碼保護(hù)呢?事實(shí)上,該寄存器的高字節(jié)用來(lái)存放口令,低字節(jié)才是控制數(shù)據(jù)。寫(xiě)口令為05Ah,讀口令為069h,任何和口令不一樣的高字節(jié)操作都會(huì)導(dǎo)致系統(tǒng)復(fù)位。
該寄存器的位功能定義如下:(支持位操作)
WDTPW:Bits15-8,WDT Password,寫(xiě)為05Ah,讀為069h。
WDTHOLD:Bit7,WDT HOLD,
0:打開(kāi)看門狗計(jì)時(shí)器;
1:關(guān)閉
WDTSSEL:Bits6-5,WDT Clock Source Select時(shí)鐘源選擇
WDTTMSEL:Bit4,工作模式選擇
0:看門狗模式;
1:定時(shí)器模式;
WDTCNTCL:Bit3,計(jì)時(shí)器清零
0:無(wú)效;
1:清空計(jì)數(shù)器,即WDTCNT=0x0000h
WDTIS: Bits2-0,WDT Interval Select,間隔時(shí)間選擇。用來(lái)選擇計(jì)數(shù)的周期,共有8種時(shí)間可以選擇。
備注:括號(hào)前數(shù)字為計(jì)數(shù)器的值
2.2.2 看門狗計(jì)數(shù)值寄存器WDTCNT(Watchdog Timer Counter)
這是一個(gè)32Bit的加計(jì)數(shù)器,但是不能通過(guò)軟件來(lái)直接對(duì)其進(jìn)行賦值等操作,只能通過(guò)WDTCTL中的WDTIS來(lái)選擇時(shí)間?;蛘吣憧梢酝ㄟ^(guò)WDTSSEL選擇不同的時(shí)鐘源,來(lái)間接改變時(shí)間。
2.2.3 看門狗中斷 位控制
WDT利用SFRS總寄存器中的兩位來(lái)控制中斷。
WDT中斷標(biāo)志位:WDTIFG,位于SFRIFG1.0
WDT 中斷使能位:WDTIE,位于SFRIE1.0
看門狗模式:如果不及時(shí)對(duì)WDTCNT清零或者對(duì)WDT初始化,WDTIFG就會(huì)置位,然后程序就會(huì)重啟。
計(jì)時(shí)器模式:必須開(kāi)總中斷GIE和看門狗中斷WDTIE。此外,當(dāng)執(zhí)行完中斷服務(wù)程序后,標(biāo)志位WDTIFG會(huì)自動(dòng)清零。
2.3常用操作
/*關(guān)閉看門狗*/
WDTCTL=WDTPW+WDTHOLD;
/*喂狗,即對(duì)有效狀態(tài)的看門狗進(jìn)行清零操作*/
/*時(shí)間計(jì)滿還不喂狗就會(huì)導(dǎo)致程序重啟*/
/*WDTIS2即WDTIS=100,此時(shí)時(shí)間間隔設(shè)為1S,假定頻率為32.768KHZ*/
WDTCTL = WDTPW + WDTCNTCL+WDTSSEL0+WDTIS2;
/*將看門狗設(shè)置為計(jì)數(shù)器模式,計(jì)數(shù)8192約250ms,假定頻率為32.768KHZ*/
/* WDTIS2+WDTIS0即101*/
WDTCTL=WDTPW+WDTCNTCL+WDTTMSEL+WDTIS2+WDTIS0
總結(jié)例程:
/*首先將WDT設(shè)為定時(shí)器功能。而中斷服務(wù)子程序則是把WDT改為看門狗功能。這樣就通過(guò)中斷控制的周期性的重啟程序,實(shí)現(xiàn)了LED閃爍*/
/*注意,這里默認(rèn)的時(shí)鐘源不是32KHZ,而是內(nèi)部的DCO-SMCLK(之后會(huì)講到)1.045MHZ。所以前面WDTIS定義的時(shí)間大約都要縮小1045/32=32倍*/
#include <msp430.h>
void main(void)
{
/*清零-設(shè)定為計(jì)數(shù)器-時(shí)間設(shè)定為010模式,即256S/32=8S*/
WDTCTL=WDTPW+WDTCNTCL+WDTTMSEL+WDTIS1;
__enable_interrupt(); //開(kāi)總中斷
SFRIE1|=WDTIE; //開(kāi)看門狗定時(shí)器中斷
P1DIR=0xff;
int i,j;
P1OUT=0xff;
for(i=0;i<30000;i++)
for(j=0;j<50;j++); //延時(shí)約8S
P1OUT=0x00;
while(1);
}
/*中斷服務(wù)程序*/
#pragma vector=WDT_VECTOR
__interrupt void WatchTimer(void)
{
WDTCTL=WDTPW+WDTCNTCL+WDTIS1; //看門狗模式,時(shí)間設(shè)定約為8S
}
評(píng)論