嵌入式入門2(時鐘體系)

S3C2440是一個SOC(System On Chip),它支持多種外設。其芯片手冊第1章的BLOCK DIAGRAM圖就對所支持的外設進行了列舉:markdown

image.png

能夠把該圖分爲上中下三部分:異步

  • 最上面的ARM920T是CPU核心部分,工做於FCLK;
  • 中間的設備掛載在AHB總線上,它們對性能要求較高,如LCD、Camera等,工做於HCLK;
  • 最下面的是一些對性能要求不那麼高的低速設備,在APB BUS,P即爲Peripheral之意,工做在PCLK。

在參考手冊的特性裏介紹了這3個時鐘的最高工做頻率:性能

Fclk最高400MHz
Hclk最高136MHz
Pclk最高68MHzspa

而這3種頻率的時鐘是如何獲得的呢?咱們能夠找到芯片手冊第7章的Clock Generator Block Diagram圖:3d

image.png

該圖可簡化爲下圖:code

image.png

其中PLL表示鎖相環,DIVN表示分頻器。orm

MPLL輸出頻率爲FCLK,它會直接供給CPU;同時經過HDIV分頻器獲得HCLK,供給AHB總線;經過PDIV分頻器獲得PCLK,供給APB總線。ip

AHB總線將時鐘分發給Nand控制器、內存控制器,中斷控制器。
APB總線將時鐘分發給I2C、I2S等慢速設備。內存

這時,咱們能夠清楚的知道:it

S3C2440時鐘源能夠採用OSC(晶振),也能夠採用EXTCLK(外接時鐘源),由OM[3:2]決定。

當設備上電時,時鐘源經過OM[3:2]兩個pin腳來決定,可選值以下:

image.png

咱們查看JZ2440的電路圖,發現OM[3:2]兩個引腳直接接地,代表主時鐘源和USB時鐘源都是來自晶振。

image.png

JZ2440電路圖,也明確顯示了板載晶振爲12M。

image.png

至此,咱們已肯定輸入時鐘爲12MHZ,後續只須要設置P[5:0]、M[7:0]、S[1:0]寄存器,決定MPLL/UPLL的輸出頻率。

image.png

開機復位時序圖,流程以下:

  • 一、設備上電FCLK開始工做,復位芯片等待電源穩定,才輸出高電平。
  • 二、電源穩定後,復位芯片變成高電平,PLL鎖存OM[3:2]的值,CPU開始運行。
  • 三、開始設置PLL,設置後,在Lock Time期間,FCLK中止起振,CPU中止運行。
  • 四、Lock Time結束,FCLK就變成PLL輸出的新時鐘,CPU開始運行。

image.png

image.png

經過設置MDIV=92,PDIV=1,SDIV=1,使得MPLL輸出400MHz。而後經過配置CLKDIVN寄存器,使FCLK=400MHzHCLK=100MHzPLCK=50MHz

image.png

start.S

.text
.global _start

_start:

    /* 關閉看門狗 */
    ldr r0, =0x53000000
    mov r1, #0x0
    str r1, [r0]

    // LOCKTIME(0x4C000000) = 0xFFFFFFFF
    ldr r0, =0x4C000000
    ldr r1, =0xFFFFFFFF
    str r1, [r0]

    // 設置CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = 1:4:8
    // 讓FCLK : HCLK : PCLK = 400m : 100m : 50m
    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

    /* 設置FCLK工做在400M
     * 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
     */
	
    ldr sp, =0x40000000+4096 /* NOR啓動 */

    /*調用main*/
    bl main

halt:
    b halt
複製代碼
相關文章
相關標籤/搜索