S3C2440 clock 工作原理
2440的12M是Oscillator
本文引用地址:http://butianyuan.cn/article/201611/319127.htmCrystal 無源晶體 Oscillator 有源晶體(里面有有源器件) |
無源晶振內(nèi)只有一片按一定軸向切割的石英晶體薄片,供接入運放(或微處理器的XTAL端)以形成振蕩.有源晶振內(nèi)帶運放,工作在最佳狀態(tài),電源后,可直接輸出一定頻率的等幅正弦波,一般至少有4引腳,體積稍大. |
準備先不跑系統(tǒng),把S3C2440和周邊硬件熟悉一下再說。
對于任何一個單片機,要使用它首先就要弄明白他的時鐘系統(tǒng),MCU的時鐘就像人的心臟,跳動的快慢,決定著系統(tǒng)的工作速度。S3C2440的datesheet上說,可以達到400M,但是也不是說,必須在400M的頻率下工作,主時鐘晶振來自于外部晶振(XTIPLL)或者是外部時鐘(EXTCLK)。時鐘生成器包含了一個振蕩器(振蕩放大器),其連接外部晶振,并且還有2個PLL,可以產(chǎn)生需要的高頻。
通過引腳OM[3:2]來決定時鐘源是Crystal還是EXTCLK,不過我用的開發(fā)板將OM[3:2]固定接地了,都是用外部晶振。有一點值得注意,在對MPLLCON寫入有效值之前,系統(tǒng)使用外部晶振或外部時鐘源的時鐘。即使用戶不準備改變MPLLCON的值,也應(yīng)當重新寫一次。
簡單說一下,S3C2440的時鐘構(gòu)成。
S3C2440具有2個PLL(Phase Locked Loop:用來產(chǎn)生高頻的電路),一個是MPLL, 用于產(chǎn)生FCLK, HCLK, PCLK三種頻率, 這三種頻率分別有不同的用途:
FCLK是CPU提供的時鐘信號,如果提到CPU的主頻是400MHz,就是指的這個時鐘信號。
HCLK是為AHB總線提供的時鐘信號, Advanced High-performance Bus,主要用于高速外設(shè),比如內(nèi)存控制器,中斷控制器,LCD控制器, DMA 以及USB host 。
PCLK是為APB總線提供的時鐘信號,Advanced Peripherals Bus,主要用于低速外設(shè),比如WATCHDOG,IIS, I2C, SDI/MMC, GPIO,RTC ,UART,PWM,ADC and SPI等等。
另外一個是UPLL,專門用于驅(qū)動USB host/Device。并且驅(qū)動USB host/Device的頻率必須為48MHz。
在系統(tǒng)復(fù)位之后,如果沒有設(shè)定PLL,則采用外部晶振的頻率作為FCLK,同時FCLK:HCLK:PCLK的比例關(guān)系為1:1:1。
下面說一些跟時鐘有關(guān)的寄存器設(shè)置:通過改變CLKDIVN可以改變FCLK,HCLK,PCLK的分頻比。
鎖定時間計數(shù)寄存器LOCKTIME(0x4c000000):一般使用默認就可以。
鎖相環(huán)控制寄存器[MPLLCON(0x4c000004)&UPLLCON(0x4c000008)]:
MPLL=(2*m*Fin)/(p*2^s) UPLL=(m*Fin)/(p*2^s)
其中m=(MDIV+8),p=(PDIV+2),s=SDIV
P,M范圍:1<=P<=62,1<=M<=248
注意:MDIV[19:12],PDIV[9:4],SDIV[1:0],當設(shè)置MPLL和UPLL值的時候,需要先設(shè)置UPLL再設(shè)置MPLL。
例如:MPLLCON = (92<<12) | (1<<4) |(1);//FCLK=400M
這里MDIV=92,PDIV=1,SDIV=1,那么m=100,p=3,s=1,且Fin=12M,所以FCLK=400M
再設(shè)置CLKDIVN=0x03;//FCLK:HCLK:PCLK=1:2:4
這里CLKDIVN(0x4c000014)用于決定三者的分配比例
一般設(shè)置這兩個就可以了。還有一個時鐘控制寄存器CLKCON(0x4c00000c)向相應(yīng)位寫1使能相應(yīng)時鐘,不過一般默認為1.
關(guān)于時鐘方面基本就是這么多了。
S3C2440 clock 工作原理
overview
時鐘和電源管理這一塊內(nèi)容包括三個部分:時鐘控制, USB控制, 電源控制
在s3c2440a的CPU上,時鐘控制邏輯可以產(chǎn)生需要的時鐘信號,包括給CPU用的FCLK, 給AHB總線外設(shè)用的HCLK以及給APB總線外設(shè)用的PCLK.S3C2440A含有兩個鎖相環(huán):一個是FCLK, HCLK和PCLK, 還有另外一個專門用于USB單元(48Hz).時鐘控制邏輯可以在沒有PLL的時候使時鐘變慢,并且可以用軟件的方法使時鐘與周邊設(shè)備連接與斷開, 這個功能可以節(jié)省功耗.
補充:
AMBA總線
先進的微控制器總線體系結(jié)構(gòu)AMBA規(guī)范定義了三種總線:
(1)AHB(Advanced High-performance Bus):用于連接高性能系統(tǒng)模塊。它支持突發(fā)數(shù)據(jù)傳輸方式及單個數(shù)據(jù)傳輸方式,所有時序參考同一個時鐘沿;
(2)ASB(Advanced System Bus):用于連接高性能系統(tǒng)模塊,它支持突發(fā)數(shù)據(jù)傳輸模式;
(3)APB(Advance Peripheral Bus):是一個簡單接口支持低性能的外圍接口。
對于電源控制邏輯,S3C2440A有不同的電源管理的主題,來對某一項任務(wù)來優(yōu)化電源功耗.S3C2440A中的電源管理單元可以有四種模式: 普通模式, SLOW 模式, IDLE模式, SLEEP模式.
功能描述
時鐘架構(gòu)
時鐘產(chǎn)生器包括一個連接在外部crystal上的晶振,并且有兩用于產(chǎn)生S3C2440A所需要的高頻信號的鎖相環(huán).
時鐘源的選擇
下表顯示了芯片模式控制引腳(OM3和OM2)的選擇與S3C2440A時鐘源的關(guān)系.
注意:
1) 盡管重啟后,MPLL會啟動,但是直到軟件正確設(shè)置了MPLLCON寄存器后,MPLL的輸出才作為系統(tǒng)的時鐘.在正確的設(shè)置被設(shè)置前,來自外部的crystal或extclk源直接作為系統(tǒng)時鐘.即使用戶并不想改變MPLLCON寄存器的默認值,用戶應(yīng)該在MPLLCON的寄存器中設(shè)置同樣的值.
2) OM[3:2]用于決定測試模式,當OM[1:0]是11的時候.
鎖相環(huán)
在時鐘產(chǎn)生器中的MPLL,作為一個電路,作用是在頻率與相伴上同步輸出信號與一個參考輸入信號.
時鐘控制邏輯
時鐘控制邏輯決定使用的信號源,PLL時鐘或外部時鐘. 當PLL配置成一個新的頻率時,時鐘控制邏輯中止FCLK的使用,直到使用PLL鎖時間的PLL的輸出穩(wěn)定后. 這種時鐘控制邏輯在通電重啟或從節(jié)電模式中醒來都起作用.
通電重啟(XTIpll)
在普通模式中變換PLL的設(shè)置
USB時鐘控制
FCLK, HCLK, PCLK
FCLK 用于ARM920T
HCLK 用于AHB總線,AHB總線被ARM920T用于,內(nèi)存控制器,中斷控制器,LCD控制器,DMA和USB host block.
PCLK 用于APB總線,APB總線是用于周邊設(shè)備的,如是WDT,IIS, I2C, PWM 計數(shù)器, MMC接口, ADC, UART, GPIO, RTC 和SPI
注意:
1) CLKDIVN必須小心設(shè)置,不要超過HCLK和PCLK的允許范圍.
2) 如果HDIVN不是0,CPU總線模式必須從快速總線模式轉(zhuǎn)換到異步總線模式,通過使用下面的指令來達到.(S3C2440不支持同步總線模式)
MMU_SetAsyncBusMode
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #R1_nF:OR:R1_iA
mcr p15, 0, r0, c1, c0, 0
如果HDIVN不是0, 并且CPU總線模式是快速總線模式,那么CPU將會在HCLK下工作.這種特性可以用來在不影響HCLK和PCLK的情況下改變CPU頻率成原來的一半或更多.
電源管理
在S3C2440A中,電源管理模塊通過軟件來控制系統(tǒng)時鐘以達到減少電源功耗的功能.這些主題跟PLL,時鐘控制邏輯(FCLK,HCLK,PCLK)和喚醒信號有關(guān).
S3C2440A有四種電源模式.下面的部分描述各種模式.各種模式之間的轉(zhuǎn)換并不是隨意的.
FCLK的值如何得到?
FCLK= Fout = 2 * m * Fin / (p*2^s), Fvco = 2 * m * Fin / p where : m=MDIV+8, p=PDIV+2, s=SDIV
MPLLVal [M:7fh,P:2h,S:1h] bootloader打印出來的信息.
code
mov r1, #0x4c000000
ldr r2, =0x7f021
str r2, [r1, #0x04]
與BOOTLOADER里打印出來的一樣.
^ 代表冪
So, FCLK =2* (127+8)*12M/4*2=405M
關(guān)于HCLK, PCLK的值,取決于CLKDIVN的值.
代碼如下:
mov r1, #0x4c000000
ldr r2, 0x5
str r2, [r1, #0x14]
所以CLKDIVN=5, HDIVN=10, PDIVN=1, 再看CAMDIVN
10: HCLK = FCLK/4 when CAMDIVN[9]=0
HCLK = FCLK/8 when CAMDIVN[9]=1
PCLK = HCLK /2
CAMDIVN代碼中沒有進行設(shè)置,就用初始值.0
故
HCLK = FCLK/4
PCLK = FCLK/8
至此, clock部分設(shè)置結(jié)束.
MCLK:405MHz
HCLK:135MHz
PCLK:67.5MHz
在這里定時器時鐘頻率為PCLK/8=67.5/8=8.4375MHz
定時器0示例代碼:
轉(zhuǎn)載請注明出處,謝謝!
2 {
3 rTCFG1 &= ~(0x0F<<4);
4 rTCFG1 |= (2<<4);
5 rTCNTB1 =(S3C2440PCLK)/8/1000000;
6 rTCON &= ~(0x0F<<8);
7 rTCON |= (1<<11)|(1<<9)|(1<<8);
8 rTCON &= ~(1<<9);
9
10
11 while(t--)
12 {
13
14 while(rTCNTO1!=(rTCNTB1-1));
15
16 }
17
18 rTCON &= ~(1<<8);
19
20 }
21
22
23 void T1DelayNms(UINT16 t)
24 {
25 rTCFG1 &= ~(0x0F<<4);
26 rTCFG1 |= (2<<4);
27 rTCNTB1 =(S3C2440PCLK)/8/1000;
28 rTCON &= ~(0x0F<<8);
29 rTCON |= (1<<11)|(1<<9)|(1<<8);
30 rTCON &= ~(1<<9);
31
32
33 while(t--)
34 {
35 while(rTCNTO1!=(rTCNTB1-1));
36 }
37
38 rTCON &= ~(1<<8);
39
40 }
特別是要注意rTCNTOn與rTCNTBn的關(guān)系。
2 {
3 rTCFG1 &= ~0x0F;
4 rTCFG1 |= 2;
5 rTCNTB0 =(S3C2440PCLK)/8/1000000; //時鐘頻率為PCLK/8
6 //除以1000000表示進行微秒級延時
7 rTCON &= ~0x0F;
8 rTCON |= (1<<3)|(1<<1)|(1<<0);
9 rTCON &= ~(1<<1);
10
11
12 while(t--)
13 {
14 while(rTCNTO0!=(rTCNTB0-1));
15 }
16
17 rTCON &= ~(1<<0); //停止定時器0
18
19 }
20
21 void T0DelayNms(UINT16 t)
22 {
23 rTCFG1 &= ~0x0F;
24 rTCFG1 |= 2;
25 rTCNTB0 =(S3C2440PCLK)/8/1000; //時鐘頻率為PCLK/8
26 //除以1000表示進行毫級延時
27 rTCON &= ~0x0F;
28 rTCON |= (1<<3)|(1<<1)|(1<<0);
29 rTCON &= ~(1<<1);
30
31 while(t--)
32 {
33 while(rTCNTO0!=(rTCNTB0-1));
34 }
35
36 rTCON &= ~(1<<0); //停止定時器0
37 }
評論