1. 原理分析
s3c2440a有兩個鎖相環(plls):乙個(mpll)用於fclk、hclk和pclk,另乙個(upll)專用於usb。其中fclk用於cpu,hclk用於ahb匯流排,pclk用於apb匯流排。
ahb(advanced high performance bus)高階高效能匯流排,用於高效能模組的連線。
apb(advanced peripheral bus)外圍匯流排,用於低速外設的連線。
將上圖簡化之後,我們可以粗略的得到下圖。
由這個簡化的圖我們可以得知,晶振的頻率經過mpll生成的頻率便是fclk所用頻率,經過upll生成的頻率就是usb所用頻率。如果將fclk再經過hdiv和pdiv進行分頻,那麼將分別得到hclk和pclk。
那麼從系統上電(復位)到按照設定的頻率工作,整個的時序和工作流程是怎麼樣的呢?在晶元手冊中有這樣乙個圖,解釋了這個流程。
系統上電後,晶振(crystal oscillator 簡稱osc)開始工作。等到osc穩定之後,nreset才會拉至高電平,之後pll會按照配置進行工作,鎖定時間過後,可以立即將fclk配置為鎖相環輸出。
在有了上述理論基礎,假如我們想將fclk:hclk:pclk=400m:100m:50m,晶振頻率為12m,我們就可以將配置分為如下幾步
設定locktime(0x4c000000)
設定hdiv和pdiv的分頻值,fclk:hclk:pclk=400m:100m:50m,所以可以得出hdiv=4、pdiv=8,這兩個值可以通過clkdivn(0x4c000014)暫存器來配置。
根據上表,hdivn我們應配置為0b10,pdivn應配置為0b1,所以該暫存器應配置為0x5
設定cpu工作於非同步模式
這段話的意思大致就是,如果hdivn不是0(我們上面設定了,它的確不是0了),cpu的模式必須要從快速匯流排模式更改為非同步匯流排模式。怎麼改,晶元手冊也提供了彙編**,其中有疑問的就是#r1_nf:or:r1_ia
這個是什麼意思?
其實orr r0,r0,#r1_nf:or:r1_ia
這句話的意思就是將30位(nf bit) 31位(ia bit) 置1,所以這句話也等同於orr r0,r0,#0xc0000000
設定mpll中的p、m、s,使fclk=400m
手冊裡面提供了公式,現在我們可以將手冊給出的值帶入公式驗證一下。
m di
v=92mdiv = 92
mdiv=92pd
iv=1
pdiv = 1
pdiv=1
s di
v=1sdiv = 1
sdiv=1
m pl
l=2∗
(92+8
)∗12m
(1+2
)∗21
=400
mmpll = \frac = 400m
mpll=(
1+2)
∗212
∗(92
+8)∗
12m
=400
m可以通過mpllcon(0x4c000004)來設定它們3個的值。
2. 程式編寫
.text
.global _start
_start:
/* 關閉看門狗 */
ldr r0,
=0x53000000
ldr r1,=0
str r1,
[r0]
/* 設定mpll, fclk : hclk : pclk = 400m : 100m : 50m */
/* locktime(0x4c000000) = 0xffffffff */
ldr r0,
=0x4c000000
ldr r1,
=0xffffffff
str r1,
[r0]
/* clkdivn(0x4c000014) = 0x5, tfclk:thclk:tpclk = 1:4:8 */
ldr r0,
=0x4c000014
ldr r1,
=0x5
str r1,
[r0]
/* 設定cpu工作於非同步模式 */
mrc p15,
0,r0,c1,c0,
0 orr r0,r0,#0xc0000000
//r1_nf:or:r1_ia
mcr p15,
0,r0,c1,c0,
0/* 設定mpllcon(0x4c000004) = (92<<12)|(1<<4)|(1<<0)
* 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)=400m
*/ldr r0,
=0x4c000004
ldr r1,=(
92<<12)
|(1<<4)
|(1<<0)
str r1,
[r0]
/* 一旦設定pll, 就會鎖定lock time直到pll輸出穩定
* 然後cpu工作於新的頻率fclk
*//* 設定記憶體: sp 棧 */
/* 分辨是nor/nand啟動
* 寫0到0位址, 再讀出來
* 如果得到0, 表示0位址上的內容被修改了, 它對應ram, 這就是nand啟動
* 否則就是nor啟動
*/mov r1, #0
ldr r0,
[r1]
/* 讀出原來的值備份 */
str r1,
[r1]
/* 0->[0] */
ldr r2,
[r1]
/* r2=[0] */
cmp r1, r2 /* r1==r2? 如果相等表示是nand啟動 */
ldr sp,
=0x40000000
+4096
/* 先假設是nor啟動 */
moveq sp, #4096
/* nand啟動 */
streq r0,
[r1]
/* 恢復原來的值 */
bl main
halt:
b halt
ARM裸機學習一 S3C2440的時鐘體系
s3c2440的系統時鐘圖如下 s3c2440a的主時鐘源由外部時鐘 extclk 或者外部晶振 xtipll 提供,輸入時鐘源由模式控制引腳om3和om2控制選擇,在復位訊號的上公升沿參考om3和om2的引腳將om 3 2 的狀態在內部鎖定 大致過程是 經過om3和om2引腳選擇的外部時鐘進入mp...
S3C2440裸機 時鐘
目錄 1.s3c2440的時鐘體系 1.1.s3c2440結構框圖 1.2 s3c2440時鐘樹 1.3 s3c2440上電順序 2.暫存器配置 2.1clkdivn暫存器 2.2mpllcon暫存器 2.3設定cpu為非同步模式 3.程式設計 4.實驗 從上面的結構圖可以看出,s3c2440主要分...
ARM 時鐘體系
以stm32f4的時鐘樹為例,如下圖所示arm的時鐘源一般有四種 綠圈 內部低速時鐘 lsi low speed inter 內部高速時鐘 hsi high speed inter 外部低速時鐘 lse low speed external 外部高速時鐘 hse high speed externa...