專題7-ARM時鐘初始化
1.1 時鐘脈衝訊號:按照一定的電壓幅度,一定的時間間隔連續發出的脈衝訊號。
1.2 時鐘脈衝頻率:單位時間內(1秒)產生的時鐘脈衝的個數。
1.3 訊號源:
1)晶振:晶振全稱晶體振盪器,是用石英晶體經精密切割磨削並渡上電極焊上引線做成。
優點:結構簡單、噪聲低
缺點:成本高、交貨週期長、難以獲得標準的頻率
2)PLL(鎖相環):需要一個外部晶振幷包含一個能夠對晶體的特定頻率加倍或分頻的整合鎖相環電路。
優點:成本低、面積小、頻率靈活
2440:
晶振頻率:12Mhz
兩個PLL:
MPLL:FCLK(ARM核)、HCLK(AHB匯流排:LCD、DMA等)、PCLK(APB匯流排:UART、GPIO等)
UPLL:UCLK(USB匯流排:USB主從口)
6440:
晶振頻率也是12Mhz
3個PLL:
APLL:ACLK(ARM核)
MPL:HCLK(AHB匯流排)、PCLK(APB匯流排)
EPLL:SCLK(USB匯流排)
210:
晶振頻是:24Mhz
4個PLL:
APLL、MPLL、EPLL、VPLL
CPU上電之後:CPU的頻率一開始是等於外部晶振的頻率的,以2440為例,為12Mhz 。所以經過時鐘初始化,有一個由低頻到高頻的過程。
觀察時鐘初始化的時序圖:
完成鎖相環的配置後,進入了locktime,在locktime時,處理器是不工作的,locktime後,ARM核按照配置的頻率來工作。
1.3 時鐘初始化軟體要完成哪些工作:
2440:
1) 配置LockTime(預設值,省略)
2) 設定分頻係數(例如:FCLK:HCLK:PCLK=1:2:4,即HCLK的頻率為FCLK的1/2)
3) 如果FCLK不等於HCLK(通常都不相等),要設定CPU為非同步工作模式
4) 配置FCLK的時鐘頻率
(外部晶振12MHz,將核心時鐘FCLK配置為405Mhz)
即配置暫存器MPLLCON:
LOCLTIME暫存器:(使其為預設值,不需要去設定)
首先檢視uboot,發現其分頻係數設定為1:4:8,檢視datasheet發現對應此頻率的HDIVN是2、PDVIN是1(HDIVN和PDVIN分別位於暫存器CLKDIVN(地址為0x4C000014)的1:2位和0位)
程式碼如下:
%設定分頻係數 1:4:8
#define CLKDIVN 0x4C000014
clock_init:
ldr r0,= CLKDIVN
mov r1,#0x5
str r1,[r0 ]
%設定cpu為非同步工作模式
mrc p15,0,r0,c1,c0,0 %讀取c1暫存器的值到r0 ,非同步模式設定見2440手冊243頁,c1暫存器見核手冊36頁
orr r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0
%設定FCLK頻率
#define MPLLCON 0x4c000004
%因為FCLK的頻率由鎖相環MPLL決定,若要配置其頻率為405Mhz,則可以通過查表得:MDIV等於127,PDIV等於2,SDIV等於1,分別位於暫存器MPLLCON的[19:12]、[9:4]、[1:0]
#define MPLL_405MHZ ((127<<12)|(2<<4)|(1<<0))
ldr r0,= MPLLCON
ldr r1,= MPLL_405MHZ
str r1,[r0]
mov pc,lr
6410:
#define CLK_DIV0 0x7e00f020
#define OTHERS 0x7e00f900
#define MPLL_CON 0x7e00f010
#define APLL_CON 0x7e00f00c
#define CLK_SRC 0x7e00f01c
#define DIV_VAL ((0x0<<0)|(0x1<<9)|(0x1<<8)|(0x3<<12))
#define PLL_VAL ((1<<31)|(266<<16)|(3<<8)|(1<<0))
init_clock:
%設定分頻係數
ldr r0, =CLK_DIV0
ldr r1, =DIV_VAL
str r1, [r0]
%設定非同步模式
ldr r0, =OTHERS
ldr r1, [r0]
bic r1,r1,#0xc0
str r1, [r0]
%設定APLL的輸出頻率
ldr r0, =APLL_CON
ldr r1, =PLL_VAL
str r1, [r0]
%設定MPLL的輸出頻率
ldr r0, =MPLL_CON
ldr r1, =PLL_VAL
str r1, [r0]
%選擇器,參考146頁的時鐘選擇暫存器和126頁的時鐘樹
ldr r0, =CLK_SRC
mov r1, #0x3
str r1, [r0]
mov pc, lr
備註:分頻係數一般去檢視uboot,時鐘的輸出頻率需要去配置時鐘控制暫存器,CLK_SRC時選擇器