關(guān)于S3C2410時(shí)鐘
第七部分是“clock & power management”,總結(jié)如下:
1 s3c2410的clock & power management模塊包含三個(gè)部分:clock control、usb control、power control。現(xiàn)在的關(guān)注點(diǎn)是clock control。
2、s3c2410有兩個(gè)pll(phase locked loop,鎖相環(huán),在高頻中學(xué)過,可以實(shí)現(xiàn)倍頻,s3c2410的高頻就是由此電路產(chǎn)生的)。其中一個(gè)是MPLL,M即為main,用來產(chǎn)生三種時(shí)鐘信號(hào):Fclk(給CPU核供給時(shí)鐘信號(hào),我們所說的s3c2410的cpu主頻為200MHz,就是指的這個(gè)時(shí)鐘信號(hào),相應(yīng)的,1/Fclk即為cpu時(shí)鐘周期)、Hclk(為AHB bus peripherals供給時(shí)鐘信號(hào),AHB為advanced high-performance bus)、Pclk(為APB bus peripherals供給時(shí)鐘信號(hào),APB為advanced peripherals bus)。在這里,需要了解一下AMBA system architecture了。這個(gè)可以到官方網(wǎng)站www.arm.com下載相關(guān)資料。簡單的說,AMBA是一種協(xié)議,這種協(xié)議已經(jīng)稱為片上組織通信的事實(shí)上的標(biāo)準(zhǔn)(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 on
需要知道的是,AMBA總線是ARM提出的一種解決方案,它并非唯一的規(guī)范,但是因?yàn)锳RM的廣泛使用,AMBA總線也就成為了事實(shí)上的規(guī)范了?,F(xiàn)在 AMBA總線最新為AMBA 3 specification版本,包括AMBA 3 AXI Interface、AMBA 3 AHB Interface、AMBA 3 APB Interface、AMBA 3 ATB Interface。而s3c2410還只能支持AMBA 2 specification,這個(gè)版本包含AMBA 2 AHB Interface、AMBA 2 APB Interface。也就是在s3c2410的框圖中看到的兩種總線接口。需要注意的是,這兩種總線所連的外設(shè)是有區(qū)別的。AHB總線連接高速外設(shè),低速外設(shè)則通過APB總線互連。顯然,對不同總線上的外設(shè),應(yīng)該使用不同的時(shí)鐘信號(hào),AHB總線對應(yīng)Hclk,APB總線對應(yīng)Pclk。那么事先就應(yīng)該弄清楚,每條總線對應(yīng)的外設(shè)有那些,這樣在設(shè)置好時(shí)鐘信號(hào)后,對應(yīng)外設(shè)的初始化的值就要依此而確定了。
AHB bus上的外設(shè)有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上的外設(shè)有UART、USB device、SDI/MMC、Watch Dog Timer、bus CONT、spi、iic、iis、gpio、rtc、adc、timer/pwm。
3、主時(shí)鐘源來自外部晶振或者外部時(shí)鐘。復(fù)位后,MPLL雖然默認(rèn)啟動(dòng),但是如果不向MPLLCON中寫入value,那么外部晶振直接作為系統(tǒng)時(shí)鐘。 EDUKIT-III的外部晶振有兩個(gè),一是用于系統(tǒng)時(shí)鐘,為12MHz;一個(gè)用于RTC,為32.768KHz。以前實(shí)驗(yàn)沒有向MPLLCON寫入數(shù)值,所以系統(tǒng)時(shí)鐘都是12MHz。從這里也可以發(fā)現(xiàn)一個(gè)問題,如果外部晶振開始沒有焊上,那么系統(tǒng)是無法正常啟動(dòng)的。因?yàn)榘凑丈鲜鲆?guī)則,復(fù)位后還沒有寫入 MPLLCON,這時(shí)又沒有可以使用的時(shí)鐘源,所以不會(huì)啟動(dòng)。也就是硬件完成后,這個(gè)12MHz的晶振是一定要焊上的,才能進(jìn)行后續(xù)的硬件測試工作。
二、clock設(shè)置的步驟
首先應(yīng)該讀懂下一段:
Power-On Reset (XTIpll) Figure 7-4 shows the clock beha The PLL restarts the lockup sequence toward the new frequency on |
這個(gè)主要是基于PLL的特點(diǎn)。簡單的描述就是,上電復(fù)位后,幾個(gè)ms后晶振起振。當(dāng)OSC時(shí)鐘信號(hào)穩(wěn)定之后,nRESET電平拉高(這是硬件自動(dòng)檢測過程)。這個(gè)時(shí)候,PLL開始按照默認(rèn)的PLL配置開始工作,但是特殊性就在于PLL在上電復(fù)位后開始是不穩(wěn)定的,所以s3c2410設(shè)計(jì)為把Fin在上電復(fù)位后直接作為Fclk,這是MPLL是不起作用的。如果要想是MPLL起作用,那么方法就是寫入MPLLCON寄存器值,然后等待LOCKTIME時(shí)間后,新的Fclk開始工作。下面把這些步驟分來來描述,軟件步驟部分結(jié)合程序進(jìn)行。
1、上電幾個(gè)ms后,晶振輸出穩(wěn)定。Fclk=晶振頻率。nRESET恢復(fù)高電平后,cpu開始執(zhí)行指令,這完全是硬件動(dòng)作,不需要軟件設(shè)置。
2、第一步軟件工作: 設(shè)置P M S divider control,也就是設(shè)置MPLLCON寄存器。
關(guān)于PMS,可以看Figure 7-2.寄存器MPLLCON的設(shè)置呢,其實(shí)有一定的規(guī)則,并非你想要的每個(gè)Fclk頻率都可以得到。官方推薦了一個(gè)表PLL VALUE SELECTION TABLE,要按照這個(gè)進(jìn)行。否則的話,就需要自己按照公式推算,但是mizi公司并不保證你的設(shè)置是合適的。所以,如果想要工作在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】
3、第二步軟件工作: 設(shè)置CLKDIVN。
這一步是設(shè)置分頻系數(shù),即Fclk為cpu主頻,Hclk由Fclk分頻得到,Pclk由Hclk分頻得到。假設(shè)Hclk是Fclk的二分頻,Pclk是 Hclk的二分頻,那么分頻系數(shù)比就是Fclk:Hclk:Pclk=1:2:4.那么Hclk為100MHz,總線時(shí)鐘周期為10ns。Pclk為 50MHz。
@ step2: change clock divider mov r1, #CLK_CTL_BASE mov r2, #vCLKDIVN str r2, [r1, #oCLKDIVN] |
4、第三步軟件工作: CLKDIVN的補(bǔ)充設(shè)置
If HDIVN = 1, the CPU bus mode has to be changed from the fast bus mode to the asynchronous 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 |
5、第四步軟件工作:等待locktime時(shí)間,讓新的Fclk生效
@ step4: stay locktime mov r1, #CLK_CTL_BASE ldr r2, =vLOCKTIME str r2, [r1, #oLOCKTIME] |
6、對外設(shè)的影響
在這個(gè)實(shí)驗(yàn)中,主要是有兩個(gè)需要改變,一個(gè)外設(shè)是UART,一個(gè)外設(shè)是SDRAM。
(1)UART,它是接在APB總線上,所以對應(yīng)的時(shí)鐘信號(hào)為Pclk,現(xiàn)在為50MHz。如果想要設(shè)置波特率為115200bps,那么根據(jù)公式 UBRDIV0=(int)(PCLK/(bps*16))-1計(jì)算,應(yīng)該為26。如果放到程序中,那么應(yīng)該注意形式。具體如下:
UBRDIV0 = ((int)(PCLK/16./UART_BAUD_RATE) -1); |
(2)SDRAM,主要的影響因素為刷新頻率。前面在SDRAM中沒有具體分析,現(xiàn)在可以詳細(xì)說明。使用了兩片HY57V561620CT-H,查看手冊其刷新頻率為8192 refresh cycles/64ms,所以刷新周期64ms/8192=7.8125us。看寄存器REFRESH的各個(gè)位的設(shè)置情況:
·REFEN[23]:開啟自動(dòng)模式,設(shè)為1
·TREFMD[22]:設(shè)為Auto refresh模式,設(shè)為0
·Trp[21:20]:看看RAS precharge Time,查看SDRAM手冊,發(fā)現(xiàn)-H系列此參數(shù)至少為20ns,現(xiàn)在Hclk對應(yīng)的時(shí)鐘周期為10ns,所以至少應(yīng)該為2個(gè)clock??梢栽O(shè)為00
·Tsrc: Semi Row Cycle Time,也就是RAS Cycle Time,至少65ms,所以至少得6.5clock,按照可選值,應(yīng)該設(shè)置為11
·Refresh[10:0]:
公式refresh period = (2^11 - refresh_count +1)/Hclk,由此推導(dǎo)出refresh_count=2^11+1-refresh period*Hclk。帶入數(shù)值,計(jì)算得出1268=0x04f4,這個(gè)數(shù)值要用四舍五入,減少誤差。
·其余的保留值,均設(shè)置為0
由此得出該寄存器的值應(yīng)該為0x008c04f4。
S3C2410 CPU默認(rèn)的工作主頻為12MHz,使用PLL電路可以產(chǎn)生更高的主頻供CPU及外圍器件使用。S3C2410有兩個(gè)PLL:MPLL和UPLL,UPLL專用與USB設(shè)備。MPLL用于CPU及其他外圍器件。
通過MPLL會(huì)產(chǎn)生三個(gè)部分的時(shí)鐘頻率:FCLK、HCLK、PLCK。FCLK用于CPU核,HCLK用于AHB總線的設(shè)備(比如SDRAM),PCLK用于APB總線的設(shè)備(比如UART)。從時(shí)鐘結(jié)構(gòu)圖中可以查看到使用不同時(shí)鐘頻率的硬件。
Figure 7-1. Clock Generator Block Diagram
(注:這里要注意從圖中看出,Uart使用的是PCLK,后面Uart實(shí)驗(yàn)會(huì)用到)
下面介紹MPLL的啟動(dòng)流程:
(注:下面內(nèi)容部分直接摘錄自《s3c2410完全開發(fā)流程》,Clock部分寫了非常好)
S3c2410 datasheet 224頁“Figure 7-4. Power-On Reset Sequence”展示了上電后MPLL啟動(dòng)的過程
請跟隨FCLK的圖像了解啟動(dòng)過程:
1、上電幾毫秒后,晶振輸出穩(wěn)定,F(xiàn)CLK=晶振頻率,nRESET信號(hào)恢復(fù)高電平后,
CPU開始執(zhí)行指令。
2、我們可以在程序開頭啟動(dòng)MPLL,在設(shè)置MPLL的幾個(gè)寄存器后,需要等待一段時(shí)間(Lock Time),MPLL的輸出才穩(wěn)定。在這段時(shí)間(Lock Time)內(nèi),F(xiàn)CLK停振,CPU停止工作。Lock Time的長短由寄存器LOCKTIME設(shè)定。
3、Lock Time之后,MPLL輸出正常,CPU工作在新的FCLK下。
設(shè)置S3c2410的時(shí)鐘頻率就是設(shè)置MPLL的幾個(gè)寄存器:
1、LOCKTIME:設(shè)為0x00ffffff
前面說過,MPLL啟動(dòng)后需要等待一段時(shí)間(Lock Time),使得其輸出穩(wěn)定。位[23:12]用于UPLL,位[11:0]用于MPLL。使用確省值0x00ffffff即可。
2、CLKDIVN:用來設(shè)置FCLK:HCLK:PCLK的比例關(guān)系,默認(rèn)為1:1:1
這里值設(shè)為0x03,即FCLK:HCLK:PCLK=1:2:4
CLKDIVN不同的設(shè)置及對應(yīng)的時(shí)鐘比例關(guān)系如下圖:
3、MPLLCON:設(shè)為(0x5c << 12)|(0x04 << 4)|(0x00),即0x5c0040
對于MPLLCON寄存器,[19:12]為MDIV,[9:4]為PDIV,[1:0]為SDIV。有如下計(jì)算公式:
MPLL(FCLK) = (m * Fin)/(p * 2^s)
其中: m = MDIV + 8, p = PDIV + 2
Fin 即默認(rèn)輸入的時(shí)鐘頻率12MHz。MPLLCON設(shè)為0x5c0040,可以計(jì)算出FCLK=200MHz,再由CLKDIVN的設(shè)置可知:HCLK=100MHz,PCLK=50MHz。
通常我們將如上時(shí)鐘初始化的過程寫成clock_init函數(shù)供其他函數(shù)調(diào)用,代碼如下:
void clock_init(void)
{
/*init clock*/
rLOCKTIME = 0xFFFFFF;
/*設(shè)置FCLK:HCLK:PCLK=1:2:4,這樣假設(shè)處理器主頻為200M,則HCLK為50M,PCLK為25M。ARM920T內(nèi)核使用FCLK, 內(nèi)存控制器,LCD控制器等使用HCLK,看門狗、串口等使用PCLK*/
rCLKDIVN = 0x3;
/* 設(shè)置時(shí)鐘頻率為202.7M*/
rMPLLCON = 0x5c0040;
}
評論