ARM9 S3C2440 定時器中斷

2021-09-07 21:14:11 字數 2437 閱讀 8272

在講解之前,先介紹一下s3c2440時鐘系統。一般來說,mcu的主時鐘源主要是外部晶振或外部時鐘,而用的最多的是外部晶振。在正確情況下,系統內所使用的時鐘都是外部時鐘源經過一定的處理得到的。由於外部時鐘源的頻率一般不能滿足系統所需要的高頻條件,所以往往需要pll(鎖相環)進行倍頻處理。在s3c2440中,有2個不同的pll,乙個是mpll,另乙個是upll。upll是給usb提供48mhz。在這裡,我們主要介紹mpll。外部時鐘源經過mpll處理後能夠得到三個不同的系統時鐘:fclk、hclk和pclk。fclk是主頻時鐘,用於arm920t核心;hclk用於ahb匯流排裝置,如arm920t,記憶體控制,中斷控制,lcd控制,dma以及usb主模組;pclk用於apb匯流排裝置,如外圍裝置的看門狗,iis,i2c,pwm,mmc介面,adc,uart,gpio,rtc以及spi。這三個系統時鐘(fclk、hclk和pclk)是有一定的比例關係,這種關係是通過暫存器clkdivn中的hdivn位和pdivn位來控制的,因此我們只要知道了fclk,再通過這兩位的控制,就能確定hclk和pclk。而fclk是如何得到的呢?它是通過輸入時鐘(即外部時鐘源)的頻率,經過乙個計算公式(具體公式請查閱資料手冊)得到的,這個計算公式還需要三個引數(mdiv、pdiv、sdiv),而這三個引數是經過暫存器mpllcon配置得到的。最後,我們用最清晰的線路來繪製一下時鐘的產生過程:外部時鐘源→通過暫存器mpllcon得到fclk→再通過暫存器clkdivn得到hclk和pclk。這個配置過程在啟動檔案中就已完成。在本開發板上,外部晶振為12mhz,進過mpll倍頻以後得到400mhz的fclk,而fclk、hclk、pclk之間的比例關係為1:4:8,因此hclk為100mhz,pclk為50mhz。

s3c2440的時鐘系統就介紹到這裡,我們再回到定時器的配置上來。如何才能得到精確的定時呢?那就要靠tcfg0和tcfg1這兩個暫存器來配置定時器的頻率,即要確定tcnton每遞減乙個數所需要的時間,它們之間是倒數的關係。具體的計算公式為:

定時器輸出時鐘頻率=pclk ÷ (prescaler+1) ÷ divider

其中prescaler值由tcfg0決定,divider值由tcfg1決定,而prescaler只能取0~255之間的整數,divider只能取2、4、8和16。比如已知pclk為50mhz,而我們想得到某一定時器的輸出時鐘頻率為25khz,則依據公式可以使prescaler等於249,divider等於8。有了這個輸出時鐘頻率,理論上我們通過設定暫存器tcntbn就可以得到任意與0.04毫秒(1÷25000×1000)成整數倍關係的時間間隔了。例如我們想要得到1秒鐘的延時,則使tcntbn為25000(1000÷0.04)即可。

下面我們通過一段程式來演示利用定時器得到精確延時。這裡我們用到的是定時器4。這段程式的作用是讓蜂鳴器每隔2秒鐘響一次,持續時間為0.5秒,蜂鳴器響的同時伴隨著led亮。

#define _isr_startaddress 0x33ffff00

#define u32 unsigned int

#define pisr_timer4         (*(unsigned *)(_isr_startaddress+0x58))

#define rsrcpnd     (*(volatile unsigned *)0x4a000000)     //interrupt request status

#define rintmsk     (*(volatile unsigned *)0x4a000008)      //interrupt mask control

#define rintpnd     (*(volatile unsigned *)0x4a000010)      //interrupt request status

#define rgpbcon    (*(volatile unsigned *)0x56000010)      //port b control

#define rgpbdat    (*(volatile unsigned *)0x56000014)       //port b data

#define rgpbup     (*(volatile unsigned *)0x56000018) //pull-up control b

#define rtcfg0 (*(volatile unsigned *)0x51000000)      //timer 0 configuration

#define rtcfg1 (*(volatile unsigned *)0x51000004)      //timer 1 configuration

#define rtcon   (*(volatile unsigned *)0x51000008)      //timer control

#define rtcntb4 (*(volatile unsigned *)0x5100003c)       //timer count buffer 4

void __irq timer4_isr(void)

void main(void)

}

S3C2440定時器的使用

include mytimer.h include lhg def.h include uart.h include lhg def.h include 2440addr.h timer input clock frequency pclk pclk 50mhz prescaler 0 255 de...

S3C2440看門狗定時器

看門狗定時器的主要作用是在程式因為干擾而跑飛後,能夠使系統復位,不至於使系統永遠的死下去。它的原理與一般的定時器沒有多大區別,就是先要設定好一段時間,當超過這段時間後,就從當前執行的程式中跳出進入中斷處理程式中。但兩者的主要差別是,一般的定時器中斷是我們希望它發生的,因此我們不會在定時器中斷發生前的...

S3C2440 定時器中斷配置流程

s3c2440晶元中一共有5個16位的定時器,其中有4個定時器 定時器0 定時器3 具有脈寬調變功能,即他們都有個輸出引腳,可以通過定時器來控制引腳週期性的高低電平變化,定時器4沒有輸出引腳。上次離線執行pwm測試程式實驗的時候就用到了這塊,所以這次將pwm和定時器放在一起來學習。定時器部件的時鐘源...