ARM9硬體介面學習之一 WatchDog

2021-05-25 18:02:53 字數 3531 閱讀 2387

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

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

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

這裡簡要的概括watchdog的特性,詳細的watchdog及暫存器各位定義參考s3c2410 datasheet的第18章watchdog timer。

watchdog timer block diagram:

1.輸入時鐘為pclk(該時鐘頻率等於系統的主頻),它經過兩級分頻(prescaler和

frequency division factor),最後將分頻後的時鐘作為該定時器的輸入時鐘,當計數器期滿後可以產生中斷或者復位訊號。

2.s3c2410的看門狗定時器有兩個功能

1)作為常規定時器使用,並且可以產生中斷

2)作為看門狗定時器使用,期滿時,它可以產生128個時鐘週期的復位訊號

3.看門狗定時器計數值

1)輸入到計數器的時鐘週期

t_watchdog = 1/( pclk / (prescaler value + 1) / division_factor )

預分頻器prescaler及分頻因子division factor的值由使用者在

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會按這些暫存器配置的值進行工作。

5.下面我們分析一下這些暫存器:

1)控制暫存器(wtcon)

這裡比較重要的是prescaler value位和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                 ;/*跳轉到c語言程式*/

endmain.c內容如下:

#define rwatcnt (*(volatile unsigned short int *)(0x53000008))

#define rwatcon (*(volatile unsigned int *)(0x53000000))

#define rwatdat (*(volatile unsigned short int *)(0x53000004))

int main()

return 0;

}rwatcon的值設定為0x8039,對應二進位製碼為0b1000 0000 0011 1001。對照wtcon暫存器每位的含義得出watchdog被配置為:prescaler value為0x80 , 使能watchdog timer,clock divison factor為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到sdram 0x30000000處執行run。大概2.66s左右,系統會自動復位。由於我的nand flash內之前已經燒錄了uboot,並且設定為從nandflash啟動。所以系統復位後會從串列埠終端列印出uboot啟動的資訊。若想取消系統復位,可以將上面**中rwatcnt=0x0800;這一行去掉。這行**的作用是不停復位計數暫存器的值,俗稱「餵狗」。這樣計數暫存器裡的值就永遠不會計數到0從而產生系統復位。

3.實驗總結:

通過這個實驗,我們對底層硬體工作原理有了初步的了解。其實控制某個硬體介面工作,就是往其暫存器裡賦值。硬體會按其暫存器裡的配置進行工作。我們寫介面**是這樣,寫驅動其實也是這樣,只是驅動在其上面做了好多層的封裝,包括作業系統層的封裝。搞懂硬體介面程式設計,對以後的驅動程式設計,也會有一定的幫助。

檔案:watchdog.rar

大小:22kb

ARM9硬體介面學習之四 CLOCK

s3c2410 cpu預設的工作主頻為12mhz,使用pll電路可以產生更高的主頻供cpu及外圍器件使用。s3c2410有兩個pll mpll和upll,upll專用與usb裝置。mpll用於cpu及其他外圍器件。通過mpll會產生三個部分的時鐘頻率 fclk hclk plck。fclk用於cpu...

ARM9學習筆記之 MMU

我記得有一次我去應聘arm linux軟體工程師。結果被問到arm中的虛擬記憶體是怎麼管理的。由於我只對x86平台下的mmu了解,所以我被問倒了。原來我所學的只是皮毛。還有很多東西值得我去深入。要做arm linux下的驅動,熟悉虛擬記憶體應該是必須的。arm9中的虛擬記憶體是怎麼實現的呢?以下是我...

ARM9學習筆記之 彙編

arm系列晶元與pc系列 可能我說法不太準確 晶元在指令設計上就有本質的區別。arm中每條指令是精簡指令集要麼是32位,要麼是16位。而pc的指令是複雜指令集,一條指令可以由多個位元組組成。1.關於函式呼叫方法 在arm彙編中,函式呼叫非常靈活。1 bl指令 bl initmem 呼叫 initme...