|
看門狗定時器用來防止程序因供電電源、空間電磁干擾或其它原因引起的強烈干擾噪聲而跑飛的事故。在很多單片機中都內(nèi)置了看門狗,看門狗本身是一個定時器,當定時器溢出時即進行系統(tǒng)復位,因此需要在程序中對看門狗定時器進行清零,即常說的喂狗。 由于我用過AVR的單片機,和AVR的相比,MSP430的看門狗要靈活的多,首先默認看門狗是開著的,因此如果不使用看門狗的話要關閉,指令如下: WDTCTL = WDTPW + WDTHOLD 如果打開看門狗則需要在程序中清零,指令如下: WDTCTL=WDTPW+WDTCNTCL
這只是基本的應用,430的看門狗要稍微復雜一些,首先從IAR的頭文件中看看定義了幾種工作狀態(tài):
- /* 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 " */
從頭文件的定義中可以看出主要有兩種方式,一種就是當做普通的定時器使用,一種才是作為看門狗,另外就是時鐘源可選,選擇8M或者32K的晶振來獲得不同的延時,通過上面可以看出看門狗定時器最大的時間可以到1S,在程序中可以靈活的利用看門狗定時器實現(xiàn)想要的功能。
下面介紹兩個典型應用: 1、在動態(tài)數(shù)碼管顯示中的應用,具體代碼可以參考我之前的筆記,部分代碼如下: WDTCTL = WDT_ADLY_1_9; // 設置內(nèi)部看門狗工作在定時器模式,1.9ms中斷一次 //可以去看頭文件中具體的配置,這里使用的手表晶振64分頻計算可得是1.9ms IE1 |= WDTIE; // 使能看門狗中斷
__interrupt void watchdog_timer(void) { } 這個程序主要是將看門狗定時器當做普通定時器使用,1.9ms剛好適合動態(tài)掃描間隔,在看門狗中斷中對數(shù)碼管進行動態(tài)掃描,這樣使用相對于開一個定時器來說要有所方便。因此在需要的定時與看門狗定時器的幾個時間相同時可以考慮使用看門狗。 2、普通延時 WDTCTL = WDT_ADLY_1000; //間隔定時器,定時1000ms //延時2s for(i = 0; i < 3; i++) {
IFG1 &= ~WDTIFG; while(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; } 這個程序同樣是將看門狗當普通定時器使用,在主程序中讀取中斷標志位,實現(xiàn)延時效果,上面的程序為什么是延時2S自己分析。
這里面舉了兩個例子,是最近學習的一點小體會,當然還是不能忘了看門狗的本能工作,在程序較為簡單時可以考慮使用看門狗定時器簡化設計。另外還有一點覺得比較重要的是雖然頭文件中對寄存器都有了很好的定義,但是還是很有必要對著頭文件和寄存器把主要的寄存器看一面,弄清每一種工作模式的使用方式和注意點。
|