在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 根據(jù)韋東山修改的mini2440 nand flash裸機程序

            根據(jù)韋東山修改的mini2440 nand flash裸機程序

            作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
            說明
            開發(fā)板:mini2440
            Nand flash:K9F2G08U0B2,56M
            本程序?qū)崿F(xiàn)功能:我是參考韋東山的第8章的裸機程序,但是他的nand flash型號是64MB的K9F12080M,所以我依照他的程序加以修改,下載到nand flash,從nand flash實現(xiàn)將main.c程序復制到sdram中執(zhí)行。
            參考書:《嵌入式應(yīng)用開發(fā)完全手冊》
            《ARM處理器裸機開發(fā)實戰(zhàn)---機制而非策略》

            知識點梳理
            頁的絕對地址與相對地址

            在nand.c中有一個函數(shù)void RdNF2SDRAM(),它的功能是將nand flah的內(nèi)容復制到sdram,如下:


            nand flash的頁讀取函數(shù)原型是void nf_readpage(unsigned int block,unsigned int page,unsigned char *dstaddr),它的功能是從nand flash的第block塊的第page頁讀取1頁(對于K9F2G來說,1頁等于2KB)的內(nèi)容,存放到指針dstaddr所指的地址處。有的人可能就會說了,既然nf_readpage可以讀取1頁的數(shù)據(jù)到指定的地址處,而sdram的地址是0x30000000,那直接可以使用它將nand flash的代碼復制到sdram去啊,答案當然是可以?。〉怯袀€前提,復制到sdram的內(nèi)容必須在2KB以內(nèi),一旦超過了2KB,那就需要借用RdNF2SDRAM()函數(shù)了,相信這樣解釋就能明白這兩個函數(shù)的區(qū)別于聯(lián)系了。
            再說說絕對地址與相對地址,首先知道k9f2g有2048個塊,每個塊有64個頁,每頁有2K字節(jié)。我們平常所說的第幾塊第幾頁就是相對地址,比如第2塊第3頁是相對地址。而絕對地址=塊號*64+頁號,例如前邊的第2塊第3頁換成絕對地址就是131(131=2*64+3)。
            下面解釋一下RdNF2SDRAM()函數(shù):
            113行:從117行可以看出,這里的i指的是相對地址
            114行:在nand flash內(nèi)的起始地址,這里的4096表示的是字節(jié),k9f2g內(nèi)存大小是256Mbyte,這里之所以令start_addr=4096,是因為咱們在nand.lds文件中,將main.c文件的地址定義在了4096處。如下圖:



            如果AT(4096)改為AT(5120),那么這里start_addr就等于5120。還要注意這里4096byte也就是4KB,為什么把他定義在nand flash的4KB之后呢,因為硬件電路會自動將nand flash里的前4KB的內(nèi)容搬移到stepping stone中去執(zhí)行,如果定義在3KB之后,main.c函數(shù)直接就執(zhí)行了,哪里還用復制。
            115行:定義了讀取的nand flash的內(nèi)容存放的位置,這里0x30000000是sdram的物理地址。
            116行:定義了一共讀取nand flash多少字節(jié),這里定義的是1M,當然小小的一個main.c代碼也就是不到2KB。
            117-123行:這才是該函數(shù)的關(guān)鍵。因為nf_readpage函數(shù)是以頁為單位進行讀取的,每次讀取2KB數(shù)據(jù),因此,數(shù)據(jù)指針的移動是頁對齊的,即每次移動一頁。
            117行:因為每page大小為2KB即2048Byte,這里start_addr>>11位,相當于start_addr/2048,這樣就得到了給定地址多對應(yīng)的頁。
            119行:這里的i是絕對地址,因為每塊包含64頁,i/64得到給定地址處于哪一塊;id是該頁在塊內(nèi)的第幾頁。

            NAND FLASH地址周期:

            下面咱們講講地址周期。對于mini2440的開發(fā)板,它的nand flash的接口電路如下圖:




            從接口電路可以看到,地址線和數(shù)據(jù)線是復用的,接口線寬是8位,因此每次只能發(fā)送一個字節(jié),又因為nand flash的地址是28位的,需要5個地址周期才能將地址發(fā)送完畢,如圖1所示。發(fā)送完地址后,NAND FLASH內(nèi)部的地址譯碼電路會自動將收到的地址進行組合,不需要我們關(guān)心,但是需要注意發(fā)送的順序,按照先發(fā)送低地址,再發(fā)送高地址的順序發(fā)送。
            那么為什么是29根地址線,而不是28根或者30根呢?這里肯定有它的原因的。通常來說,nand flash的地址的表示形式為:
            地址線[A28:A18][A17:A12][A11:A0]
            地址表示塊地址頁地址頁內(nèi)偏移地址
            對于k9f2g來說,它有2048個塊,故用11根地址線尋址(2^11=2048);每個塊有64頁,故用6根地址線尋址(2^6=64);每頁有2048字節(jié)的數(shù)據(jù)和64字節(jié)的信息,也就是說它有2112字節(jié),故用12根地址線尋址。理解了這里的話就很容易明白下面的發(fā)送地址了。
            不論是在nand flash頁讀取函數(shù)還是也寫入函數(shù)內(nèi),都需要向地址寄存器送地址,如下圖:



            為什么是這樣呢?由于頁讀取和寫入函數(shù)均是以頁為單位進行的,所以每次都要在頁的第0個字節(jié)開始,也就是說頁內(nèi)偏移地址為0,所以對地址線的低12位設(shè)為0即可,如第93行,94行。
            第95行,此時處于第3個地址周期因此需要發(fā)送blockpage(此時blockpage是頁的絕對地址)的A12-A19位,因此,將blockpage與0xff相與即可。一定要注意頁的絕對地址是A28-A12共同表示的,與A11-A0無關(guān)。
            第96行,此時處于第3個地址周期因此需要發(fā)送blockpage(此時blockpage是頁的絕對地址)的A20-A27位,因此,將blockpage右移8位,與0xff相與即可。
            第97行,此時處于第3個地址周期因此需要發(fā)送blockpage(此時blockpage是頁的絕對地址)的A28位,從圖1可以看到,此時雖然是發(fā)送8位,但是只有第0位是有效的,其他位無效。因此,將blockpage右移16位,然后再與0x1相與,只保留第0位。

            nand.lds代碼解釋:

            如果代碼小于4096字節(jié),那么開發(fā)板啟動后它們被自動復制進“Steppingstone”中;本實例的目的就是把一部分代碼存放在NAND Flash地址4096之后,當程序啟動通過NAND Flash控制器將它們讀出來、執(zhí)行。nand.lds就是實現(xiàn)這個目的的,即連接腳本nand.lds把代碼分為兩部分,nand.lds代碼如下:



            第2行表示head.o、init.o、nand.o這3個文件的運行地址為0,它們在生成的映像文件中的偏移地址也為0(從0開始存放)
            第3行表示main.o的運行地址為0x30000000,它在生成的映像文件中的偏移地址為4096。
            此時生成的bin文件大小為4.10KB。
            如果將第3行的AT(4096)去掉,其他的文件程序不變的話,make生成的bin文件大小為1.7KB。這樣子對比就可以看出來AT真的起作用了。



            mini2440開發(fā)板的時鐘

            Fin=12MHz FCLK=400MHz HCLK=100MHz PCLK=50MHz
            所以FCLK:HCLK:PCLK=1:4:8,CLKDIV_VAL=5
            MDIV=127 PDIV=2 SDIV=1
            編譯生成bin文件,下載運行

            本實驗一共包含6個文件,分別為Makefile,head.S,init.c,main.c,nand.c,nand.lds,最后會把文件源代碼全部貼出來。
            將6個文件復制到虛擬機的linux系統(tǒng)中,然后make編譯生成nand.bin文件,通過supervivi的v命令,結(jié)合DNW將它下載到板子中,然后板子從nand flash啟動,可以看到4個led燈全亮。


            代碼源文件

            百度文庫pdf地址:http://wenku.baidu.com/view/85e30572168884868662d603.html?st=1
            pdf文件下載地址:http://download.csdn.net/detail/mybelief321/5234586
            源代碼下載地址:http://download.csdn.net/detail/mybelief321/5234602




            關(guān)鍵詞: mini2440nandflash裸機程

            評論


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

            關(guān)閉