新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM裸機(jī)開(kāi)發(fā)bootloader時(shí)鐘初始化ARM跑快了

ARM裸機(jī)開(kāi)發(fā)bootloader時(shí)鐘初始化ARM跑快了

作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
一、概念解析

1、什么是時(shí)鐘脈沖信號(hào),起什么作用?

本文引用地址:http://m.butianyuan.cn/article/201611/318215.htm

時(shí)鐘脈沖信號(hào)時(shí)有一定電壓幅度和一定的時(shí)間間隔并連續(xù)發(fā)出的脈沖信號(hào)。時(shí)鐘脈沖信號(hào)是時(shí)序邏輯的基礎(chǔ),它用于決定邏輯單元中的狀態(tài)何時(shí)更新。數(shù)字芯片中的眾多晶體管都工作在開(kāi)關(guān)狀態(tài),它們的導(dǎo)通和關(guān)斷動(dòng)作都是按照時(shí)鐘信號(hào)的節(jié)奏進(jìn)行的。也就是說(shuō)嵌入式系統(tǒng)是按照時(shí)鐘來(lái)安排CPU的任務(wù)。

2、時(shí)鐘脈沖信號(hào)的頻率是指單位時(shí)間內(nèi)產(chǎn)生的時(shí)鐘脈沖個(gè)數(shù)。

3、如何產(chǎn)生時(shí)鐘信號(hào)?

時(shí)鐘信號(hào)一般有晶振或晶振與PLL產(chǎn)生。

晶振的制造就是用石英晶體經(jīng)精密切割磨削并鍍上電極焊上引線就做成了。這種晶體如果給它通上電,它就會(huì)產(chǎn)生機(jī)械振蕩,其頻率和他們的形狀,材料,切割方向等密切相關(guān)。

由于石英晶體化學(xué)性能非常穩(wěn)定,熱膨脹系數(shù)非常小,其振蕩頻率也非常穩(wěn)定,由于控制幾何尺寸可以做到很精密,因此,其諧振頻率也很準(zhǔn)確。

4、晶振和鎖相環(huán)(PLL)

晶體振蕩器時(shí)鐘的優(yōu)點(diǎn):結(jié)構(gòu)簡(jiǎn)單,噪聲低。缺點(diǎn):由于其頻率僅由晶體決定,通常是特定晶體被制成客戶所需要的振蕩器,導(dǎo)致生產(chǎn)成本高、交貨周期較長(zhǎng),不利于客戶加快產(chǎn)品上市時(shí)間,而且難以獲得非標(biāo)準(zhǔn)的頻率。

PLL(鎖相環(huán))合成器是一種更為復(fù)雜的系統(tǒng)時(shí)鐘源。通用的PLL合成器需要一個(gè)外部晶體并包含一個(gè)能夠?qū)w的特定頻率加倍或分頻的集成鎖相環(huán)(PLL)電路。

5、信號(hào)產(chǎn)生對(duì)比

5.1、對(duì)于特定的時(shí)鐘頻率,采用PLL合成器可以使用較便宜以及較低頻率晶振來(lái)代替昂貴的高頻晶振;

5.2、對(duì)于需要多個(gè)時(shí)鐘頻率的系統(tǒng),采用PLL合成器通過(guò)分頻即可實(shí)現(xiàn),而此時(shí)采用晶振模塊則需要多個(gè)不同頻率的晶振。

因此相對(duì)于晶體振蕩器模塊,通過(guò)PLL合成器提供精確時(shí)鐘具有成本更低、占板面積更小等一系列優(yōu)點(diǎn)。

二、時(shí)鐘體系

學(xué)習(xí)時(shí)鐘體系學(xué)什么

1、晶振頻率 2、PLL 3、PLL產(chǎn)生了哪些時(shí)鐘 4、產(chǎn)生的時(shí)鐘是提供給誰(shuí)的

2440:

1、12MHZ晶振

2、MPLL、UPLL

3、MPLL(FCLK,HCLK,PCLK)

UPLL(UCLK)

4、

時(shí)鐘應(yīng)用場(chǎng)合應(yīng)用舉例
FCLK處理器ARM9
HCLKAHB BUSLCD DMA
PCLKAPB BUSUART GPIO
UCLKUSBUSB主從口
AHB是高性能模塊之間連接總線

APB是低帶寬的周邊外設(shè)之間的連接總線

DMA的概念:DMA(Direct memory access)是在專門(mén)的硬件( DMA)控制下,實(shí)現(xiàn)高速外設(shè)和主存儲(chǔ)器之間自動(dòng)成批交換數(shù)據(jù)盡量減少CPU干預(yù)的輸入/輸出操作方式。

6410:

1、12MHZ

2、APLL、MPLL、EPLL

3、APLL(ARMCLK) MPLL(HCLK PCLK) EPLL(SCLK)

4、

時(shí)鐘應(yīng)用場(chǎng)合應(yīng)用舉例
ARMCLKARMARM11
HCLKAHB BUSLCD DMA
PCLKAPB BUSUART GPIO
SCLK特殊情況USB主從口

210:

1、24MHZ

2、4個(gè)PLL:APLL,MPLL,EPLL,VPLL

3、210與2440和6410都有所不同:

時(shí)鐘體系所屬時(shí)鐘應(yīng)用舉例 鎖相環(huán)
MSYSARMCLK HCLK_MSYS PCLK_MSYS
ARM核
內(nèi)存控制器 中斷
APLL
DSYSHCLK_DSYS PCLK_DSYS顯示相關(guān)部件,如FIMCMPLL
PSYS
HCLK_PSYS
CLK_DPM
外設(shè),如Uart,i2CEPLL
視頻相關(guān)VPLL

三、思維導(dǎo)圖的設(shè)計(jì)

軟件設(shè)計(jì)指導(dǎo):

1、時(shí)鐘初始化流程


從上圖的時(shí)序我們可以看到

1、上電幾毫秒后,晶振輸出穩(wěn)定,F(xiàn)CLK=晶振頻率,nRESET信號(hào)恢復(fù)高電平后,CPU開(kāi)始執(zhí)行指令。

2、我們的程序開(kāi)頭啟動(dòng)MPLL,設(shè)置MPLL的寄存器

3、在設(shè)置MPLL的寄存器后,需要等待一段時(shí)間(Lock Time),MPLL的輸出才穩(wěn)定。在這段時(shí)間(Lock Time)內(nèi),F(xiàn)CLK停振,CPU停止工作。Lock Time的長(zhǎng)短由寄存器LOCKTIME設(shè)定。

4、Lock Time之后,MPLL輸出正常,CPU工作在新的FCLK下。

時(shí)鐘初始化流程(芯片手冊(cè)):

1、設(shè)置Lock Time

2、設(shè)置分頻系數(shù)

3、設(shè)置CpU到異常模式

4、設(shè)置FCLK

開(kāi)始寫(xiě)代碼

2440:

1、在芯片手冊(cè)查找Locktime -register,一般我們都使用默認(rèn)值,所以可以忽略不做

2、設(shè)置分頻系數(shù)

參考Uboot中的分頻系數(shù)為FCLK:HCLK:PCLK = 1:4:8

時(shí)鐘初始化程序要位于led點(diǎn)亮程序之前,這樣便于調(diào)試。

#define CLKDIVN 0x4c0000004

clock_init:

ldr r0, =CLKDIVN

mov r1, 0x5

str r1, [r0]

3、設(shè)置CPU到異步工作模式

mrc p15, 0, r0, c1, c0, 0

orr r0, r0, 0xc0000000

mcr p15, 0, r0, c1, c0, 0

4、設(shè)置FCLK

#define MPLLCON 0x4c000004

#define MPLL_405MHZ ((127<<12) | (2<<4) | (1<<0))

ldr r0, =MPLLCON

mov r1, =MPLL_405MHZ

str r1, [r0]

mov pc, lr

6410:

1、同樣,Lock time不變,保持原來(lái)值。

2、設(shè)置分頻系數(shù)


ARMCLK = APLLout/(DIVARM+1)HCLKX2 = MPLLout/(DIVHCLKX2+1)HCLK = HCLKX2/(DIVHCLK+1)PCLK = HCLKX2/(DIVPCLK+1)

參考Uboot可以設(shè)置DIVpclk = 3 DIVhclk = 1 DIVhclkX2 = 1 DIVARM = 0



代碼如下:

#define CLK_DIV0 0x7e00f020#define DIV_VAL ((0x0<<0)|(0x1<<9)|(0x1<<8)|(0x3<<12))init_clock:ldr r0, =CLK_DIV0ldr r1, = DIV_VALstr r1, [r0]

3、設(shè)置CPU工作在異常模式下


#define OTHERS 0x7e00f900ldr r0, =OTHERSldr r1, [r0]bic r1, r1, #0xc0str r1, [r0]

4、設(shè)置FCLK為533MHZ

#define MPLL_CON, 0x7e00f010#define APLL_CON, 0x7e00f00c#define PLL_Val ((1<<31)|(266<<16)|(3<<8)|(1<<0))ldr r0, =APLL_CONldr r1, =PLL_Valstr r1, [r0]ldr r0, =MPLL_CONldr r1, =PLL_Valstr r1, [r0]

5、6410還有個(gè)特殊性就是設(shè)置一下選擇器CLK_SRC設(shè)置PLL產(chǎn)生時(shí)鐘為時(shí)鐘源。

#define CLK_SRC 0x7e00f01cldr r0, =CLK_SRCmov r1, #0x3str r1, [r0]
然后運(yùn)行后下載到開(kāi)發(fā)板運(yùn)行

全代碼為:

.text.global _start_start:b resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq_undefined_instruction:	.word undefined_instruction_software_interrupt:	.word software_interrupt_prefetch_abort: 	.word prefetch_abort_data_abort: 	.word data_abort_not_used: 	.word not_used_irq:	.word irq_fiq:	.word fiqundefined_instruction:nopsoftware_interrupt:nopprefetch_abort:nopdata_abort:nopnot_used:nopirq:nopfiq:nopreset:bl set_peri_portbl set_svcbl disable_watchdogbl disable_interruptbl disable_mmubl init_clockbl light_ledset_peri_port:ldr r0, =0x70000000orr r0, r0, #0x13mcr p15,0,r0,c15,c2,4mov pc, lr	set_svc:mrs r0, cpsrbic r0, r0, #0x1forr r0, r0, #0xd3msr cpsr, r0mov pc, lr#define pWTCON 0x7E004000disable_watchdog:ldr r0, =pWTCON	/*mov的操作數(shù)最多為8位*/mov r1, #0x0str r1, [r0]mov pc, lrdisable_interrupt:mvn r1, #0x0ldr r0, =0x71200014str r1, [r0]ldr r0, =0x71300014str r1, [r0]mov pc, lrdisable_mmu:mcr p15, 0, r0, c7, c7, 0mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00000007mcr p15, 0, r0, c1, c0, 0mov pc, lr	#define CLK_DIV0 0x7e00f020#define DIV_VAL ((0x0<<0)|(0x1<<9)|(0x1<<8)|(0x3<<12))#define OTHERS 0x7e00f900#define MPLL_CON 0x7e00f010#define APLL_CON 0x7e00f00c#define PLL_Val ((1<<31)|(266<<16)|(3<<8)|(1<<0))#define CLK_SRC 0x7e00f01cinit_clock:ldr r0, =CLK_DIV0ldr r1, =DIV_VALstr r1, [r0]ldr r0, =OTHERSldr r1, [r0]bic r1, r1, #0xc0str r1, [r0]ldr r0, =APLL_CONldr r1, =PLL_Valstr r1, [r0]ldr r0, =MPLL_CONldr r1, =PLL_Valstr r1, [r0]ldr r0, =CLK_SRCmov r1, #0x3str r1, [r0]mov pc, lr	#define GPKCON0 0x7f008800#define GPKDAT 0x7f008808light_led:ldr r0, =GPKCON0ldr r1, =0x11110000str r1, [r0]ldr r0, =GPKDATldr r1, =0xa0str r1, [r0]mov pc, lr


評(píng)論


技術(shù)專區(qū)

關(guān)閉