新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > OK6410燒寫(xiě)裸機(jī)程序到nandflash

OK6410燒寫(xiě)裸機(jī)程序到nandflash

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
初學(xué)嵌入式我是從裸機(jī)程序開(kāi)始的,剛學(xué)的時(shí)候也怎么也不知道將裸機(jī)程序在開(kāi)發(fā)板上面運(yùn)行。網(wǎng)上其實(shí)有很多辦法,但是我測(cè)試過(guò)都是在UBOOT的基礎(chǔ)上用DNW或者jlink等工具拷貝到內(nèi)存中去運(yùn)行,重啟開(kāi)發(fā)板后就失效了,而且UBOOT會(huì)對(duì)開(kāi)發(fā)板的運(yùn)行環(huán)境初始化,這樣的運(yùn)行環(huán)境,和我們把程序燒寫(xiě)到nandflash里去運(yùn)行是不一樣的。如:uboot會(huì)對(duì)CPU時(shí)鐘初始化,讓cpu運(yùn)行在532mhz下(或者其他的頻率),而從nandflash運(yùn)行程序我們一般都沒(méi)有初始化CPU時(shí)鐘,則CPU靠外部晶振提供時(shí)鐘,我們的OK6410開(kāi)發(fā)板的外部晶振是12Mhz(XTO,XTI引腳),差別之大則體現(xiàn)在運(yùn)行速度上面。

下面我們介紹怎么將我們寫(xiě)好的bin文件燒寫(xiě)到nandflash的前8KB中去,當(dāng)開(kāi)發(fā)板啟動(dòng)后,它會(huì)直接拷貝nandflash的前8K到sram中運(yùn)行。

本文引用地址:http://m.butianyuan.cn/article/201611/319456.htm

先上程序

c程序:

[cpp]view plaincopy
  1. //led.c一個(gè)簡(jiǎn)單的循環(huán)點(diǎn)燈程序
  2. #definerGPMCON(*(volatileunsigned*)(0x7F008820))
  3. #definerGPMDAT(*(volatileunsigned*)(0x7F008824))
  4. #definerGPMPUD(*(volatileunsigned*)(0x7F008828))
  5. voidmsDelay(inttime)
  6. {
  7. volatileunsignedinti,j;
  8. for(i=0;i<20000;i++)
  9. for(j=0;j
  10. }
  11. voidGPIO_Init(void)
  12. {
  13. rGPMCON=0x11111;
  14. rGPMPUD=0x00;
  15. rGPMDAT=0X1F;
  16. }
  17. voidLedTest(void)
  18. {
  19. volatileunsignedinti;
  20. while(1)
  21. {
  22. for(i=0;i<4;i++)
  23. {
  24. rGPMDAT=~(1<
  25. msDelay(10);
  26. }
  27. }
  28. }
  29. voidmain(void)
  30. {
  31. GPIO_Init();
  32. LedTest();
  33. }

匯編程序:

[plain]view plaincopy
  1. .globl_start
  2. _start:
  3. ldrr0,=0x70000000
  4. orrr0,r0,#0x13
  5. mcrp15,0,r0,c15,c2,4@256M(0x70000000-0x7fffffff)
  6. ldrr0,=0x7E004000
  7. movr1,#0
  8. strr1,[r0]
  9. ldrsp,=8*1024
  10. blmain
  11. halt:
  12. bhalt

Makefile:

[plain]view plaincopy
  1. led.bin:start.oled.o
  2. arm-linux-ld-Ttext0-oled.elfstart.oled.o
  3. arm-linux-objcopy-Obinaryled.elfled.bin
  4. arm-linux-objdump-Dled.elf>led.dis
  5. start.o:start.S
  6. arm-linux-gcc-ostart.ostart.S-c-O2
  7. led.o:led.c
  8. arm-linux-gcc-oled.oled.c-c-O2
  9. clean:
  10. rm*.oled.elfled.binled.dis


將上述3個(gè)文件放在Linux上面編譯生成led.bin,然后將led.bin拷貝到windows目錄下。

我們假設(shè)你的OK6410什么程序都沒(méi)有(開(kāi)機(jī)沒(méi)有任何反應(yīng))。

我們將三個(gè)線(xiàn)連接到開(kāi)發(fā)板上面:

1,開(kāi)發(fā)板電源線(xiàn)

2,USB轉(zhuǎn)串口線(xiàn):一端連接電腦USB口,一端連接開(kāi)發(fā)板。

3,USB device線(xiàn):一端連接電腦USB口,一端連接開(kāi)發(fā)板。(就是開(kāi)發(fā)板上面的小USB口,dnw下載程序用,請(qǐng)根據(jù)飛凌的資料安裝好驅(qū)動(dòng)程序)

硬件連接完畢,現(xiàn)在介紹燒寫(xiě)步驟。

燒寫(xiě)原理:用Linux的UBOOT命令 nand 燒寫(xiě)程序到開(kāi)發(fā)板。

1,通過(guò)SD_Writer.exe將mmc.bin燒寫(xiě)到SD 卡中,將開(kāi)發(fā)板設(shè)置到SD卡啟動(dòng)。(具體方法參見(jiàn)飛凌開(kāi)發(fā)板linux3.0.1用戶(hù)手冊(cè).pdf)

2,將SD卡安裝到開(kāi)發(fā)板中并啟動(dòng),快速敲空格鍵讓開(kāi)發(fā)板停留在uboot的啟動(dòng)畫(huà)面,如下圖所示。

3,輸入dnw 50008000 下載你要燒寫(xiě)的程序,如圖:

然后從dnw的usbport->Transmit->Transmit發(fā)送你要生成的led.bin文件。如下圖

4,輸入 nand erase 0 100000 擦除nandflash前1Mb空間。

5,輸入 nand write.uboot 50008000 0 100000 將內(nèi)存地址50008000中的1Mb數(shù)據(jù)寫(xiě)到nandflash的0~100000空間中。(即前1Mb中,uboot中輸入的數(shù)據(jù)默認(rèn)16進(jìn)制)

6,將開(kāi)發(fā)板設(shè)置到nandflash啟動(dòng),并啟動(dòng)開(kāi)發(fā)板,你就可以看到4盞LED燈在循環(huán)亮。

因水平有限,如果有什么錯(cuò)誤請(qǐng)各位網(wǎng)友指出,我看到一定會(huì)更正。

---------------------------------------------------------------------------

2012/08/08修改說(shuō)明:由于OK6410采用的是每頁(yè)4KB的nandflash,而CPU默認(rèn)支持最大2KB每頁(yè)的nandflash,而造成第一種方法燒寫(xiě)超過(guò)2KB,則方法失效,這是第二種方法,可以很好的兼容大的bin文件。




評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉