新聞中心

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

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

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

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

        本文引用地址:http://www.104case.com/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什么程序都沒有(開機(jī)沒有任何反應(yīng))。

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

        1,開發(fā)板電源

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

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

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

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

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

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

        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啟動(dòng),并啟動(dòng)開發(fā)板,你就可以看到4盞LED燈在循環(huán)亮。

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

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

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




        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 新田县| 安福县| 海门市| 屏边| 文山县| 太湖县| 山丹县| 安庆市| 都兰县| 通化市| 张家界市| 靖宇县| 湖北省| 崇阳县| 犍为县| 泸西县| 习水县| 临潭县| 楚雄市| 永胜县| 安岳县| 连平县| 杭州市| 隆回县| 应城市| 大安市| 中西区| 天峨县| 樟树市| 涞源县| 陆河县| 顺义区| 张掖市| 淮北市| 迭部县| 呼和浩特市| 杂多县| 辉县市| 京山县| 黎平县| 瓦房店市|