FLCK、HCLK和PCLK的關係

三星官方搭載的wince系統的FLCK值爲400MHz,HCLK值爲100MHz、PCLK值爲50MHz。那麼這些值通過什麼方法計算出來呢?大概過程如下,這些值在外部晶振12MHz的基礎上通過PLL的作用倍頻到我們需要的核心頻率如400MHz,由於該頻率過高,需要通過對預分頻器進行適當的設置獲取外圍設備能夠正常工作的頻率如HCLK 100MHz、PLCK 50MHz。

Fclk(給CPU核供給時鐘信號,我們所說的s3c2410的cpu主頻爲200MHz,就是指的這個時鐘信號,相應的,1/Fclk即爲cpu時鐘週期)、Hclk(爲AHB bus peripherals供給時鐘信號,AHB爲advanced high-performance bus)、Pclk(爲APB bus peripherals供給時鐘信號,APB爲advanced peripherals bus)。

AHB總線連接高速外設,低速外設則通過APB總線互連。顯然,對不同總線上的外設,應該使用不同的時鐘信號,AHB總線對應Hclk,APB總線對應Pclk。那麼事先就應該弄清楚,每條總線對應的外設有那些,這樣在設置好時鐘信號後,對應外設的初始化的值就要依此而確定了。

 
    AHB bus上的外設有LCD controller(CONT代表controller,控制器)、USB Host CONT、ExtMaster、Nand CONT和nand flash boot loader、bus CONT、interrupt CONT、power management、memory CONT(sram/nor/sdram等)。
 
    APB bus上的外設有UART、USB device、SDI/MMC、Watch Dog Timer、bus CONT、spi、iic、iis、gpio、rtc、adc、timer/pwm。

S3C2440使用了三個倍頻因子MDIV、PDIV和SDIV來設置將FIN倍頻爲MPLL,也就是FCLK

MPLL=(2*m*FIN)/(p*2^s) where m=(MDIV+8), p=(PDIV+2), s="SDIV"

寄存器MPLLCON就是用來設置倍頻因子的


理論上,你可以通過設置該寄存器來實現不同的頻率,然而,由於實際存在的各種約束關係,設置一個適當的頻率並不容易,手冊上列出了一些常用頻率的表格,


例如,假設輸入時鐘FIN=16.9344M,MDIV=110, PDIV="3", SDIV="1",

利用上面的公式,FCLK=2*16.9344*(110+8)/((2+3)*2)=399.65

關於USB時鐘

S3C2440有兩個鎖相環,一個主鎖相環MPLL提供給FCLK的,另外一個UPLL是提供給USB時鐘(48MHz)的,與MPLL一樣,UPLL的產生也是通過UPLLCON寄存器設置分頻因子得到,計算公式稍有不同:

UPLL=(m*FIN)/(p*2^s) where m=(MDIV+8), p=(PDIV+2), s="SDIV",同樣,可以通過查表得到一個合適的值。

最後值得一提的是,在CLKDIVN的第三位DIVN_UPLL用來設置USB時鐘UCLK和UPLL的關係,如果UPLL已經是48Mhz了,那麼這一位應該設置爲0,表示1:1的關係,否則是1:2的關係

在這裏有必要說明FCLK、HCLK、PCLK的含義:

FCLK爲內核時鐘,

HCLK爲總線時鐘(包括USB時鐘):HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD controller, the DMA and USB host block. 也就是總線時鐘,包括USB時鐘。

PCLK is used for APB bus, which is used by the peripherals such as WDT, IIS, I2C, PWM timer, MMC interface,ADC, UART, GPIO, RTC and SPI.即IO接口時鐘,(如常用的SPI、I2C、UART的時鐘配置都是通過PCLK時鐘爲基準的)。

 

設置MPLLCON與設置CLKDINV的代碼如下:

;設置MPLLCON

ldr     r0, = MPLLCON

ldr      r1, = ((92 << 12) + (1 << 4) + 1)

str     r1, [r0]

 

MPLLCON的配置是用來確定FCLK頻率的,計算公式如下:

FLCK、HCLK和PCLK的關係

圖1 計算FLCK

 

 

從“ldr      r1, = ((92 << 12) + (1 << 4) + 1) ”該代碼中可以看到數值存在移位操作,即92<<12、1<<4,這個可以參考圖2各預分頻值的配置。

FLCK、HCLK和PCLK的關係

 

圖2 MDIV、PDIV、SDIV

 

MDIV的配置在MPLLCON的[19:12]位,因此配置MDIV的值需要左移12位。同樣的道理,配置PDIV值需要左移4位,SDIV值需要左移0位(左移0位相當於不用偏移,廢話,嘻嘻)。

 

那麼根據圖1計算FLCK的公式,計算過程如下:

 

FCLK=2*(92+8)*(12000000)/(3+2^1)=400000000=400MHz

 

當FCLK得到正確的配置後,這時就需要對HCLK、FCLK進行配置了,即進行預分頻操作,該配置過程很見到,只需要對CLKDIVN簡單配置一下就OK了。

 

CLKDIVN寄存器內容如圖3。

FLCK、HCLK和PCLK的關係

 

;設置CLKDIVN

ldr r0,=CLKDIVN

ldr r1,=0x5

str r1,[r0]

 

CLKDIVN的配置值爲0x5,即FCLK:HCLK:PCLK=1:4:8。相對應的頻率將會是400MHz、100MHz、50MHz。

發佈了23 篇原創文章 · 獲贊 17 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章