ARM技術已經開展普及多年了.我以前也略爲看過下書,但也只是現在纔開始修煉.
學習板是GEC2410開發板.
仿真器採用MDS-JTAG仿真器.
實驗1:LED控制
看了有關ARM9的彙編語言.有:LDR, MOV,ADD,SUB,等...一個控制LED閃光的小程序.
是馮老師寫的.
GPFCON EQU 0x56000050
GPFDAT EQU 0x56000054
GPFUP EQU 0x56000058
GPFDAT EQU 0x56000054
GPFUP EQU 0x56000058
EXPORT LEDTEST
AREA LEDTESTASM,CODE,READONLY ;該僞指令定義了一個代碼段,段名爲LEDTESTASM,屬性只讀
AREA LEDTESTASM,CODE,READONLY ;該僞指令定義了一個代碼段,段名爲LEDTESTASM,屬性只讀
LEDTEST
;設置GPF4-GPF7爲output
ldr r0,=GPFCON
ldr r1,=0x5500
str r1,[r0]
;禁止GPF4-GPF7端口的上拉電阻
ldr r0,=GPFUP
ldr r1,=0xf0
str r1,[r0]
;將數據端口F的數據寄存器的地址附給寄存器r2
ldr r2,=GPFDAT
;跑馬燈循環
ledloop1
ldr r1,=0xa0
str r1,[r2] ;使GPF7輸出高電平,D9-D12燈會滅
bl delay1 ;調用延遲子程序
ledloop2
ldr r1,=0x50
str r1,[r2] ;使GPE7輸出低電平D9-D12燈亮
bl delay2 ;調用延遲
;延遲
delay1
ldr r3,=0x0ffff ;設置延遲的時間
delay3
sub r3,r3,#1 ;r3=r3-1
cmp r3,#0x0 ;將r3的值與0相比較
bne delay3 ;比較的結果不爲0(r3不爲0),繼續調用delay1,否則執行下一條語句
b ledloop2
mov pc,lr ;返回
;延遲
delay2
ldr r3,=0x0ffff ;設置延遲的時間
delay4
sub r3,r3,#1 ;r3=r3-1
cmp r3,#0x0 ;將r3的值與0相比較
bne delay4 ;比較的結果不爲0(r3不爲0),繼續調用delay1,否則執行下一條語句
b ledloop1
mov pc,lr ;返回
END ;程序結束符
;設置GPF4-GPF7爲output
ldr r0,=GPFCON
ldr r1,=0x5500
str r1,[r0]
;禁止GPF4-GPF7端口的上拉電阻
ldr r0,=GPFUP
ldr r1,=0xf0
str r1,[r0]
;將數據端口F的數據寄存器的地址附給寄存器r2
ldr r2,=GPFDAT
;跑馬燈循環
ledloop1
ldr r1,=0xa0
str r1,[r2] ;使GPF7輸出高電平,D9-D12燈會滅
bl delay1 ;調用延遲子程序
ledloop2
ldr r1,=0x50
str r1,[r2] ;使GPE7輸出低電平D9-D12燈亮
bl delay2 ;調用延遲
;延遲
delay1
ldr r3,=0x0ffff ;設置延遲的時間
delay3
sub r3,r3,#1 ;r3=r3-1
cmp r3,#0x0 ;將r3的值與0相比較
bne delay3 ;比較的結果不爲0(r3不爲0),繼續調用delay1,否則執行下一條語句
b ledloop2
mov pc,lr ;返回
;延遲
delay2
ldr r3,=0x0ffff ;設置延遲的時間
delay4
sub r3,r3,#1 ;r3=r3-1
cmp r3,#0x0 ;將r3的值與0相比較
bne delay4 ;比較的結果不爲0(r3不爲0),繼續調用delay1,否則執行下一條語句
b ledloop1
mov pc,lr ;返回
END ;程序結束符
我改了一下.用ADS編譯,但ADS的設置如下.:
TARGETNAME : DebugRel ;生成映像文件包含了基本的調試信息
POST-LINKER : ARMFORELF
下面設置ARM-LINKER很重要:
OUTPUT :
LINKERTYPT: SIMPLE ;是默認的鏈接方式,它鏈接生成簡單的ELF格式的目標文件,使用的是鏈接器選項中指定的地址映射方式.
RO BASE : 0X30000000 ;這是READ-ONLY 段,RO BASE 設置爲包含RO輸出段的加載和執行地址,地址值必須字對齊(RO BASE 的設置與硬件地址及生成的映像程序是相關的。)
當我們是在調試程序時,RO BASE 段設在SDRAM地址上,當是編譯燒寫程序,應該設置爲0X00000000
RW BASE : 不設置 ;即READ -WRITE段。這個文本框設置了包括RW和ZI(ZERO-INITIALIZED)輸出段的運行地址。如果選中了SPLIT選項,鏈接器生成的映像文件將包含兩個加載域和兩個運行域。此時,在RW BASE 中所輸入地地址爲包含RW和ZI輸出段的域設置了加載域和運行域地址。(RW BASE 必須設置成SDRAM內的地址)
這段太長了,我現在還未看明。。。。。。
OPTIONS 設置:
IMAGE ENTRY POINT :__ENTRY 在這中加入啓動代碼的入口地址,ARM程序將從這裏開始運行。
LAYOUT 設置:
OBJECT/SYMBOL : START.O 填入啓動代碼的文件名,爲輸出文件,
SECTION: SELBOOT 填入啓動程序的段名。
在DEBUG SETTING 中選擇ARM FROMELF ,在OUTPUT FORMAT 選項擇輸出生成的燒錄文件格式。可以是PLAIN BINARY 生成*.BIN文件,也可以是INTEL 32 BIT HEX ,生成HEX文件。
在OUTPUT FILE NAME 中可以寫入生成的文件的文件名。
設置好後,就MAKE編譯;