JZ2440開發板 修改ARM晶元時鐘 學習筆記

2022-07-24 11:33:13 字數 3603 閱讀 5457

想要修改arm晶元的時鐘,需要去查詢晶元手冊和原理圖,獲取相關的資訊(見下方)

首先來看時鐘的結構圖

根據結構圖可以看出,時鐘源有兩種選擇:1. xtipll和xtopll所連線的晶振 

2. extclk引腳外接乙個時鐘源

om[3:2]用來選擇到底使用哪個時鐘源

再檢視原理圖,可以發現:om3和om2硬體上都是接gnd,所以可以知道:採用12mhz晶振作為時鐘源

jz2440內部使用三種時鐘:

fclk: 用於arm920t晶元,即cpu

hclk:通過ahb匯流排,提供給arm920t晶元、記憶體控制器,中斷控制器,lcd控制器等等

pclk:   通過apb匯流排,提供給一些外圍裝置使用,如wdt,iis,i2c等等

fclk通過hdivn分頻得到hclk,通過pdivn分頻得到pclk,這裡設定fclk:hclk:pclk=400mhz : 100mhz : 50hz

1、修改mpllcon暫存器中mdiv ,pdiv ,sdiv的值為92 ,1 ,1,可以得到fclk為400mhz

2、修改clkdivn中,hdivn和pdivn分別為0b10和1,使得hclk=fclk/4 , pclk=hclk/2

閱讀晶元手冊中,晶振作為時鐘源的時序圖,可以發現,當配置pll時,會有乙個locktime時間,用來等待輸出的fclk頻率穩定

在這裡,不對locktime進行修改,仍然使用它的預設值0xffffffff

當hdivn不是0且cpu工作於快速匯流排模式的時候,cpu會採用hclk作為它的時鐘頻率,

因此如果想讓hdivn修改後,cpu採用fclk,必須新增下方**,讓cpu工作於非同步模式 

mrc p15,0,r0,c1,c0,0

orr r0,r0,#r1_nf:or:r1_ia                      

mcr p15,0,r0,c1,c0,0

【**  #r1_nf:or:r1_ia 的意思】———— 點我

對時鐘修改的分析就大致差不多了,接下來寫彙編檔案實現要求

.text

.global

_start

_start:

/*關閉看門狗,如果不關閉,系統會自動重啟

*/ldr r0,=0x53000000

ldr r1,=0

str r1,[r0]

/*修改時鐘,fclk=400mhz,hclk=100mhz,pclk=50mhz

*//*

設定配置mpll時的locktime時間為預設值

*/ldr r0,=0x4c000000

ldr r1,=0xffffffff

str r1,[r0]

/*設定fclk:hclk:pclk=8:2:1

*/ldr r0,=0x4c000014

ldr r1,=0x5

str r1,[r0]

/*設定cpu工作於非同步模式

** 如果不作此設定,當hdivn不是0時,cpu會採用hclk的頻率而不是採用fclk的頻率

*/mrc p15,

0,r0,c1,c0,0

orr r0,r0,#

0xc0000000

//#r1_nf:or:r1_ia等價於#0xc0000000

mcr p15,0,r0,c1,c0,0

/*設定mpll的pms,使得fclk=400mhz

** m = mdiv+8 = 92+8=100

** p = pdiv+2 = 1+2 = 3

** s = sdiv = 1

** fclk = 2*m*fin/(p*2^s) = 2*100*12/(3*2^1)=400mhz

*/ldr r0,=0x4c000004

ldr r1,=(92

<<12)|(1

<<4)|(1

<<0

) str r1,[r0]

/*設定好pll之後,就會鎖定lock time,直到pll穩定輸出

*//*

cpu會工作於新的頻率fclk

/* 判斷是nor啟動還是nand啟動

** 先把0位址原來的值讀取出來,儲存到r0暫存器中

** 再把0寫入0位址對應的記憶體單元,之後讀取0位址記憶體單元的值

** 如果讀取出來的值與原來的值不一致,說明是nor啟動

** 如果讀取出來的值與原來的值一致,說明是nand啟動,此時需要修改棧的位址

*/mov r1,#

0ldr r0,[r1]

//讀取原來的值,備份一下

str r1,[r1] //

把0寫入0位址

ldr r2,[r1] //

讀取0位址新的值

cmp r2,r0 //

如果r0和r2的值一樣,說明是nand啟動,此時修改sp的值

/*設定棧:sp

*/ldr sp,=0x40000000+4096

//先預設nor啟動

// moveq sp,#4096

//如果r2=r1,把4096傳給sp,改為nand啟動

streq r0,[r1] //

如果r2=r1,恢復0位址原來的值

bl main //

跳轉到main函式

halt:

b halt

//不停的跳轉到halt,相當於死迴圈,方便觀察效果

另外再附上jz2440開發板3盞led燈迴圈點亮的c程式(和按鍵點亮led燈需要知道的知識差不多,這裡不再作分析),用來觀察時鐘修改後的效果

#include "

s3c2440_soc.h

"void delay(volatile

int d) //

延時函式

int main(void

) }

return0;

}

上傳到 linux,編譯得到 led.bin檔案,燒寫到開發板之後,發現led燈切換得比以前快多了,因為cpu是400mhz了,arm晶元時鐘修改成功。

編譯JZ2440開發板的u boot

以前我在大四的時候準備學習linux,然後就去買了塊cortex a8架構的開發板,我當時選的是qt210,可惜哪會完全沒有基礎,根本不能搞定a8強大的資料手冊,而且當時連uboot也不知道,呵呵,當時勇氣真大,一來就買a8板,後面的前景也讓我嘗到了苦頭,對著一塊在當時看來何等高階的板子我壓根不知道...

uboot配置分析(jz2440開發板)

yonzuge學習總結 uboot配置分析 解壓tar xvf u boot 1.1.6.tar.bz2 打補丁patch p1 配置make 100ask24x0 config 編譯make 1 檢視makefile 1.0100ask24x0 config unconfig mkconfig c...

jz2440開發板以nfs啟動

1,ping通 關防火牆 虛擬機器橋連線 設定為同一閘道器 採用 電腦連wifi 開發板接路由器模式 2,修改ubuntu上的 etc exports 加上要共享的目錄按照格式修改 3,重啟nfs 服務 sudo etc init.d nfs kernel server restart 4,修改開發...