最簡單的ARM裸機程序,幫你理解程序的運行啓動(mini2440開發板)


//菜鳥學嵌入式.
//這一個真正的全裸代碼。具體原理是這樣的:
//首先是設置到NAND Flash 啓動。當ARM 上電後,會自動讀取NAND Flash
// 0x0000000地址處執行代碼。我們將代碼編譯聯接地址也設爲0x0000000
//然後,用Jflash 燒寫時,燒寫到NAND Flash的0x0000000。那麼上電後就會
//執行你的代碼。
1:交叉環境的建立
   按照 mini2440用戶手冊,175頁成功設置好 .
2:連上開發板與PC上的JTAG線.開發板接上電源,
  設置從NAND FLASH啓動.(一定要確定是NAND FLASH啓動)
  否則燒寫的時候不成功。
  開啓開發板電源.
3:編譯 led_on.S  

@******************************************************************************
@ File:led_on.S           (引用:嵌入式linux應用開發完全手冊 韋東山 編著。)我做了一點改動。
@ 功能:LED點燈程序,點亮LED
@ mini2440 的LED口是 GPB5,GPB6,GPB7,GPB8.給它們送[低電平,則點亮 ][高電平,則點滅].
@ 它的配置地址是:0x56000010 我們將向這個地址中寫入值,將GPB5/6/7/8 這四個引腳設爲輸出口,
@ 它的數據地址是:0x56000014 我們向這裏面送相應的值就會相應的點亮相應的燈。
@ 比如送0x00000060 --> bit8,bit7 爲低電平,bit6,bit5 是高電平.因此led4,3亮,led2,1滅。
@******************************************************************************      
           
.text
.global _start
_start:    
            LDR     R0,=0x56000010      @ R0設爲GPBCON寄存器。此寄存器
                                        @ 用於選擇端口B各引腳的功能:
                                        @ 是輸出、是輸入、還是其他
            MOV     R1,#0x00015400      @ 設置GPB5,GPB6,GPB7,GPB8,爲輸出口  #表示後面的是立即數,0x表示是十六進制數。    
            STR     R1,[R0]             @ 將R1中的值,送到地z址:0x56000010中
            LDR     R0,=0x56000014      @ R0設爲GPBDAT寄存器。此寄存器
                                        @ 用於讀/寫端口B各引腳的數據
            MOV     R1,#0x00000060      @ 此值改爲0x00000020,
                                        @ 可讓LED1熄滅
            STR     R1,[R0]             @ GPB5輸出0,LED1點亮
MAIN_LOOP:
            B       MAIN_LOOP  
           
           
           
4:下面是Makefile文件內容。將它放在與led_on.S同一個文件夾下。
其中  arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf  這一句的意思是連接到0x0000000地址。
當你下載的時候,就是下載到nandflash中0x0000000處運行。(不知這樣理解是否準確)
這一句:arm-linux-objcopy -O binary -S led_on_elf led_on.bin 將elf格式文件,變成.bin文件,這個.bin
的二進制文件,是可以在mini2440開發板上運行的。

led_on.bin : led_on.S
 arm-linux-gcc -g -c -o led_on.o led_on.S
 arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf
 arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
 rm -f   led_on.bin led_on_elf *.o

 

5:注意。led_on.S 的後綴是一個大寫的S,而不是小寫的s.
 進入剛纔,你保存文件的文件夾之後。
 執行make. 
 make後會生成一個 led_on.bin文件。
6:將光盤裏jflash2440.tgz解壓.會生成一個Jflash文件夾
  將剛纔的led_on.bin文件複製到 Jflash
  執行如下語句:     ./Jflash-s3c2440 led_on.bin /t=5 /d=0
  出現第一個提示時輸入:5 --表示燒寫的flash類型是 64M的k9s1208
  出現第二個提示時輸入: 0 --表示從第k9s1208 program
  出現第三個提示時輸入: 0 --表示從第0塊燒寫。然後就是燒寫的過程.
  再出現提示時輸入    : 2 --表示退出燒寫。
 
7:關掉開發板的電源,再開啓電源。你發現燈亮了。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章