ARM裸機(jī)開(kāi)發(fā)bootloader時(shí)鐘初始化ARM跑快了
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 |
HCLK | AHB BUS | LCD DMA |
PCLK | APB BUS | UART GPIO |
UCLK | USB | USB主從口 |
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)用舉例 |
ARMCLK | ARM | ARM11 |
HCLK | AHB BUS | LCD DMA |
PCLK | APB BUS | UART GPIO |
SCLK | 特殊情況 | USB主從口 |
210:
1、24MHZ
2、4個(gè)PLL:APLL,MPLL,EPLL,VPLL
3、210與2440和6410都有所不同:
時(shí)鐘體系 | 所屬時(shí)鐘 | 應(yīng)用舉例 | 鎖相環(huán) |
MSYS | ARMCLK HCLK_MSYS PCLK_MSYS | ARM核 內(nèi)存控制器 中斷 | APLL |
DSYS | HCLK_DSYS PCLK_DSYS | 顯示相關(guān)部件,如FIMC | MPLL |
PSYS | HCLK_PSYS CLK_DPM | 外設(shè),如Uart,i2C | EPLL |
視頻相關(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)論