一個嵌入式系統中,晶振就像心臟。必須先確定晶振,設置好系統的時鐘,WDT,UART,PWM,TIMER等模塊才能正常工作。和51系列單片機相比,S3C2440的時鐘電路很複雜。首先通過引腳OM2,OM3來選擇時鐘源。
以TQ2440開發板爲例,OM2,OM3都接地,外接12M晶振,主時鐘源和USB時鐘源都是外部晶振。
S3C2440具有2個PLL(Phase Locked Loop:用來產生高頻的電路),一個是MPLL, 用於產生FCLK, HCLK, PCLK三種頻率, 這三種頻率分別有不同的用途:
FCLK是CPU提供的時鐘信號,如果提到CPU的主頻是400MHz,就是指的這個時鐘信號。
HCLK是爲AHB總線提供的時鐘信號, Advanced High-performance Bus,主要用於高速外設,比如內存控制器,中斷控制器,LCD控制器, DMA 以及USB host 。
PCLK是爲APB總線提供的時鐘信號,Advanced Peripherals Bus,主要用於低速外設,比如WATCHDOG,IIS, I2C, SDI/MMC, GPIO,RTC ,UART,PWM,ADC and SPI等等。
另外一個是UPLL,專門用於驅動USB host/Device。並且驅動USB host/Device的頻率必須爲48MHz。
時鐘電路相關寄存器總共有7個,下面分別介紹。
MPLLCON(0X4C00 0004)和UPLLCON(0X4C00 0008)
這兩個寄存器用來設置主鎖相環產生的時鐘和USB鎖相環產生的時鐘。
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],當設置MPLL和UPLL值的時候,需要先設置UPLL再設置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
CLKCON(0X4C00 000C) 控制各種模塊如SPI,IIC,UART等的時鐘電路開關以及系統的SLEEP,IDLE模式,以便降低系統功耗。默認值是全部時鐘電路打開,系統工作在正常模式。
CLKSLOW(0X4C00 0010)用來選擇系統是否進入慢模式,以及是否關閉MPLL或UPLL,和在慢模式下的分頻率。
CLKDIVN(0X4C00 0014)和CAMDIVN(0X4C00 0018照相機時鐘分割寄存器)兩個寄存器配合來確定FCLK,HCLK,PCLK的比例。
LOCKTIME(0X4C00 0000)設置MPLL,UPLL的鎖存時間,採用默認值0XFFFF FFFF,鎖存時間各爲300us。
說到鎖存時間,就要分析下S3C2440的時鐘工作過程。
在系統復位時,晶振起振穩定後,PLL開始按照默認值開始工作,但是在復位時,PLL工作是不穩定的,所以S3C2440用FIN(12M)作爲MPLL。只到一個新的值寫入MPLLCON,UPLLCON,即使用戶不想改變復位後PLLCON的默認值,仍然需要把這個默認值寫入PLLCON,寫入值之後,系統會自動插入一個PLL LOCK TIME,也就是LOCKTIME寄存器中設置的300us。300us後,PLL就開始正常工作。
在系統正常工作時,如果要改變FCLK,寫入新值到MPLLCON後,系統也會插入一個PLL LOCK TIME,300us後FCLK就變成新的頻率。
S3C2440文檔裏有個注意的地方:
如果HDIVN不爲0,根據如下指令,CPU總線模式從Fast Bus Mode 變爲Asynchronous(異步總線模式),2440沒有同步總線模式)
MMU_setAsyncBusMode
mrc p15,0,r0,c0,0
orr r0,r0,#R1_nF:OR:R1_iA
mcr P15,0,r0,c1,c0,0
如果HDIVN不爲0,且CPU總線模式爲Fast Bus mode,CPU的時鐘爲HCLK.,這種方式可以用在將CPU頻率降低,但是卻又不改變HCLK和PCLK.
查了些資料,ARM內核在啓動後工作在快速模式,改變HDIVN值後,就要進入異步模式。轉換的具體原因涉及到ARM內核。目前還沒辦法弄懂,ARM的學習就像走進一條不知道多長的隧道,難見光明。