【JZ2440筆記】系統時鐘設置

目錄

一、前言

二、實驗目標

三、S3C2440的時鐘體系

四、代碼編寫

五、實驗總結


一、前言

JZ2440開發板上的外部晶振是12MHz的,開發板一上電時S3C2440的系統時鐘爲12MHz,但是S3C2440最高系統時鐘可以跑到400MHz,爲了發揮CPU更高的性能,需要將外部晶振輸入的12MHz時鐘通過芯片內部的鎖相環電路進行倍頻,然後獲得400MHz的系統時鐘,使得CPU指令執行速度變快,同時也相應提升HCLK和PCLK總線的速度。

 

二、實驗目標

將S3C2440的FCLK系統時鐘從12MHz提升到400MHz,HCLK提升到100MHz、PCLK提升到50MHz。運行LED閃爍程序。

 

三、S3C2440的時鐘體系

1、時鐘體系

時鐘模塊框圖如下:

S3C2440A 中的時鐘控制邏輯可以產生必須的時鐘信號,包括 CPU 的 FCLK,AHB 總線外設的 HCLK 以及APB 總線外設的 PCLK。S3C2440A 包含兩個鎖相環(PLL):一個提供給 FCLK、HCLK 和 PCLK,另一個專用於USB 模塊(48MHz)。時鐘控制邏輯可以不使用 PLL 來減慢時鐘,並且可以由軟件連接或斷開各外設模塊的時鐘以降低功耗。

2、鎖相環

PLL(鎖相環)方框圖如下:

輸入時鐘Fin就是指的外部晶振12MHz的時鐘,P、M和S是要配置的三個分頻參數,會有專門的寄存器設置,然後MPLL或者UPLL就是經過倍頻後的時鐘了。但是PLL(鎖相環)不可能將12MHz的輸入時鐘瞬間變爲400MHz的時鐘輸出,從PLL開始工作到正常輸出有一段時間需要等待,這段時間爲多長也可以人爲設置,在這段時間內由於時鐘是不穩定的,所以PLL模塊在這段時間內關斷了時鐘的輸出,CPU也停止運行,等到時鐘穩定了PLL再輸出,CPU然後繼續運行。如下圖所示:

外部晶振的輸入時鐘經過MPLL的倍頻後輸出的時鐘直接供給FCLK使用,也是ARM920T的工作時鐘。由於基本的外設跑不到400MHz那麼高的時鐘,所以FCLK會經過HDIVN和PDIVN兩個分頻器,將時鐘進行分頻(降速)供HCLK和PCLK用。HCLK速度一般比PCLK跑的更快,因爲FCLK 是提供給 ARM920T 的時鐘。HCLK 是提供給用於 ARM920T,存儲器控制器,中斷控制器,LCD 控制器,DMA 和 USB 主機模塊的 AHB總線的時鐘。PCLK 是提供給用於外設如 WDT,IIS,I2C,PWM 定時器,MMC/SD 接口,ADC,UART,GPIO,RTC 和SPI 的 APB 總線的時鐘。

3、時鐘設置

爲了獲得想要的HCLK和PCLK時鐘,有以下的一些分頻設置:

我們選擇1:4:8的分頻配置,所以要設置HDIVN爲2,PDIVN爲1。

芯片手冊上還提了以下兩個注意點:

(1)應當謹慎設置 CLKDIVN,不要使其超過 HCLK 和 PCLK 的最小值。

(2)如果 HDIVN 不爲 0,CPU 總線模式應該使用以下指令使其從快總線模式改變爲異步總線模式(S3C2440不支持同步總線模式)。

MMU_SetAsyncBusMode

MRC p15, 0, r0, c1, c0, 0

ORR r0, r0, #R1_nF:OR:R1_iA

MCR p15, 0, r0, c1, c0, 0

以下就是一些寄存器的配置了:

LOCKTIME就是PLL(鎖相環)的鎖定時間設置了,默認值就行。U_LTIME和M_LTIME也都使用默認值。UPLLCON是設置USB時鐘的,這裏我們用不上不用管。就設置MPLLCON就行了,MPLLCON就是設置MDIV、PDIV和SDIV這三個參數。有如下的公式。

Mpll = ( 2 × m × Fin ) / ( p × 2 s )

m = ( MDIV + 8 ), p = ( PDIV + 2 ), s = SDIV

這裏Fin是12000000,要得到Mpll爲400000000,合理範圍內取三個參數就行了。有以下的參考頻率設置。

這裏我們選擇92,1,1的分頻搭配,正好可以得到400MHz的FCLK時鐘。

有了FCLK時鐘,接下來要配置HCLK和PCLK。有如下的寄存器可以配置:

CLKDIVN寄存器中設置HDIVN爲2,PDIVN爲1。CAMDIVN寄存器由於默認爲0,就不去設置了。

說了半天其實就設置兩個寄存器而已。

 

四、代碼編寫

代碼分爲以下幾個文件:

watchDog.S:啓動文件。

main.c:運行LED閃爍程序。

Makefile:編譯代碼。

各個文件內容分別如下:

watchDog.S

@******************************************************************************
@ File:watchDog.S
@ 功能:掌握看門狗和時鐘功能的相關設置
@******************************************************************************       

.text
.global _start
_start:

	ldr     r0, =0x53000000     @ WATCHDOG寄存器地址
            mov     r1, #0x0                     
            str     r1, [r0]            @ 寫入0,禁止WATCHDOG,否則CPU會不斷重啓

	@ 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
   

		ldr	sp, = 1024 * 4 	@因爲要使用C語言,所以設置堆棧
		bl	main 			@跳轉到main函數執行
halt_loop:
		b	halt_loop 		@死循環原地跳轉



main.c

#define GPFCON	(*(volatile unsigned long *)0x56000050)
#define GPFDAT	(*(volatile unsigned long *)0x56000054)

void wait(volatile unsigned long dly)
{
	for(; dly > 0; dly--);
}

int main()
{
	GPFCON = 0x00001500;  //將GPF4、GPF5、GPF6設置爲輸出模式
	
	while(1)
	{		
		GPFDAT = 0x00000000;  //亮燈
		wait(30000);
		GPFDAT = 0x00000070;  //滅燈
		wait(30000);
	}
	
	while(1);
	return 0;
}



Makefile

watchDog.bin : watchDog.S  main.c
	#彙編程序生成目標文件
	arm-linux-gcc -g -c -o watchDog.o watchDog.S
	#C程序生成目標文件
	arm-linux-gcc -g -c -o main.o main.c
	#將兩個目標文件生成bin文件
	arm-linux-ld -Ttext 0x0000000 -g  watchDog.o main.o -o watchDog_elf
	arm-linux-objcopy -O binary -S watchDog_elf watchDog.bin
	#輸出反彙編
	arm-linux-objdump -D -m arm  watchDog_elf > watchDog.dis
clean:
	#刪除bin和中間文件
	rm -f watchDog.dis watchDog.bin watchDog_elf *.o

linux下執行make命令,將生成的bin文件燒寫到開發板的NandFlash上,開機選擇Nand啓動,可以看到LED閃爍的現象,而且閃爍的速度明顯快於未設置時鐘倍頻時的速度。

 

五、實驗總結

通過該實驗熟悉了S3C2440的時鐘體系,大體上分爲FCLK,HCLK,PCLK和UCLK,明白了各個時鐘總線的運行時鐘是如何得到的,掌握了時鐘設置的原理和方法。

 

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