<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

根據韋東山修改的mini2440 nand flash裸機程序

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

知識點(diǎn)梳理
頁(yè)的絕對地址與相對地址

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


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



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

NAND FLASH地址周期:

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




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



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

nand.lds代碼解釋?zhuān)?br />
如果代碼小于4096字節,那么開(kāi)發(fā)板啟動(dòng)后它們被自動(dòng)復制進(jìn)“Steppingstone”中;本實(shí)例的目的就是把一部分代碼存放在NAND Flash地址4096之后,當程序啟動(dòng)通過(guò)NAND Flash控制器將它們讀出來(lái)、執行。nand.lds就是實(shí)現這個(gè)目的的,即連接腳本nand.lds把代碼分為兩部分,nand.lds代碼如下:



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



mini2440開(kāi)發(fā)板的時(shí)鐘

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

本實(shí)驗一共包含6個(gè)文件,分別為Makefile,head.S,init.c,main.c,nand.c,nand.lds,最后會(huì )把文件源代碼全部貼出來(lái)。
將6個(gè)文件復制到虛擬機的linux系統中,然后make編譯生成nand.bin文件,通過(guò)supervivi的v命令,結合DNW將它下載到板子中,然后板子從nand flash啟動(dòng),可以看到4個(gè)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ù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>