<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          ARM裸機開發(fā)bootloader時鐘初始化ARM跑快了

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

          1、什么是時鐘脈沖信號,起什么作用?

          本文引用地址:http://www.ex-cimer.com/article/201611/318215.htm

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

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

          3、如何產(chǎn)生時鐘信號?

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

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

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

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

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

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

          5、信號產(chǎn)生對比

          5.1、對于特定的時鐘頻率,采用PLL合成器可以使用較便宜以及較低頻率晶振來代替昂貴的高頻晶振;

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

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

          二、時鐘體系

          學習時鐘體系學什么

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

          2440:

          1、12MHZ晶振

          2、MPLL、UPLL

          3、MPLL(FCLK,HCLK,PCLK)

          UPLL(UCLK)

          4、

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

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

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

          6410:

          1、12MHZ

          2、APLL、MPLL、EPLL

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

          4、

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

          210:

          1、24MHZ

          2、4個PLL:APLL,MPLL,EPLL,VPLL

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

          時鐘體系所屬時鐘應(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

          三、思維導圖的設(shè)計

          軟件設(shè)計指導:

          1、時鐘初始化流程


          從上圖的時序我們可以看到

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

          2、我們的程序開頭啟動MPLL,設(shè)置MPLL的寄存器

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

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

          時鐘初始化流程(芯片手冊):

          1、設(shè)置Lock Time

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

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

          4、設(shè)置FCLK

          開始寫代碼

          2440:

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

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

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

          時鐘初始化程序要位于led點亮程序之前,這樣便于調(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不變,保持原來值。

          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還有個特殊性就是設(shè)置一下選擇器CLK_SRC設(shè)置PLL產(chǎn)生時鐘為時鐘源。

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

          全代碼為:

          .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


          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();