看門狗簡介?
? 看門狗通常用來提高系統(tǒng)的穩(wěn)定性。當(dāng)因為一些特殊的情況導(dǎo)致程序跑飛,或者運(yùn)行邏輯錯誤,而沒有及時喂狗時,看門狗會將MCU重新復(fù)位,以達(dá)到自動從異常中恢復(fù)的效果。建議用戶在所有應(yīng)用中都使用看門狗,以提高系統(tǒng)穩(wěn)定性。 AT32單片機(jī)有兩個看門狗:看門狗(WDT)和窗口看門狗(WWDT):
看門狗(WDT):一個12位的遞減計數(shù)器,當(dāng)計數(shù)器從某個值遞減到0的時候,系統(tǒng)會產(chǎn)生復(fù)位,如果在計數(shù)器遞減到0之前刷新了遞減計數(shù)器,那么就不會產(chǎn)生復(fù)位。
窗口看門狗(WWDT):一個7位的遞減計數(shù)器,當(dāng)計數(shù)器從某個值遞減到0x3F的時候,系統(tǒng)會產(chǎn)生復(fù)位,如果在規(guī)定時間刷新了計數(shù)器(窗口時間內(nèi)),那么就不會產(chǎn)生復(fù)位。
各個型號差異
? 各型號的窗口看門狗(WWDT)相同,程序兼容。
各型號的看門狗(WDT)基本功能相同,只是各個型號之間,可能去掉了更高級的窗口功能或者低功耗下可選的停止運(yùn)行功能,其余功能相同并且程序兼容。
表1. 各型號看門狗(WDT)差異 √:表示支持該功能,且功能相同。 ×:表示不支持該功能。 ?
使用場景對比
? 看門狗(WDT)和窗口看門狗(WWDT)作為兩種不同類型的看狗,有著不用的適用環(huán)境。 圖1. WDT與WWDT使用場景對比
特點對比
? 圖2. WDT與WWDT特點對比
看門狗WDT?
寄存器訪問
? 狀態(tài)寄存器 看門狗功能位于兩個不同的區(qū)域,寄存器部分位于1.2V電壓域,計數(shù)邏輯部分位于VDD電壓域,所以看門狗能夠在SLEEP、DEEPSLEEP、STANDBY模式下運(yùn)行。
對看門狗寄存器的寫操作位于1.2V電壓域,所以當(dāng)寫了寄存器之后,還需要將寄存器值同步到VDD電壓域。每一個寄存器都有一個同步標(biāo)志指示同步操作是否完成。每一次同步時間最多需要4個LICK時鐘,大約125us。當(dāng)寫了寄存器之后對應(yīng)的同步標(biāo)志自動置1,當(dāng)同步完成了之后標(biāo)志自動清0,在同步標(biāo)志清零之前,不允許再寫此寄存器。
圖3. 看門狗框圖
RLDF:當(dāng)該位為1時,表示重裝載值的同步正在進(jìn)行中;當(dāng)為0時,表示該過程執(zhí)行完成。
DIVF:當(dāng)該位為1時,表示預(yù)分頻器值的同步正在進(jìn)行中;當(dāng)為0時,表示該過程執(zhí)行完成。 WINF:當(dāng)該位為1時,表示窗口值的同步正在進(jìn)行中;當(dāng)為0時,表示該過程執(zhí)行完成。
標(biāo)志獲取函數(shù):
寄存器寫保護(hù)
看門狗寄存器受到寫保護(hù),在寫寄存器前需要先解鎖寫保護(hù),寫命令寄存器CMD=0x5555解鎖寫保護(hù)。當(dāng)寫一個其他值,將重新開啟讀保護(hù)。受讀保護(hù)的寄存器如下表所示: 表2. 看門狗寄存器
寄存器解鎖寫保護(hù)函數(shù):
? ?
時鐘結(jié)構(gòu)
? 圖4. 看門狗時鐘
看門狗計數(shù)器由LICK時鐘驅(qū)動,經(jīng)過8位的預(yù)分頻器得到遞減計數(shù)器時鐘。LICK是內(nèi)部RC時鐘,其典型值為40kHz,范圍為30kHz~60kHz之間(詳情請見對應(yīng)型號的數(shù)據(jù)手冊)。所以超時時間也是在一定區(qū)間內(nèi),使用時應(yīng)注意在超時時間配置上應(yīng)該留有余量,如果需要獲得較為精確的看門狗超時時間,可以先通過定時器測量出LICK頻率,然后再根據(jù)實際的LICK頻率計算超時時間。
通過寄存器DIV[2:0]配置配置不同的預(yù)分頻值,可配置預(yù)分頻值為4、8、16、32、64、128、256。
分頻設(shè)置函數(shù):
計數(shù)器
? 看門狗的計數(shù)器是一個12位的遞減計數(shù)器,最大值為0xFFF。當(dāng)開啟看門狗后,計數(shù)值將從設(shè)定的值開始遞減,當(dāng)遞減到0時,產(chǎn)生系統(tǒng)復(fù)位。 圖5. 看門狗重載
計數(shù)值通過重載寄存器RLD設(shè)置,在分頻值確定的情況下,該值的大小決定了看門狗復(fù)位的時間長 短,每當(dāng)往命令寄存器WDT_CMD寫入0xAAAA時,該寄存器的值便會更新到遞減計數(shù)器中(此操作通常稱為喂狗),喂狗的操作需要在計數(shù)器遞減到0之前進(jìn)行,不然會發(fā)生復(fù)位。
看門狗復(fù)位時間計算如下:
表3. 看門狗復(fù)位時間(LICK=40kHz)
重載值設(shè)置函數(shù):
重載看門狗計數(shù)器(喂狗)函數(shù):
窗口功能
? 當(dāng)WIN[11:0]設(shè)置為非默認(rèn)值(0xFFF)將開啟窗口功能。當(dāng)在計數(shù)值大于窗口值時重載計數(shù)器值將會產(chǎn)生系統(tǒng)復(fù)位,例如將WIN值設(shè)置成800時允許重載的窗口時間如下圖所示。 圖6. 窗口功能
窗口設(shè)置函數(shù):
低功耗停止計數(shù)
? 看門狗能夠在SLEEP、DEEPSLEEP、STANDBY模式下運(yùn)行,用戶可選擇進(jìn)入DEEPSLEEP、STANDBY模式后計數(shù)器是否停止計數(shù),可由用戶系統(tǒng)數(shù)據(jù)區(qū)中的nWDT_DEPSLP、nWDT_STDBY位配置。
如果設(shè)置了停止計數(shù),當(dāng)進(jìn)入了DEEPSLEEP、STANDBY模式后,看門狗計數(shù)器停止遞減,意味著看門狗在這兩種低功耗模式下不會發(fā)生復(fù)位,當(dāng)從這兩種模式喚醒后,計數(shù)器從進(jìn)入時的值繼續(xù)遞減。
圖7. 低功耗停止計數(shù)功能
用戶系統(tǒng)數(shù)據(jù)擦除函數(shù):
用戶系統(tǒng)數(shù)據(jù)配置函數(shù):
低功耗停止功能使用示例:
? ?
啟動看門狗
? 看門狗啟動方式分為硬件啟動和軟件啟動,當(dāng)看門狗啟動了之后不能被關(guān)閉,除非發(fā)生復(fù)位。
軟件啟動方式
向命令寄存器寫入0xCCCC,啟用看門狗。
看門狗軟件使能函數(shù):
硬件啟動方式
硬件啟動則需通過配置用戶系統(tǒng)數(shù)據(jù)區(qū)的nWDT_ATO_EN位來實現(xiàn),使能硬件看門狗后,看門狗將在上電復(fù)位后自動開始運(yùn)行。
硬件啟動看門狗使用示例:
? ?
使用方法
? 看門狗一般用于檢測程序跑飛或者死循環(huán),比如一個正常的程序運(yùn)行完的時間是10ms,可以設(shè)置看門狗超時的時間為20ms,當(dāng)程序運(yùn)行完便立即進(jìn)行喂狗操作,這樣便不會產(chǎn)生復(fù)位,超過20ms還未喂狗時,說明產(chǎn)生了故障,此時會復(fù)位MCU。
例如:要設(shè)置WDT超時時間為20ms,那么可以設(shè)置預(yù)分頻值為4,計數(shù)值為200
? 配置步驟: 1. 禁止寄存器寫保護(hù)
2. 設(shè)置預(yù)分頻值為4
3. 設(shè)置重載值為200
4. 啟用看門狗
5. 在應(yīng)用程序中重載計數(shù)器
? ?
窗口看門狗WWDT?
? 窗口看門狗(WWDT)主要作用是用來檢測軟件邏輯是否按照預(yù)期執(zhí)行,其喂狗時間是一個有上下范圍內(nèi),可以通過相關(guān)的寄存器,設(shè)定其上限時間和下限時間,喂狗的時間不能過早也不能過晚(當(dāng)遞減計數(shù)器的值小于0x40,或者當(dāng)遞減計數(shù)器在窗口外被刷新時產(chǎn)生復(fù)位)。 ?
時鐘結(jié)構(gòu)
? 圖8. 窗口看門狗時鐘
窗口看門狗時鐘由APB1時鐘分頻而來,由于APB1_CLK的精確性,因此窗口看門狗時間精度很高。APB1時鐘先經(jīng)過4096分頻后,再送到預(yù)分頻器,最后提供給7位遞減計數(shù)器CNT[6:0]??梢耘渲貌煌念A(yù)分頻值來獲得不同的時鐘,通過DIV[1:0]可配置預(yù)分頻值取值范圍為1、2、4、8。
分頻設(shè)置函數(shù):
計數(shù)器
? 窗口看門狗的計數(shù)器是一個7位的遞減計數(shù)器,最大值為0x7F,當(dāng)開啟看門狗后,計數(shù)值將從設(shè)定的值開始遞減,當(dāng)遞減到0x3F時,產(chǎn)生系統(tǒng)復(fù)位。
表4. 窗口看門狗復(fù)位時間(PCLK=72MHz)
計數(shù)值設(shè)置函數(shù):
? ?
窗口功能
? 窗口的值(WIN[6:0])可以自由設(shè)定,最大值為(0x7F),最小值必須大于下窗口的0x40,所以取值范圍為64~127(即:0x40~0x7F);只有當(dāng)遞減計數(shù)器的值小于等于窗口值時,才允許刷新遞減計數(shù)器,否則將會產(chǎn)生復(fù)位。
為了便于喂狗,應(yīng)用程序也可以利用重載計數(shù)器中斷(RLDIEN)進(jìn)行喂狗。當(dāng)遞減計數(shù)器到達(dá)0x40時,則產(chǎn)生中斷,在相應(yīng)的中斷服務(wù)程序中重新設(shè)置計數(shù)器。
圖9. 窗口功能
如上圖所示當(dāng)配置窗口值為0x4F時,不允許刷新的窗口為0x7F~0x50,允許刷新的窗口為0x4F~0x40。
重載標(biāo)志清除函數(shù):
重載標(biāo)志獲取函數(shù):
重載中斷使能函數(shù):
窗口設(shè)置函數(shù):
看門狗使能
? 設(shè)置WWDTEN=1使能窗口看門狗,當(dāng)窗口看門狗被打開后不能被關(guān)閉,直到復(fù)位。為了避免使能看門狗后立即發(fā)生復(fù)位,在使能看門狗時,應(yīng)該同時配置看門狗計數(shù)值。 窗口看門狗使能函數(shù):
使用方法
? 窗口看門狗一般用于檢測邏輯運(yùn)行是否正常,比如一個正常的程序執(zhí)行完的時間是10ms,當(dāng)程序在10ms以前執(zhí)行完說明出現(xiàn)了邏輯錯誤,可以設(shè)置看門狗窗口值為9ms,當(dāng)程序在9ms以前進(jìn)行喂狗時,說明程序產(chǎn)生了故障,此時會產(chǎn)生一個復(fù)位。
例如:當(dāng)PCLK1=36MHz時,要設(shè)置WWDT超時時間為9ms,那么可以設(shè)置預(yù)分頻值為4,總的分頻為 4x4096=16384。計數(shù)值為127,窗口值為108,此時從計數(shù)值減到窗口值時間約為9.1ms。
所以允許喂狗時間為9.1~29.1ms,不允許喂狗時間為0~9.1ms。
配置步驟:
1. 開啟窗口看門狗APB1時鐘
2. 設(shè)置預(yù)分頻值為4,總的分頻為4096x4=16384
3. 設(shè)置窗口值為108
4. 啟用看門狗
5. 在應(yīng)用程序中重載計數(shù)器
備注:需要在0x3F<遞減計數(shù)器<=窗口值執(zhí)行
案例 看門狗WDT使用?
功能簡介
? 演示看門狗(WDT)功能使用。 ?
資源準(zhǔn)備
? 1) 硬件環(huán)境: 對應(yīng)產(chǎn)品型號的AT-START BOARD
2) 軟件環(huán)境
projectat_start_f4xxexampleswdtwdt_reset 注:所有project都是基于keil 5而建立,若用戶需要在其他編譯環(huán)境上使用,請參考AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各種編譯環(huán)境(例如IAR6/7,keil 4/5)進(jìn)行簡單修改即可。 ?
軟件設(shè)計
? 1) 配置流程
初始化看門狗
在主程序中喂狗
2) 代碼介紹
main函數(shù)代碼描述
? ?
實驗效果
正常運(yùn)行時看門狗不會復(fù)位,當(dāng)按下按鍵后,停止喂狗,導(dǎo)致MCU復(fù)位。
復(fù)位后,如果檢查到是看門狗復(fù)位則LED4點亮,否則LED4不亮。
案例 窗口看門狗WWDT使用?
功能簡介
? 演示窗口看門狗(WWDT)功能使用。 ?
資源準(zhǔn)備
? 1) 硬件環(huán)境: 對應(yīng)產(chǎn)品型號的AT-START BOARD
2) 軟件環(huán)境
projectat_start_f4xxexampleswwdtwwdt_reset
注:所有project都是基于keil 5而建立,若用戶需要在其他編譯環(huán)境上使用,請參考AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各種編譯環(huán)境(例如IAR6/7,keil 4/5)進(jìn)行簡單修改即可。
軟件設(shè)計
? 1) 配置流程
初始化窗口看門狗
在主程序中喂狗
2) 代碼介紹
main函數(shù)代碼描述
? ?
實驗效果
正常運(yùn)行時窗口看門狗不會復(fù)位,當(dāng)按下按鍵后,停止喂狗,導(dǎo)致MCU復(fù)位。
復(fù)位后,如果檢查到是窗口看門狗復(fù)位則LED4點亮,否則LED4不亮。
評論
查看更多