從上圖的左上角我們可以得知,s3c2440a支援兩種外部時鐘源輸入,一種是通過接在xtipll與xtopll上的外部振盪電路(一般由晶振為核心組成),還有一種是通過將現成的時鐘頻率通過extclk輸入。
時鐘輸入晶元後,送到mpll(主鎖相環)與upll(usb鎖相環)進行倍頻。mpll出來的時鐘訊號稱之為fclk,一般直接用於給cpu核心提供時鐘訊號;upll出來的時鐘訊號稱為uclk,一般用於給usb提供時鐘訊號。fclk經過hdivn與pdivn分頻後會產生hclk與pclk,前者一般用於給ahb高速匯流排與高速外設提供時鐘訊號,比如usb模組、nand flash控制器等;後者一般用於apb外設匯流排,給低速外設提供訊號,比如各種序列通訊模組、外部gpio等。
以下摘錄一段s3c2440a資料手冊中對各個時鐘訊號的說明
usb host inte***ce and usb device inte***ce needs 48mhz clock. in the s3c2440a, the usb dedicated pll (upll) generates 48mhz for usb. uclk does not fed until the pll (upll) is configured.在進行晶元上電前,需要通過修改om3和om2引腳去配置所使用的時鐘源,引腳和對應的設定關係如下表所示:fclk is used by arm920t. hclk is used for ahb bus, which is used by the arm920t, the memory controller, the interrupt controller, the lcd controller, the dma and usb host block. pclk is used for apb bus, which is used by the peripherals such as wdt, iis, i
《s3c2440a 32-bit cmos microcontroller user』s manual》 revision 1.3
然後就開始對暫存器進行設定了!總體的設定流程是:1、設定鎖相環生效延時時間;2、設定pclk與hclk的分頻係數;3、配置cpu進入非同步模式以使得cpu可以使用fclk作為時鐘源;4、設定uclk與fclk;
首先需要設定的是lock time count register (locktime),此暫存器用來作為鎖相環的生效延時計數,因為鎖相環設定後到產生穩定的時鐘訊號中間會需要一定時間,通過設定這個暫存器來告訴晶元鎖相環穩定所需要花費的時間,一般我們保持此暫存器的預設值即可。
然後是通過clock divider control (clkdivn) register設定hclk與pclk的分頻,一定要先設定這兩者的分頻暫存器然後再開始設定mpll和upll,這樣可以防止ahb與apb匯流排上的時鐘頻率過快。暫存器說明如下:
其中hdivn設定值對應的實際分頻係數還取決於camdvn暫存器的第8位和第9位,上電時,這兩位預設為0。
在接著設定uclk與fclk之前,我們要先設定cpu匯流排進入非同步工作模式,這樣才可以在hdivn不為0時使用fclk作為cpu的工作時鐘源,官方手冊提供了cpu進入非同步模式的彙編**,**如下:
/* 設定cpu工作於非同步模式 */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 //r1_nf:or:r1_ia
mcr p15,0,r0,c1,c0,0
最後是設定upll與mpll來設定uclk與mclk。根據手冊上的指示,在設定fclk前要先設定uclk,所以接下來先配置upllcon暫存器,然後配置mpllcon暫存器,兩個暫存器說明如下:
通過暫存器位端mdiv、pdiv、sdiv的組合可以計算得到想要的頻率,不過官方為了方便使用提供了一組常用頻率對應的值,想自己手動計算的也可以通過手冊提供的公式自行計算,官方參考值如下:
/* 關閉看門狗 */
ldr r0, =0x53000000
ldr r1, =0str r1, [r0]
/* 設定mpll, fclk : hclk : pclk = 400m : 100m : 50m */
/* locktime(0x4c000000) = 0xffffffff */
ldr r0, =0x4c000000
ldr r1, =0xffffffffstr r1, [r0]
/* clkdivn(0x4c000014) = 0x5, tfclk:thclk:tpclk = 1:4:8 */
ldr r0, =0x4c000014
ldr r1, =0x5str 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
S3C2440時鐘分析
s3c2440時鐘控制邏輯可以產生fclk hclk pclk和uclk。fclk為cpu時鐘。hclk為ahb匯流排外設時鐘,包括儲存控制器 中斷控制器 lcd控制器 dma控制器等。pclk為apb匯流排外設時鐘,包括看門狗 iis iic pwm定時器 mmc介面 adc uart gpio ...
s3c2440系統時鐘
1 flck hclk和pclk的關係 一般來說,mcu的主時鐘源主要是外部晶振或外部時鐘,而用的最多的是外部晶振。在正確情況下,系統內所使用的時鐘都是外部時鐘源經過一定的處理得到的。由於外部時鐘源的頻率一般不能滿足系統所需要的高頻條件,所以往往需要pll 鎖相環 進行倍頻處理。在s3c2440中,...
定時器用方法總結s3c2440a
今天一直在除錯老師昨天留下來的幾個 任務,是關於定時器及中斷的幾個 開始的時候很生疏,對幾個暫存器 的名稱,功能,以及應該賦的值全是一頭霧水,就按照老師留下來的例子修改,逐個暫存器的對照著手冊進行進行查詢,並熟悉每一位的功能,賦值以及對應中斷的開關,標誌位的清除,對定時器的使用慢慢熟絡起來,下面是我...