OK6410裸機程序(二)——系統時鐘

OK6410裸機程序(二)——系統時鐘

一、時鐘源的選擇

       時鐘源的選擇 時鐘源的選擇 時鐘源的選擇內部時鐘會產生用於外部的時鐘源,其說明如表 3-1 所示。當外部復位信號被聲明時,OM[4:0]引腳決定了 S3C6410的操作模式。OM[0]引腳選擇外部時鐘源,例如,如果OM[0]是 0,則 XXTIpll(外部晶體)被選擇。否則,XEXTCLK(外部時鐘輸入)被選擇。在OK6410板上是外接12M晶振。如下圖所示:

                             

二、鎖相環(PLL)

            S3C6410 內部的三個PLL,分別是 APLL, MPLL和 EPLL。帶有一個參考輸入時鐘操作頻率和相位的同步
輸出信號。在這個應用當中,包括基本模塊的說明,如圖 3-3 所示。電壓控制振盪器(VCO)產生的輸出頻
率成正比,輸入到直流電壓。通過P,前置配器劃分輸入頻率(FIN)。通過 M,主分頻器分割 VCO的輸出
頻率,用於輸入到相位頻率檢測器,(PFD)。通過 S,post 定標器劃分爲 VCO 的輸出頻率。相位差探測
器計算相位差和電荷泵的增加/減少輸出電壓。每個 PLL的輸出時鐘頻率是可以計算的。如下圖所示:

三、PLL  和輸入參考時鐘之間時鐘選擇

          S3C6410 有三個 PLL,APLL 用於 ARM 時鐘操作,MPLL 用於
主時鐘操作,EPLL 用於特殊用途。時鐘操作被分爲三組。第一組是ARM時鐘,從 APLL產生。MPLL產生主
系統時鐘,用於操作AXI,AHB 和APB總線操作。最後一組是從 EPLL產生的,產生的時鐘主要用於外設 IP’
s,例如,UART,IIS 和 IIC 等等,如下圖所示。各總路線的外設時鐘,就不一一例舉了,當我們要用到時可以去手冊上查找各自的應用。

        

四、設置系統時鐘相關寄存器

              在6410中,跟系統時鐘設置相關寄存器有下面一些:

還有一個OTHER的寄存器,需要設置

下面是自己總結的設置時鐘的基本流程:

                                                       

附上C程序和彙編程序:

彙編程序:

.globl clock_init

clock_init:
	
	/* 1.設置LOCK_TIME */
	ldr r0, =0x7E00F000  /* APLL_LOCK */
	ldr r1, =0x0000FFFF
	str r1, [r0]
	
	str r1, [r0, #4]	 /* MPLL_LOCK */
	str r1, [r0, #8]	 /* EPLL_LOCK */	
	
#define OTHERS		0x7e00f900
	@ set async mode  /* 當CPU時鐘 != HCLK時,要設爲異步模式 */
	ldr r0, =OTHERS
	ldr r1, [r0]
	bic r1, #0xc0			
	str r1, [r0]

loop1:				/* 等待,直到CPU進入異步模式 */
	ldr r0, =OTHERS
	ldr r1, [r0]
	and r1, #0xf00					
	cmp r1, #0
	bne loop1		
	
	/* SYNC667 */
	/* MISC_CON[19] = 0 */

#define ARM_RATIO    0   /* ARMCLK = DOUTAPLL / (ARM_RATIO + 1)    */
#define HCLKX2_RATIO 1   /* HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) */
#define HCLK_RATIO   1   /* HCLK = HCLKX2 / (HCLK_RATIO + 1)       */
#define PCLK_RATIO   3   /* PCLK   = HCLKX2 / (PCLK_RATIO + 1)     */
#define MPLL_RATIO   0   /* DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)     */
	ldr r0, =0x7E00F020  /* CLK_DIV0 */
	ldr r1, =(ARM_RATIO) | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12)
	str r1, [r0]
	
	/* 2.配置時鐘 */
	/* 2.1 配置APLL */
	/* 2.1.1 設置APLL
	 * 2.1.2 MUXAPLL
	 * 2.1.3 SYNC667
	 * 2.1.4 DIVAPLL
	 */
#define APLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))
	ldr r0, =0x7E00F00C
	ldr r1, =APLL_CON_VAL
	str r1, [r0]		/* APLL_CON, FOUTAPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz  */
	
	/* 2.2 配置MPLL */
	/* 2.2.1 設置MPLL
	 * 2.2.2 MUXMPLL
	 * 2.2.3 SYNCMUX
	 * 2.2.4 SYNC667
	 * 2.2.5 HCLKX2_RATIO
	 * 2.2.6 PCLK_RATIO
	 */
#define MPLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))
	ldr r0, =0x7E00F010
	ldr r1, =MPLL_CON_VAL
	str r1, [r0]		/* MPLL_CON, FOUTMPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz  */
	
	/* 3.選擇PLL的輸出作爲時鐘源 */
	ldr r0, =0x7E00F01C
	ldr r1, =0x03
	str r1, [r0]


 

C程序:

/*************************************************************************/
/*名稱:系統時鐘設置                                                     */
/*參數:ARM_CLK=532 HCLK=133 HCLKX2=266 PCLK=66.5                        */
/*************************************************************************/

#define rAPLL_LOCK     (*((volatile unsigned long *)0x7E00F000))
#define rMPLL_LOCK     (*((volatile unsigned long *)0x7E00F004))
#define rEPLL_LOCK     (*((volatile unsigned long *)0x7E00F008))
#define rAPLL_CON      (*((volatile unsigned long *)0x7E00F00C))
#define rMPLL_CON      (*((volatile unsigned long *)0x7E00F010))
#define rCLK_SRC       (*((volatile unsigned long *)0x7E00F01C))
#define rCLK_DIV0      (*((volatile unsigned long *)0x7E00F020))
#define rCLK_DIV1      (*((volatile unsigned long *)0x7E00F024))
#define rCLK_DIV2      (*((volatile unsigned long *)0x7E00F028))
#define rOTHERS        (*((volatile unsigned long *)0x7E00F900))

#define ARM_RATIO     0   /* ARMCLK = DOUTAPLL / (ARM_RATIO + 1)    */
#define HCLKX2_RATIO  1   /* HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) */
#define HCLK_RATIO    1   /* HCLK = HCLKX2 / (HCLK_RATIO + 1)       */
#define PCLK_RATIO    3   /* PCLK   = HCLKX2 / (PCLK_RATIO + 1)     */
#define MPLL_RATIO    0   /* DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)     */

#define SDIV    1
#define PDIV    3
#define MDIV    266
#define EN    1         //使能PLL


void Clock_Init()
{
	rAPLL_LOCK = 0x0000ffff;
	rMPLL_LOCK = 0x0000ffff;
	rEPLL_LOCK = 0x0000ffff; //時鐘鎖存時間設定

	rOTHERS &= ~( 3 << 6); //將時鐘設置成異步模式

	while( (rOTHERS & 0xf00) != 0 );//等待進入異步模式

	rCLK_DIV0 = ARM_RATIO | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12);//設置CLK_DIV0的分頻參數

	rAPLL_CON = SDIV | (PDIV << 8) | (MDIV << 16) | (EN << 31);//設置FOUT=532M
	rMPLL_CON = SDIV | (PDIV << 8) | (MDIV << 16) | (EN << 31);//設置FOUT=532M

	rCLK_SRC = 0x03;//時鐘源選擇}


 

 

 

發佈了20 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章