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 |
【轉】ARM9硬件接口學習之一
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.