MSP430G2553 看門狗餵狗問題

MSP430G2553編程用到看門狗,TI官方例程沒有看門狗餵狗例程,上網搜了看門狗例程,有兩個地方給出的看門狗初始化代碼是WDTCTL = WDT_ARST_1000(1秒的看門狗),餵狗程序是WDTCTL=WDT_ARST_1000+WDTCNTCL。經過測試,初始化代碼沒有問題,不餵狗的情況下每隔1秒重啓一次。但這個餵狗程序是有問題的,用這個餵狗程序看門狗會停掉,也就是看門狗回失去作用。表面上程序沒有重啓,好像餵狗程序起作用了,但實際是看門狗停掉了。(只把餵狗程序放到初始化最後面運行一次就知道了)

仔細看代碼發現WDT_ARST_1000的定義是這樣的:#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) ,也就是WDT_ARST_1000已經加了個WDTCNTCL(0x0008),再加一個相當於加了0x0010,也就是將WDTTMSEL置位了,從看門狗模式變成了計時中斷模式,導致看門狗不起作用了。

接下來試了其他幾種餵狗程序,官方的手冊給出的餵狗程序如下:

Periodically clear an active watchdog
MOV #WDTPW+WDTCNTCL,&WDTCTL

雖然是彙編,但意思應該是WDTPW+WDTCNTCL的值賦給寄存器WDTCTL,所以用了以下餵狗程序:

WDTCTL = WDTPW+WDTCNTCL;

貌似是OK的,但仔細看下發現有問題,因爲直接給WDTCTL這樣賦值相當於WDTCTL=WDT_MRST_32WDT_MRST_32,因爲

/* WDT is clocked by fSMCLK (assumed 1MHz) */
#define WDT_MRST_32         (WDTPW+WDTCNTCL)            /* 32ms interval (default) */

也就是這樣餵狗可以是可以但同時把看門狗時間改成了32ms,因爲直接賦值改變了其它位,所以很容易想到採用|=操作:

WDTCTL |= WDTPW+WDTCNTCL;

看上去很合理,但發現這個餵狗程序根本不起作用,過一秒就重啓。仔細看了下手冊原因可能是這樣的,WDTPW是看門狗密碼,讀的時候是0x69,寫的時候必須寫成0x5A。WDTCTL |= WDTPW+WDTCNTCL等價於

WDTCTL = WDTCTL+WDTPW+WDTCNTCL

也就是讀出來密碼0x69或上要寫的密碼WDTPW(0x5A),密碼就不對了,所以操作該寄存器不成功餵狗失敗。

試了以上各種方法,發現餵狗程序其實很簡單,跟初始化程序一樣即可:

WDTCTL = WDT_ARST_1000;

到最後發現初始化和餵狗程序都很簡單,但是這裏面有跟多個隱蔽的坑,稍不注意就掉進去了,並且看門狗一般是程序的最後一道保障,想想都可怕

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章