嵌入式linux學習筆記--20200222--JZ2440V3 S3C2440 時鐘樹分析以及修改時鐘的代碼

今天要學習一下S3C2440 的時鐘體系

這個是整體的時鐘框圖 其中的USB 和camera 的時鐘是一個單獨的分頻器分頻出來的  只是給這兩個外設用  我們暫且不去討論。

主要的時鐘就是  F_CLK 、HCLK、 PCLK、這三個時鐘。

其中 FCLK 只是提供給CPU(ARM920T 核心) 用  也就是我們常說的CPU的主頻

HCLK () 主要是提供給 AHB(Advanced High performance Bus) 總線上的設備使用的時鐘,這一部分類似於電腦中的內存頻率 雖然速度不如CPU快 但是也是屬於僅次於CPU的主頻了(比如我們電腦 DDR4 一般是2400 M  2666 M   大約2.6GHz) 在S3C2440 中允許 內核工作在異步模式下,就像是  電腦的主頻可以高於內存的主頻一樣, ARM920T的 內核頻率也可以高於外部的AHB總線。 HCLK 是提供給 內存控制器、 USB nandflash控制器等等的速度相對較快的設備

PCLK  是速度最慢的時鐘,大多都是連接在一些低速的外設 P是peripheral   在時鐘樹圖中我們可以看到這部分是連接單  WDT  PWM  I2S  I2C  GPIO 等等的 低速設備上。

上圖中的黃色時鐘代表的就是說  當CPU 工作於同步模式下的時候 CPU 時鐘和 AHB總線共用 HCLK

大致的時鐘分配就是這樣。  爲了提高整個系統的性能我們大多會讓ARM920T的arm核工作在異步模式下,也就是CPU 頻率遠高於 內存頻率的這樣一種情況下。這種情況對應於四個基本模式(normal 、IDLE、 SLOW、SLEEP)的normal 模式

這是四種模式的介紹

這兩個鎖相環 我們暫且不討論 USB 用到的哪一個

這裏提到了 一上電在正式的向 MPLLCON寄存器寫入有效值之前,整個系統的時鐘都是來自於 外部時鐘,未經處理!

我們的時鐘是第一種來源  無源晶振 12MHZ

配置比例選擇的是 50MHz:200MHz:400MHz

時鐘部分 可以配置的寄存器 及其作用

這個寄存器控制着鎖死的時間 這段時間是 定時器的 PLL參數修改之後等待的週期數,默認就是最大,可以充分確保 頻率穩定下來

 

 

 

最後程序是這樣的  程序來自韋東山老師的視頻


.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
	

最後總結就是  我的水平還是不到, 能看懂爲什麼這麼設置,但是你要是讓我自己寫程序卻是不知道要 按照怎樣的順序去設置。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章