|
看門狗應(yīng)用實(shí)驗(yàn)
1、實(shí)驗(yàn)?zāi)康?
了解watchdog 的作用
掌握S3C2410 的watchdog 定時(shí)器的使用方法
2、實(shí)驗(yàn)內(nèi)容
實(shí)現(xiàn)看門狗復(fù)位
編程實(shí)現(xiàn)看門狗喂狗
3、實(shí)驗(yàn)設(shè)備
S3C2410 開發(fā)板
ADS1.2 集成開發(fā)環(huán)境,JTAG 調(diào)試器、串口連接線
4、實(shí)驗(yàn)原理
4.1 看門狗功能簡(jiǎn)述
嵌入式系統(tǒng)運(yùn)行時(shí)受到外部干擾或者系統(tǒng)錯(cuò)誤,程序有時(shí)會(huì)出現(xiàn)“跑飛”,導(dǎo)致整個(gè)系統(tǒng)癱瘓。為了防止這一現(xiàn)象的發(fā)生,在對(duì)系統(tǒng)穩(wěn)定性要求較高的場(chǎng)合往往要加入看門狗 (watchdog )電路?撮T狗的作用就是當(dāng)系統(tǒng)“跑飛”而進(jìn)入死循環(huán)時(shí),恢復(fù)系統(tǒng)的運(yùn)行。
4.2 看門狗的工作原理
其基本原理為:設(shè)本系統(tǒng)程序完整運(yùn)行一周期的時(shí)間是Tp,看門狗的定時(shí)周期為Ti,Ti>Tp,在程序正常運(yùn)行時(shí),定時(shí)器就不會(huì)溢出,若由于干擾等原因使系統(tǒng)不能在Tp時(shí)刻修改定時(shí)器的記數(shù)值,定時(shí)器將在Ti 時(shí)刻溢出,引發(fā)系統(tǒng)復(fù)位,使系統(tǒng)得以重新運(yùn)行,從而起到監(jiān)控的作用。
4.3S3C2410 的看門狗
S3C2410 的看門狗定時(shí)器有兩個(gè)功能:
作為常規(guī)時(shí)鐘,并且可以產(chǎn)生中斷;
作為看門狗定時(shí)器使用,當(dāng)時(shí)鐘計(jì)數(shù)減為0 (超時(shí))時(shí),它將產(chǎn)生一個(gè)128 個(gè)時(shí)鐘
周期(PCLK )的復(fù)位信號(hào)。
主要特性如下:
通用的中斷方式的16bit 定時(shí)器。
當(dāng)計(jì)數(shù)器減到0 (發(fā)生溢出),產(chǎn)生128 個(gè)PCLK 周期的復(fù)位信號(hào)。
下圖為看門狗的電路示意圖,看門狗時(shí)鐘使用PCLK 作為他的時(shí)鐘源,PCLK 通過(guò)預(yù)分頻產(chǎn)生適合的看門狗時(shí)鐘。
看門狗模塊包括一個(gè)預(yù)比例因子放大器,一個(gè)是四分頻器,一個(gè)16bit 計(jì)數(shù)器?撮T狗的時(shí)鐘源來(lái)自PCLK,為了得到較寬范圍的看門狗信號(hào),PCLK 先被預(yù)分頻,之后再經(jīng)過(guò)分 頻器分頻。預(yù)分頻比例因子的分頻值,都可以由看門狗控制器(WTCON )決定,預(yù)分頻值 的有效范圍從0 到256-1。分頻因子可以選擇16、32、64 或者128。
看門狗定時(shí)器記數(shù)值的計(jì)算公式如下:
t_watchdog=1/ [PCLK/( prescaler value +1)/ Division_factor ]
實(shí)驗(yàn)中PCLK=50MHz;prescaler =WTCON[15:8]=100;clock division factor=128
t_watchdog= 0.00025856
看門狗的定時(shí)周期為T=WTCH ×t_watchdog
調(diào)試環(huán)境下的看門狗
當(dāng)S3C2410 用嵌入式ICE 調(diào)試的時(shí)候,看門狗定時(shí)器的復(fù)位功能不能啟動(dòng),看門狗定時(shí)器能從CPU 內(nèi)核信號(hào)判斷出當(dāng)前CPU 是否處于調(diào)試狀態(tài),如果看門狗定時(shí)器確定當(dāng)前模 式是調(diào)試模式,盡管看門狗能產(chǎn)生溢出信號(hào),但是仍然不會(huì)產(chǎn)生復(fù)位信號(hào)。
5、S3C2410 相關(guān)寄存器
WTCON――看門狗定時(shí)器控制寄存器
看門狗控制寄存器能夠禁止或者允許看門狗時(shí)鐘,從四個(gè)不同的時(shí)鐘源中挑選時(shí)鐘信號(hào),允許或禁止中斷,并且能允許或禁止看門狗時(shí)鐘輸出。如果用戶想要使用看門狗作為普 通時(shí)鐘,應(yīng)該中斷使能,禁止看門狗定時(shí)器復(fù)位。
WTDAT――看門狗定時(shí)器數(shù)據(jù)寄存器
WTDAT 用于設(shè)置看門狗定時(shí)器的超時(shí)時(shí)間值,在初始化看門狗過(guò)程中,WTDAT 的值不會(huì)自動(dòng)加載到定時(shí)計(jì)數(shù)器中,首次使用定時(shí)器超時(shí)值為其初始值即0x8000,以后該寄存器的值會(huì)被自動(dòng)加載到WTCNT 寄存器中。
WTCNT――看門狗定時(shí)器計(jì)數(shù)寄存器
WTCNT 為看門狗定時(shí)器工作的時(shí)間計(jì)數(shù)器的當(dāng)前計(jì)數(shù)值,注意在初始化看門狗操作后,看門狗數(shù)據(jù)寄存器(WTDAT )的值不能自動(dòng)裝載到看門狗計(jì)數(shù)寄存器(WTCNT )中, 所以看門狗被允許之前應(yīng)高初始化看門狗計(jì)數(shù)寄存器的值。
6、看門狗應(yīng)用編程實(shí)現(xiàn)
由于看門狗是對(duì)系統(tǒng)的復(fù)位或者中斷的操作,所以不需要外圍的硬件電路。要實(shí)現(xiàn)看門狗的功能,只需要對(duì)看門狗的寄存器組進(jìn)行操作。即對(duì)看門狗的控制寄存器(WTCON )、 看門狗數(shù)據(jù)寄存器(WTDAT )、看門狗計(jì)數(shù)寄存器(WTCNT )的操作。
設(shè)計(jì)流程如下:
設(shè)置看門狗中斷操作,包括全局中斷和看門狗中斷的使能,看門狗中斷向量的定義。
對(duì)看門狗控制寄存器(WTCON )的設(shè)置,包括設(shè)置預(yù)分頻比例因子、分頻器的分
頻值、中斷使能和復(fù)位使能等。
對(duì)看門狗數(shù)據(jù)寄存器(WTDAT )和看門狗技術(shù)寄存器(WTCNT )的設(shè)置。
啟動(dòng)看門狗定時(shí)器。
6.1 主功能函數(shù)
/*************************************************
Function name: Main
Parameter : void
Description : 主功能函數(shù)
Return : void
Argument : void
Autor & date :
**************************************************/
int Main(void)
{
SetClockDivider(1, 1);//FLCK:HCLK:PCLK=1:2:4
SetSysFclk(DFT_FCLK_VAL);//Fout=200MHZ
Port_Init();
Uart_Select(0);
Uart_Init(0, UART_BAUD);
Uart_Printf("watchdog test is beginning\n");
watchdog_test();
}
6.2 看門狗測(cè)試程序
void watchdog_test(void)
{
//initialize interrupt registers
ClearPending(BIT_WDT);
//建立WatchDog 中斷
pISR_WDT=(unsigned)watchdog_int;
//Prescaler value=100、clock division factor=128
//t_watchdog=1/[PCLK/(Prescaler value+1)/Division_factor]=0.00025856
//disable watchdog
4
----------------------- Page 5-----------------------
rWTCON=((100<<8)|(3<<3));
//看門狗時(shí)鐘周期T=WTCNT*t_watchdog=4S
//看門狗喂狗
rWTDAT=15000;
rWTCNT=15000;
rWTCON|=((1<<5)|(1<<2));//enable Watchdog timer ang watchdog interrupt
rWTCON|=((1<<5)|(1<<2)|1);//watchdog 復(fù)位,時(shí)間間隔為4S。
//rWTCON|=(1<<5)|(1<<2);//每4S watchdog 一次中斷。
//設(shè)置watchdog 為IRQ 中斷模式
rINTMOD&=0xFFFFFDFF;
//開中斷
EnableIrq(BIT_WDT);
while(f_ucSencondNo<11);
}
6.3 看門狗中斷服務(wù)程序
/**** watchdog_init ****/
void __irq watchdog_int(void)
{
//清除中斷
ClearPending(BIT_WDT);
f_ucSencondNo++;
if(f_ucSencondNo<11)
Uart_Printf("%ds",f_ucSencondNo);
else
{
//mask watchdog timer interrupt
DisableIrq(BIT_WDT);
Uart_Printf("watch dog is ok\n");
}
}
7、實(shí)驗(yàn)過(guò)程
運(yùn)行該程序后,將會(huì)在一段時(shí)間后自動(dòng)產(chǎn)生一個(gè)復(fù)位信號(hào),自動(dòng)啟動(dòng)開發(fā)板。
|
|