1、對clock的基本認識
第 七部分是「clock & power management」,總結以下:async
1 s3c2410的clock & power management模塊包含三個部分:
clock control、usb control、power control。
如今的關注 點是clock control。
二、s3c2410有兩個pll(phase locked loop,鎖相環,
在 高頻中學過,能夠實現倍頻,s3c2410的高頻就是由此電路產生的)。
其中一個是MPLL,M即爲main,用來產生三種時鐘信號:
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)。在這裏,須要瞭解一下
AMBA system architecture了。這個能夠到官方網站,www.arm.com
下載相關資料。ide
簡單的說,AMBA是一種協議,這種協議已經稱爲
片上組織通訊的事實 上的標準
(the de facto standard for on-chip fabric communication)。
下面給 出英文描述:
The AMBA protocol is an open standard,
on-chip bus specification(規範) that details(詳述) a
stategy for the interconnection(互相聯絡) and management of
functional blocks that makes up a system-on-chip(SoC).
It facilitates(促進) "right-first-time" development of
embedded processors with one or more CPU/signal processors
and multiple peripherals. The AMBA protocol enhances a resuable
design methodology by defining a common backbone(高速鏈路)
for SoC modules. oop
須要知道的是,AMBA總線是ARM提出的一種解決方案,它並不是惟一的規範
, 可是由於ARM的普遍使用,AMBA總線也就成爲了事實上的規範了。
如今AMBA總線最新爲AMBA 3 specification版本,包括
AMBA 3 AXI Interface、AMBA 3 AHB Interface、AMBA 3 APB Interface
、AMBA 3 ATB Interface。而s3c2410還只能支持AMBA 2 specification,
這個版本包含AMBA 2 AHB Interface、AMBA 2 APB Interface。
也就是在s3c2410的框圖中看到的兩種總線接口。須要注意的是,
這 兩種總線所連的外設是有區別的。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。 翻譯
三、主時鐘源來自外部晶振或者外部時鐘。復位後,MPLL雖然默認啓動,
但 是若是不向 MPLLCON 中寫入value,那麼外部晶振直接做爲系統時鐘。
EDUKIT-III的外部晶振有兩個,一是用於系統時鐘, 爲12MHz;
一個用於RTC,爲32.768KHz。之前實驗沒有向MPLLCON寫入數值,
因此係統時鐘都是12MHz。從這裏也可 以發現一個問題,
若是外部晶振開始沒有焊上,那麼系統是沒法正常啓動的。
由於按照上述規則,復位後尚未寫入MPLLCON,這時又沒有 可使用的時鐘源,
因此不會啓動。也就是硬件完成後,這個12MHz的晶振是必定要焊上的,
才能進行後續的硬件測試工做。設計
2、clock設置的步驟
首先應該讀懂下一段:Power-On Reset (XTIpll)
Figure 7-4 shows the clock behavior(行爲) during the power-on reset
sequence. The crystal oscillator begins oscillation within several
milliseconds. When nRESET is released after the stabilization
of OSC (XTIpll) clock, the PLL starts to operate according to
the default PLL configuration. However, PLL is commonly known to be
unstable after power-on reset, so Fin is fed directly to FCLK
instead of the Mpll (PLL output) before the software newly configures
the PLLCON. Even if the user does not want to change the default
value of PLLCON register after reset, the user should write the same
value into PLLCON register by software.
The PLL restarts the lockup sequence toward the new frequency
only after the software configures the PLL with a new frequency.
FCLK can be configured as PLL output (Mpll) immediately after lock time.
這個主要是基於PLL的特色。簡單的描述就是,上電覆位後,幾個ms後晶振起振。
當OSC時鐘信號穩定以後,nRESET電平拉高(這是硬件自動 檢測過程)。這個時候,
PLL開始按照默認的PLL配置開始工做,可是特殊性就在於PLL在上電覆位後開始是
不穩定的,因此 s3c2410設計爲把Fin在上電覆位後直接做爲Fclk,這時MPLL是不起
做用的。若是要想是MPLL起做用,那麼方法就是寫入 MPLLCON寄存器值,
而後等待LOCKTIME時間後,新的Fclk開始工做。rest
下面把這些步驟分來來描述,軟件步驟部分結合程序進行。 orm
一、上電幾個ms後,晶振輸出穩定。Fclk=晶振頻率。nRESET恢復高電平後,
cpu開始執行指令,這徹底是硬件動做,不須要軟件設 置。 接口
二、第一步軟件工做: 設置PMS divider control,也就是設置MPLLCON寄存器。
關於PMS,能夠看Figure 7-2.寄存器MPLLCON的設置呢,其實有必定的規則,並不是你
想要的每一個Fclk頻率均可以獲得。官方推薦了一個表PLL VALUE SELECTION TABLE,
要按照這個進行。不然的話,就須要本身按照公式推算,可是mizi公司並不保證你
的設置是合適的。所 以,若是想要工做在200MHz,仍是按照vivi的推薦值便可。
step1: set P M S divider control
mov r1, #CLK_CTL_BASE
ldr r2, =vMPLLCON_200
str r2, [r1, #oMPLLCON]
其中,MDIV=0x5c,PDIV=0x04,SDIV=0x00.公式Mpll(Fclk)=(m*Fin)/(p*(2^s))
(m=MDIV+8, p="PDIV"+2,s=SDIV)
三、第二步軟件工做: 設置CLKDIVN。
這一步是設置分頻 係數,即Fclk爲cpu主頻,Hclk由Fclk分頻獲得,Pclk由Hclk分頻獲得。
假設Hclk是Fclk的二分頻,Pclk是Hclk 的二分頻,那麼分頻係數比就是Fclk:Hclk:Pclk=
1:2:4.那麼Hclk爲100MHz,總線時鐘週期爲10ns。Pclk爲 50MHz。
step2: change clock divider
mov r1, #CLK_CTL_BASE
mov r2, #vCLKDIVN
str r2, [r1, #oCLKDIVN]
四、第三步軟件工做: CLKDIVN的補充設置
If HDIVN = 1, the CPU bus mode has to be changed from the fast bus mode to
the ynchron bus mode using following instructions.MMU_SetAsyncBusMode
mrc p15,0,r0,c1,c0,0
orr r0,r0,#R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
If HDIVN="1" and the CPU bus mode is the fast bus mode, the CPU will operate
by the HCLK. This feature can be used to change the CPU frequency
as a half without affecting the HCLK and PCLK.
看了上段話,只須要翻譯出來就能夠了。
FCLK:HCLK=1:2
.macro MMU_SetAsyncBusMode
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #(R1_iA | R1_nF)
mcr p15, 0, r0, c1, c0, 0
.endm
step3: set asynchronous bus mode
MMU_SetAsyncBusMode
五、第四步軟件工做:等待locktime時間,讓新的Fclk生效
step4: stay locktime
mov r1, #CLK_CTL_BASE
ldr r2, =vLOCKTIME
str r2, [r1, #oLOCKTIME]
六、對外設的影響
在 這個實驗中,主要是有兩個須要改變,一個外設是UART,一個外設是SDRAM。
(1) UART,它是接在APB總線上,因此對應的時鐘信號爲Pclk,如今爲50MHz。
若是想要設置波特率爲115200bps,那麼根據公式 UBRDIV0=(int)(PCLK/(bps*16))-1
計算,應該爲26。若是放到程序中,那麼應該注意形式。具體以下:
UBRDIV0 = ((int)(PCLK/16./UART_BAUD_RATE) -1);
(2)SDRAM,主要的影響因素爲刷新頻率。前面在SDRAM中沒有具體分析,
如今能夠詳細說明。使用了兩片HY57V561620CT-H, 查看手冊其刷新頻率爲
8192 refresh cycles/64ms,因此刷新週期64ms/8192=7.8125us。
看寄存器 REFRESH的各個位的設置狀況:
·REFEN[23]:開啓自動模式,設爲1
·TREFMD[22]:設爲Auto refresh模式,設爲0
·Trp[21:20]:看看RAS precharge Time,查看SDRAM手冊,發現-H系列此參數至少爲20ns
,如今Hclk對應的時鐘週期爲10ns,因此至少應該爲2個clock。能夠 設爲00
·Tsrc: Semi Row Cycle Time,也就是RAS Cycle Time,至少65ms,因此至少得6.5clock,
按照可選值,應該設置爲11
·Refresh[10:0]:
公 式refresh period = (2^11 - refresh_count +1)/Hclk,
由此推導出 refresh_count=2^11+1-refresh period*Hclk。
帶入數值,計算得出1268=0x04f4,這個數值要用 四捨五入,減小偏差。
·其他的保留值,均設置爲0 由此得出該寄存器的值應該爲0x008c04f4。
阿南解說的:開發板上的12M晶振通過PLL倍頻獲得 FCLK;
lisuwei兄弟說: 爲了下降電磁干擾和下降板間佈線要求,芯片外接的晶振頻率一般很低 ,經過時鐘控制邏輯的PLL提升系統使時鐘。S3C2410/2440有兩個 PLL, MPLL和UPLL:UPLL用於USB設備,MPLL用於設置FCLK,HCLK,FCLK。 FCLK與輸入晶振的比例經過寄 存器MPLLCON設置。 FCLK,HCLK,FCLK三者的比例經過寄存器CLKDIVN,CAMDIVN(2440)設置。