MSP430的看門狗常見用法以及中斷函數(shù)的書寫方法
今天下午看了一下MSP430的看門狗的基本用法
看門狗是為了防止程序跑飛而設(shè)定的,但是由于看門狗是一個(gè)類似于定時(shí)器,因此可以把他當(dāng)作定時(shí)器來使用
示例代碼:用看門狗定時(shí)器使一個(gè)led閃爍
#include
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDT_MDLY_32;//宏定義
IE1 |=WDTIE; //允許看門狗定時(shí)器中斷
P2DIR |= BIT7;
_BIS_SR(LPM0_bits+GIE);//在這里的話將cpu進(jìn)入低功耗模式
}
#pragma vector = WDT_VECTOR
__interrupt void watchdag_timer(void)
{
P2OUT ^=BIT7;//異或操作基本上是取反操作
}
注意這里有一個(gè)比較好的宏定義:WDTCTL = WDT_MDLY_32;進(jìn)入該宏定義會(huì)發(fā)現(xiàn)類似的宏定義有很多
/* WDT-interval times [1ms] coded with Bits 0-2 */
/* WDT is clocked by fSMCLK (assumed 1MHz) */
#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL) /* 32ms interval (default) */
#define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0) /* 8ms " */
#define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1) /* 0.5ms " */
#define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL) /* 1000ms " */
#define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */
#define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */
#define WDT_ADLY_1_9 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */
/* Watchdog mode -> reset after expired time */
/* WDT is clocked by fSMCLK (assumed 1MHz) */
#define WDT_MRST_32 (WDTPW+WDTCNTCL) /* 32ms interval (default) */
#define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) /* 8ms " */
#define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) /* 0.5ms " */
#define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) /* 1000ms " */
#define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */
#define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */
#define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " */
這里我們可以根據(jù)通常的需要,選擇合適的定時(shí)時(shí)間
說到定時(shí)時(shí)間,這里又不得不講一下中斷函數(shù),在IAR這個(gè)編譯環(huán)境中,一般中斷函數(shù)的寫法是
#pragma vector = 中斷向量
__interrupt void 中斷函數(shù)名(void)
{
用戶程序;
}
注意,中斷向量可以在430的頭文件中查找,中斷函數(shù)的聲明必須是void 中斷函數(shù)名(void),這是因?yàn)橹袛嗪瘮?shù)沒有返回值,也沒有中斷的形式參數(shù)
但是本人又在網(wǎng)站上看到另外一種用switch來寫的,就是一個(gè)中斷源對(duì)應(yīng)幾個(gè)中斷向量,這種寫法目前我還沒有見過源碼,所以不好總結(jié)