前言
這篇主要介紹arm9時鐘與定時器方面,根據(jù)s3c2440手冊第七章的內(nèi)容來看,涉及到不少的知識點,power管理、時鐘、usb時鐘、camera等,接下來只介紹時鐘方面,其余部分以后再說
簡介
系統(tǒng)時鐘是整個電路的心臟,了解系統(tǒng)時鐘結(jié)構(gòu)對于后面學(xué)習定時器,UART等使用具有非常重要的作用,總體來說,與s3c2440處理器有關(guān)的時鐘主要有4種: FIN, FCLK, HCLK和PCLK 1.FIN:外部輸入晶振頻率 2.FCLK: 主要用于CPU核 3.HCLK:主要用于與AHB總線互連的設(shè)備(如存儲控制器, LCD控制器, 中斷控制器及DMA等)上 4.PCLK:主要用于與APB總線互連的低速設(shè)備(如定時器, UART, ADB等)上
圖解時鐘
s3c2440處理器系統(tǒng)時鐘分為兩個部分, 外部有時鐘輸入引腳,內(nèi)部用2個鎖相環(huán)將外部輸入時鐘倍頻到處理器工作說需要的時鐘, 外部時鐘頻率太高容易受到外部的干擾,因此一般外部時鐘頻率比較低, 如下圖:
■CLKDIVN:用于控制FCLK, HCLK和PCLK之間的比例關(guān)系
// LOCKTIME = 0x00ffffff; // 使用默認值即可,在下面會討論CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1/* 如果HDIVN非0,CPU的總線模式應(yīng)該從“fast bus mode”變?yōu)椤癮synchronous bus mode” */__asm__("mrc p15, 0, r1, c1, c0, 0\n" /* 讀出控制寄存器 */ "orr r1, r1, #0xc0000000\n" /* 設(shè)置為“asynchronous bus mode” */"mcr p15, 0, r1, c1, c0, 0\n" /* 寫入控制寄存器 */); MPLLCON = ((0x5c<<12)|(0x04<<4)|(0x01))
上面代碼注釋中,關(guān)于LOCKTIME的賦值,這個又是怎么回事兒呢,還是根據(jù)手冊
1
2
3
4
5
6
7
8
9
10
定時器 由上面可知,定時器是ABP總線設(shè)備,在PCLK的時鐘頻率下工作,s3c2440有5個16位定時器,定時器0,1,2,3有脈沖調(diào)制(PWM)功能, 因此這4個定時器也被稱為PWM定時器,定時器4是一個內(nèi)部定時器,無外部輸出引腳,定時器的時鐘源雖然是PCLK,但是還得通過內(nèi)部的兩個分頻器分頻后, 才能得到想要的工作頻率,然后輸出作為定時器的工作的時鐘,定時器0,1公用一個分頻器,其他3個定時器公用另一個分頻器,如下圖
定時器的工作原理描述,以定時器0為例: 1.首先,將TCMPB0,TCNTB0附初值 2.然后,設(shè)置定時控制器TCON,將TCON的第1位置1(手動更新位), 這樣TCMPB0,TCNTB0賦值給TCMPB0,TCNTB0 3.啟動定時器–>設(shè)置TCON第3位為1(當TCNT0的值減到0時,TCMPB0的值會自動加載到寄存器TCMP0和TCNT0中), 第0位為1(開啟定時器) 4.此時,定時器會減1計數(shù), 即TCNT0進行減1計數(shù), 當TCMP0與TCNT0相等時, TOUT0翻轉(zhuǎn) 之后介紹一下相關(guān)的寄存器在手冊中的定義: ■TCON:對于定時器0來講:
定時器的分頻 前面提到了定時器0的使用方法,但是沒有提到其最終的工作所需要頻率(1s中能記多少個數(shù))
void timer0_init(void) { TCFG0 = 99; // 預(yù)分頻器0 = 99 TCFG1 = 0x02; // 選擇8分頻 TCNTB0 = 62500; // 1秒鐘觸發(fā)一次中斷 TCMPB0 = 0; TCON |= (1<<1); ? // 手動更新(將TCNTB0,TCMPB0更新入TCNT0, TCMP0) ? ?TCON ? = 0x09; ? ? ?// 自動加載,清“手動更新”位,啟動定時器0 ?}
PWM功能 對于定時器0來講,上面的例子中TCNT0 1s內(nèi)減到0,則TOUT0反轉(zhuǎn)(電平變化), 但是定時器0還有個特性,就是如果TCNT0減到與比較值TCMP0相等,則TOUT0也發(fā)生反轉(zhuǎn),也就是說上面的例子將 TCMPB0 改成31250后,則TCNT0從62500減到31250(與TCMP0相等)TOUT0發(fā)生一次反轉(zhuǎn)(用時0.5s),TCNT0減到0又發(fā)生反轉(zhuǎn)(用時0.5s),這樣,1s內(nèi)發(fā)生兩次反轉(zhuǎn),如此循環(huán),輸出引腳0.5s反轉(zhuǎn)一次,即占空比50%(波形0.5秒為高電平,0.5秒為低電平這樣循環(huán)的波形)
void timer0_init(void) { TCFG0 = 99; // 預(yù)分頻器0 = 99 TCFG1 = 0x02; // 選擇8分頻 TCNTB0 = 62500; // 1秒鐘觸發(fā)一次中斷 TCMPB0 = 31250; TCON |= (1<<1); ? // 手動更新(將TCNTB0,TCMPB0更新入TCNT0, TCMP0) ? ?TCON ? = 0x09; ? ? ?// 自動加載,清“手動更新”位,啟動定時器0 ?}
注意,如果將上面代碼TCMPB0=31250,改為別的值,比如TCNTB0 /4,則輸出的波形一定發(fā)生變化(比如0.25秒為高電平,0.75s為低電平這樣循環(huán)的波形),即占空比也發(fā)生變化,這就是所謂的PWM功能
-
arm9
+關(guān)注
關(guān)注
2文章
290瀏覽量
54970 -
時鐘
+關(guān)注
關(guān)注
10文章
1713瀏覽量
131274 -
定時器
+關(guān)注
關(guān)注
23文章
3231瀏覽量
114326
原文標題:深入時鐘與定時器
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論