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

          新聞中心

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

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

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

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

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

          先上程序

          c程序:

          [cpp]view plaincopy
          1. //led.c一個簡單的循環(huá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個文件放在Linux上面編譯生成led.bin,然后將led.bin拷貝到windows目錄下。

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

          我們將三個線連接到開發(fā)板上面:

          1,開發(fā)板電源

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

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

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

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

          1,通過SD_Writer.exe將mmc.bin燒寫到SD 卡中,將開發(fā)板設(shè)置到SD卡啟動。(具體方法參見飛凌開發(fā)板linux3.0.1用戶手冊.pdf)

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

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

          然后從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ù)寫到nandflash的0~100000空間中。(即前1Mb中,uboot中輸入的數(shù)據(jù)默認(rèn)16進(jìn)制)

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

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

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

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




          評論


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