【轉】ARM9硬件接口學習之一

Watchdog是整個ARM體系結構中相對比較簡單的接口,控制代碼只有幾行,寫起來比較容易。首先選擇學習watchdog,可以快速入門,先對底層硬件工作原理有個初步的認識。(Watchdog即通常我們所說的“看門狗”)

Watchdog原理上就是一個定時器。定時器timer對時鐘進行計數,當定時器溢出時,產生復位信號,使得整個系統復位。在程序或嵌入式系統中,需要定期的對看門狗timer進行復位重新計數,定時器不會溢出復位系統,從而保證系統的正常運行。當某種原因(例如干擾)引起程序跑飛或者進入死循環時,程序不能定期的復位看門狗timer,計數溢出產生復位信號,導致系統復位。從上面的解釋中可以看出,Watchdog的作用就是爲了防止系統因意外“跑飛”,導致整個系統癱瘓時,恢復(reset)系統運行

下面認真分析一下Watchdog的Datasheet。這一步不可省,要想對硬件寄存器賦值,操作硬件工作,必須對硬件的datasheet及其工作原理相當熟悉,瞭解該硬件對應的每個寄存的作用以及每一位的含義,這樣才能對其賦值。

這裏簡要的概括Watchdog的特性,詳細的WatchDog及寄存器各位定義參考S3c2410Datasheet的第18章WATCHDOG TIMER。
Watchdog Timer Block Diagram:

1.輸入時鐘爲PCLK(該時鐘頻率等於系統的主頻),它經過兩級分頻(Prescaler和frequency divisionfactor),最後將分頻後的時鐘作爲該定時器的輸入時鐘,當計數器期滿後可以產生中斷或者復位信號。

2.S3C2410的看門狗定時器有兩個功能
1)作爲常規定時器使用,並且可以產生中斷
2)作爲看門狗定時器使用,期滿時,它可以產生128個時鐘週期的復位信號

3.看門狗定時器計數值    重要
1)輸入到計數器的時鐘週期
t_watchdog = 1/( PCLK / (Prescaler value + 1) / Division_factor)
預分頻器Prescaler及分頻因子Divisionfactor的值由用戶在WTCON(看門狗時鐘控制寄存器)中設置。PCLK爲系統運行頻率,如200MHZ。
2)看門狗的定時週期
T = WTCNT * t_watchdog
WTCNT爲看門狗數據寄存器,用來設置定時多少個時鐘週期。乘以時鐘週期就是定時的總長度了。

4.看門狗定時器寄存器
1)控制寄存器(WTCON)      設置預分頻器及分頻因子值等 重要
2)數據寄存器(WTDAT)      若不設置WTCNT,會使用這裏的初始值(0x8000)。
(注:這裏我也不太確定,從datasheet上來看,好象是這個意思。但應該不影響使用。只要設置了WTCNT就行)
3)計數器寄存器(WTCNT)     用來設置定時多少個時鐘週期(t_watchdog)  重要
總的定時長度即T = WTCNT * t_watchdog

要控制Watchdog工作,我們只需要向這三個寄存器賦相應的值,Watchdog會按這些寄存器配置的值進行工作。

注:詳細的WatchDog寄存器各位定義參考S3c2410 Datasheet的第18章WATCHDOG TIMER。

5.下面我們分析一下這些寄存器:
1)控制寄存器(WTCON)



    這裏比較重要的是PrescalerValue位和Clock Select位(即division factor),計算定時器時鐘週期的公式裏用到這兩個值。
公式爲:t_watchdog = 1/( PCLK / (Prescaler value + 1) / Division_factor)。另外,因爲我們沒有進行任何系統時鐘頻率設定,即沒有使用PLL。系統默認工作頻率PCLK爲12MHZ(時鐘設置,以後實驗會介紹)。通過這三個值的設定,我們可以計算出Watchdog的時鐘週期。接着再在WTCNT寄存器中設置定時的時鐘週期數,根據公式T= WTCNT * t_watchdog就可以計算出整個定時時間。
2)計數器寄存器(WTCNT)
用來設置定時多少個時鐘週期(t_watchdog)
3)數據寄存器(WTDAT)
通常採用Reset value或和WTCNT值一樣即可。


實例分析
1.實驗目的:使用watchdog實現系統每隔2.66S左右就復位一次。

這裏有必要先介紹一下ADS下ARM接口程序的結構。通常我們的接口程序代碼結構如下:
包含head.s和main.c兩個文件
head.s是入口代碼,執行系統最初簡單的初始化。主要工作都放在main.c中的Main函數用C語言實現。以後我們的接口代碼都按這樣的結構來寫。
head.s內容如下:
IMPORT Main
      AREA Init,CODE,READONLY
           
      ENTRY
      
_start
      MOV  sp,#0x33000000 
      B Main            ;
      END

ARM標準彙編寫法方法參考《ARM應用程序開發詳解》第四章。這裏有下載:
http://blogimg.chinaunix.net/blog/upfile2/080124235942.pdf


main.c內容如下:
#define rWATCNT (*(volatile unsigned short int*)(0x53000008)) 
#define rWATCON (*(volatile unsigned int *)(0x53000000))
#define rWATDAT (*(volatile unsigned short int*)(0x53000004))
int Main()
{
      rWATCON = 0x8039;
      rWATCNT = 0x0800;
      rWATDAT = 0x0800;
      
      while(1)
      {
//         rWATCNT=0x0800;
      }
      
      return 0;
}

rWATCON的值設置爲0x8039,對應二進制碼爲0b1000 0000 00111001。對照WTCON寄存器每位的含義得出watchdog被配置爲:Prescaler value爲0x80 ,使能Watchdog Timer,clock divisonfactor爲128,關閉中斷,定時結束時產生reset信號。
根據時鐘週期計算公式:t_watchdog = 1/( PCLK / (Prescaler value + 1) /Division_factor ),計算出Watchdog時鐘週期t_watchdog=1/(3*2 ) S
rWATCNT值設置爲0x0800,根據公式T = WTCNT * t_watchdog計算出定時長度爲8/3≈2.66S

2.實驗結果測試:
   這裏使用h-jtag仿真器進行測試。配置好hjtag和axd,將ads編譯生成的watchdog.axf文件load到sdram0x30000000處執行run。大概2.66s左右,系統會自動復位。由於我的nandflash內之前已經燒錄了uboot,並且設置爲從nandflash啓動。所以系統復位後會從串口終端打印出uboot啓動的信息。若想取消系統復位,可以將上面代碼中rWATCNT=0x0800;這一行去掉。這行代碼的作用是不停復位計數寄存器的值,俗稱“餵狗”。這樣計數寄存器裏的值就永遠不會計數到0從而產生系統復位。

3.實驗總結:
通過這個實驗,我們對底層硬件工作原理有了初步的瞭解。其實控制某個硬件接口工作,就是往其寄存器裏賦值。硬件會按其寄存器裏的配置進行工作。我們寫接口代碼是這樣,寫驅動其實也是這樣,只是驅動在其上面做了好多層的封裝,包括操作系統層的封裝。搞懂硬件接口編程,對以後的驅動編程,也會有一定的幫助。
4.實驗代碼下載:

文件:
watchdog.rar
大小:
22KB
下載:
下載

返回ARM9硬件接口學習專題




本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/60011/showart_473417.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章