1. 程式人生 > >飛思卡爾普通看門狗與視窗看門狗

飛思卡爾普通看門狗與視窗看門狗

舉個例子,假設看門狗週期為10s,對於普通模式只要在10s內喂一次狗就可以了,超過10s則會重啟。對於視窗模式必須在最後的2s內喂狗才可以,喂早了不起作用,同樣超時會重啟。

下面是摘抄自百度文庫的文章。

連結:http://wenku.baidu.com/link?url=HQn9-QuKvsT9qQUBhzRSa13G-PD3o21iu8sA2V9YQykqQPauSknGahmBvbU5SOFXK1o6ngevZ81c2MX3y4RTulCNyPuUYlg6UDSNFjoU2om

目前接觸到的微控制器中都有看門狗模組,不過寫過的程式也比較簡單,程式能夠穩定執行,所以就不怎麼理會這看門狗,因此也不知道看門狗是怎麼回事。

DABAO最近寫了個超聲波測距的程式,執行過程中程式老是會無故停止,就是宕機了。因此不得不重新面對看門狗,經過兩天的奮鬥,終於讓看門狗順利工作了。下面記一下XS128的看門狗的相關暫存器及用法。

看門狗模組用於檢測程式的正常執行,啟動看門狗後,必須在看門狗復位之前向ARMCOP中依次寫入0X55和0XAA,這樣看門狗就會重新啟動計時。如果在規定時間內沒有完成向ARMCOP中依次寫入0X55和0XAA的操作,就會引起看門狗復位。這樣可以使程式重新執行,減小程式跑死的危害。

看門狗的設定比較簡單,只要配置好暫存器COPCTL即可用。

COPCTL的第七位為: WCOP。若寫入COPCTL_WCOP=1,則看門狗行運在視窗模式下,必須在看門狗週期的後25%時間內向ARMCOP依次寫入0X55和0XAA。若在其他時間寫入,或寫入其他值,都會讓看門狗溢位,使微控制器復位。若寫入COPCTL_WCOP=0,則看門狗執行在正常模式下。當看門狗使能後,只要在看門狗溢位週期內依次向ARMCOP寫入0X55和0XAA,使看門狗計數復零,即可。

第六位為:RSBCK,BDM模式下的COP和RTI 停止位。若COPCTL_RSBCK=1,則只要進入BDM模式,就停止COP和RTI(實時中斷)計數。若COPCTL_RSBCK=0,則在BDM模式下允許COP和RTI執行。

低三位為:CR2、CR1、CR0。這三位是看門狗時鐘分頻位。當CR[2:0]=000時,看門狗COP不可用。只要CR[2:0]不為000,看門狗就開啟了。當CR[2:0]=001時,分頻值為(2的14次方)。當CR[2:0]=010時,分頻值為(2的16次方)。當CR[2:0]=011時,分頻值為(2的18次方)。當CR[2:0]=100時,分頻值為(2的20次方)。當CR[2:0]=101時,分頻值為(2的22次方)。當CR[2:0]=110時,分頻值為(2的23次方)。當CR[2:0]=111時,分頻值為(2的24次方)。

看門狗的溢位頻率為:COP溢位頻率=OSCCLK /CR[2:0]。OSCCLK為晶振頻率。

在正常執行模式下,只要配置好COPCTL,再寫好喂狗程式,看門狗COP就可以工作了。

和看門狗COP相關的暫存器還有,不過一般情況下可以不管:

CLKSEL_COPWAI: 當CLKSEL_COPWAI=1時,COP在等待模式下不可用。當CLKSEL_COPWAI=0時,COP在等待模式下可繼續執行。

PLLCTL_PCE: 當PLLCTL_PCE=1時,COP在偽停止模式下可用。當PLLCTL_PCE=0時,COP要偽停止模式下不可用。

看門狗的初始化如下:

COPCTL_WCOP=0; //正常COP模式
COPCTL_RSBCK=0; //在BDM模式下允許COP和RTI執行
COPCTL_CR2=1; //CR[2:0]分頻值為(2的23次方)
COPCTL_CR1=1; //COP溢位週期=OSCCLK/CR[2:0]

COPCTL_CR0=0;

喂狗函式如下:

/////////////////////////////我的喂狗函式
void feeddog()
{
ARMCOP=0X55; //在特定時間內依次向ARMCOP寫入0X55,0XAA;
ARMCOP=0XAA;