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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM裸機(jī)開發(fā)bootloader內(nèi)存初始化

          ARM裸機(jī)開發(fā)bootloader內(nèi)存初始化

          作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
          一、從內(nèi)部看內(nèi)存

          內(nèi)存由于其訪問速度快,訪問方式簡(jiǎn)單成為PC機(jī)與嵌入式設(shè)備不可缺少的部件。

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

          1、內(nèi)存的分類

          內(nèi)存分為DRAM和SRAM,其中DRAM又包含SDRAM、DDR、DDR2。

          DRAM:它的基本部件是小電容,電容可以再兩個(gè)極板上保留電荷,但是需要定期的充電(刷新),否則數(shù)據(jù)就好丟失。缺點(diǎn):要進(jìn)行不斷的刷新才能保持?jǐn)?shù)據(jù),存取速度較慢。

          SRAM:它是一種具有靜止存取功能的內(nèi)存,不需要定期刷新電路就能保持它們內(nèi)部存儲(chǔ)的數(shù)據(jù)。其優(yōu)點(diǎn):存取的速度快;但是缺點(diǎn)是:功耗大,成本高。常用于存儲(chǔ)容量不高,但存取速度快的場(chǎng)合,比如stepping stone。

          DRAM的分類:在嵌入式系統(tǒng)中,除了CPU內(nèi)部的墊腳石采用SRAM外,板載內(nèi)存一般會(huì)采用DRAM,而DRAM又可以分為SDRAM,DDR,DDR2等。

          SDRAM(Synchronous Dynamic Random Access Memory):同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器。

          同步:內(nèi)存工作需要同步時(shí)鐘,內(nèi)部命令的發(fā)送與數(shù)據(jù)的傳輸都以該時(shí)鐘為基準(zhǔn)。

          動(dòng)態(tài):存儲(chǔ)陣列要不斷保持刷新來保證數(shù)據(jù)不丟失。

          隨機(jī):數(shù)據(jù)不是線性依次存儲(chǔ),而是自由指定地址進(jìn)行數(shù)據(jù)讀寫。

          2440使用的是SDRAM

          DDR:(Double Data Rate SDRAM),即“雙倍速率同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器”。與早起的SDRAM相比,DDR除了可以在時(shí)鐘脈沖的上升沿傳輸數(shù)據(jù),還可以在下降沿傳輸信號(hào),這就意味著在相同的工作頻率下,DDR的理論傳輸速度為SDRAM的兩倍。DDR2則在DDR的基礎(chǔ)上再次進(jìn)行了改進(jìn),使得數(shù)據(jù)傳輸速率在DDR的基礎(chǔ)上再次翻倍。

          6410開發(fā)板通常采用DDR內(nèi)存

          210開發(fā)板通常采用DDR2內(nèi)存

          2、內(nèi)存的內(nèi)部結(jié)構(gòu)

          內(nèi)存的內(nèi)部結(jié)構(gòu)包含三項(xiàng)內(nèi)容:表結(jié)構(gòu)、L-Bank、尋址信息

          2.1內(nèi)存的內(nèi)部如同表格,數(shù)據(jù)就存放在每個(gè)單元格中。數(shù)據(jù)讀寫時(shí),先指定行號(hào)(行地址),再指定列號(hào)(列地址),我們就可以準(zhǔn)確地找到所需要的單元格。而這張表格稱為:Logical Bank(L-Bank)。

          由于技術(shù)、成本等原因,一塊內(nèi)存不可能把所有的單元格做到一個(gè)L-Bank,現(xiàn)在內(nèi)存內(nèi)部基本都會(huì)分割成4個(gè)L-Bank。

          內(nèi)存的尋址有三個(gè)重要因素:1、L-Bank選擇信號(hào) 2、行地址 3、列地址

          二、內(nèi)存初始化

          1、2440

          對(duì)于這部分內(nèi)容,接下來要從以下四個(gè)方面來闡述:1、地址空間2、內(nèi)存芯片的硬件連接3、存儲(chǔ)控制寄存器的設(shè)置4、編寫代碼進(jìn)行內(nèi)存初始化設(shè)置

          1、S3c2440芯片對(duì)外提供的引腳上,只給出了27根地址線Addr[0:26]。單靠芯片上的27根引腳,它只能訪問128M的外設(shè)空間。為了擴(kuò)大外設(shè)的訪問范圍,S3c2440芯片又提供了8個(gè)片選信號(hào)nGCS0-nGCS7.當(dāng)某個(gè)片選信號(hào)nGCSX有效時(shí),則可以通過27根地址線去訪問對(duì)應(yīng)的片選的128MB空間。由于有8個(gè)片選,所以2440芯片能訪問的外設(shè)空間總共為8*128MB=1GB。而1G(0x40000000)以上的空間,則安排給了2440內(nèi)部的寄存器,訪問這些內(nèi)部寄存器,則是通過32位的處理器內(nèi)部總線來完成的。

          ARM9核不知道內(nèi)存、NorFlash、網(wǎng)卡芯片寄存器地址,而是通過存儲(chǔ)器控制器來進(jìn)行解析,從而使得ARM核可以通過存儲(chǔ)控制器寄存器來設(shè)置訪問外設(shè)寄存器。

          2、S3c2440有32根數(shù)據(jù)線引腳,兩片32M的內(nèi)存芯片并聯(lián)在數(shù)據(jù)線的高、低位上。所以說2440的數(shù)據(jù)是32位的。

          3、設(shè)置2440存儲(chǔ)控制寄存器,參考2440的芯片手冊(cè)進(jìn)行設(shè)置。

          BWSCON 0x22000000

          BANK CON0-5 保持不變,為0x00000070.因?yàn)?-5不存放內(nèi)存。只有6-7才存放了內(nèi)存。

          在計(jì)算機(jī)中,RAM一般用于內(nèi)存。ROM用來存放一些硬件的驅(qū)動(dòng)程序,也就是固件。

          咱們平時(shí)用的U盤為Flash。它可以在相同的電壓下讀寫,且容量大,成本低。而ROM一般讀為5V,寫12V。

          BANK6-7 0x18001

          REFRESH 定期充電

          BANKSEZE

          MRSRB6-7

          對(duì)以上的所有寄存器進(jìn)行完初始化后,內(nèi)存控制器的所有寄存器就都進(jìn)行了初始化。

          4、代碼編寫:

          由于數(shù)據(jù)和寄存器比較多,所以運(yùn)用循環(huán)把相應(yīng)的數(shù)據(jù)存入各個(gè)寄存器。

          #define mem_contrl 0x48000000init_sdram:ldr r0, =mem_contrl add r3, r0, #4*13adrl r1, mem_data0:ldr r2, [r1], #4str r2, [r0], #4cmp r0, r3bne 0b /*表示向前跳轉(zhuǎn)*/mov pc, lrmem_data:.long 0x22000000 .long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00018001.long 0x00018001.long 0x008c04f5.long 0x000000b1.long 0x00000030.long 0x00000030
          介紹一下匯編語言中的訪問存儲(chǔ)器 [r1] 就是取出r1地址處的內(nèi)容,實(shí)際就是指針操作。

          6410:

          1、地址空間:S3C6410處理器擁有32位地址總線,其尋址空間為4GB。其中高2G為保留區(qū),低2G區(qū)域又可分為兩部分:主存儲(chǔ)區(qū)和外設(shè)存區(qū)。

          2、主存儲(chǔ)區(qū)又分為:

          啟動(dòng)鏡像區(qū):這個(gè)區(qū)域的作用正如它的名字所述,是用來啟動(dòng)ARM系統(tǒng)的。但是這個(gè)區(qū)域并沒有固定的存儲(chǔ)介質(zhì)與之對(duì)應(yīng)。而是通過修改啟動(dòng)選項(xiàng),把不同的啟動(dòng)介質(zhì)映射到

          該區(qū)域。比如說選擇了IROM啟動(dòng)方式后,就把IROM映射到該區(qū)域。

          內(nèi)部存儲(chǔ)區(qū):這個(gè)區(qū)域?qū)?yīng)著內(nèi)部的內(nèi)存地址,iROM和SRAM都是分布在這個(gè)區(qū)間。0x08000000-0x0bffffff對(duì)應(yīng)著內(nèi)部ROM,但是IROM實(shí)際只有32KB,選擇從IROM啟動(dòng)的時(shí)候,首先運(yùn)行就是這里面的程序BL0,這部分代碼由三星固化。0x0c000000-ox0fffffff對(duì)應(yīng)內(nèi)部SRAM,實(shí)際就是8KB的Steppingstone。

          靜態(tài)存儲(chǔ)區(qū):這個(gè)區(qū)域用于訪問掛在外部總線上的設(shè)備,比如說NOR flash、oneNand等。這個(gè)區(qū)域被分割為6個(gè)bank,每個(gè)bank為128MB,數(shù)據(jù)寬度最大支持16bit,每個(gè)bank由片選Xm0CS[0]-Xm0CS[5]選中。

          動(dòng)態(tài)存儲(chǔ)區(qū):該區(qū)域從0x50000000-0x6fffffff,又分為2個(gè)區(qū)間,分別占256MB,可以片選Xm1CS[0]-Xm1CS[1]來進(jìn)行著2個(gè)區(qū)間的選擇。我們6410開發(fā)板上256MB的DDR內(nèi)存就安排在這個(gè)區(qū)域,這也就是為什么6410的內(nèi)存地址是從0x50000000開始的原因。

          2、內(nèi)存芯片的連接可以參考2440

          3、代碼編寫:

          由于這部分代碼量比較大,所以我把這部分單獨(dú)放在了一個(gè)文件下并命名為

          mem.S,并要在makefile中做相應(yīng)的修改

          .text.global mem_initmem_init:@set data pin;ldr r0, =0x7e00f120 mov r1, #0x0str r1, [r0]@program memc_cmd to b100,which makes DRAM Controller enter Configstate.	ldr r0, =0x7e001004 mov r1, #0x4         str r1, [r0]ldr r0, =0x7e001010  ldr r1, =( ( 7800 / ( 1000000000/133000000 ) + 1 ) )      str r1, [r0]ldr r0, =0x7e001014  mov r1, #(3 << 1)str r1, [r0]ldr r0, =0x7e001018  mov r1, #0x1str r1, [r0]ldr r0, =0x7e00101c  mov r1, #0x2str r1, [r0]ldr r0, =0x7e001020   ldr r1, =( ( 45 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001024  ldr r1, =( ( 68 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001028  ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e00102c  ldr r1, =( ( 80 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001030   ldr r1, =( ( 23 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001034   ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001038   ldr r1, =( ( 15 / ( 1000000000 / 133000000 ) + 1 ) )@  ldr r2, [r0]str r1, [r0]ldr r0, =0x7e00103c   mov r1, #0x07str r1, [r0]ldr r0, =0x7e001040   mov r1, #0x02str r1, [r0]ldr r0, =0x7e001044   ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e001048   ldr r1, =( ( 120 / ( 1000000000 / 133000000 ) + 1 ) )str r1, [r0]ldr r0, =0x7e00100c   ldr r1, =0x00010012   str r1, [r0]ldr r0, =0x7e00104c   ldr r1, =0x0b45str r1, [r0]ldr r0, =0x7e001200   ldr r1, =0x150f8str r1, [r0]ldr r0, =0x7e001304   mov r1, #0x0str r1, [r0]@Issue NOPldr r0, =0x7e001008 ldr r1, =0x000c0000str r1, [r0]@prechargeallldr r1, =0x00000000str r1, [r0]@Autorefreshldr r1, =0x00040000str r1, [r0]@Autorefreshldr r1, =0x00040000str r1, [r0]@mrsldr r1, =0x000a0000str r1, [r0]@mrsldr r1, =0x00080032str r1, [r0]ldr r0, =0x7e001004mov r1, #0x0str r1, [r0]check_dmc1_ready:ldr r0, =0x7e001000 ldr r1, [r0]mov r2, #0x3and r1, r1, r2cmp r1, #0x1bne check_dmc1_readynopmov pc, lr

          210:

          1、地址空間


          1、210有4G的尋址空間,內(nèi)存地址從0x20000000開始,0地址處為映射區(qū),系統(tǒng)從此開始。

          2、210采用的芯片是8bit的4個(gè)內(nèi)存芯片(128M)。

          其中DRAM0為512M

          DRAM1為1G。

          警告:當(dāng)編寫代碼時(shí),如果可以保持默認(rèn)值不變,就把寄存器設(shè)置為默認(rèn)值。

          4、代碼的編寫部分可以參考210的芯片手冊(cè)或U-Boot中的代碼。



          評(píng)論


          技術(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); })();