在mini2440(S3C2440)的板子上運行LED 的程序,使GPB5輸出低電平,點亮LED.
將代碼在ISRAM 內仿真
1.Led_on.s的完整程序如下
程序代碼:
-----------------------------led_on.S----------------------------------------------------
PRESERVE8 ;保持堆棧8字節對齊,符合新的ARM ABI標准
AREA LED,CODE, READONLY
ENTRY
START1
LDR R0,=0x56000010 ;@ R0設為GPBCON寄存器。此寄存器
;@ 用於選擇端口B各引腳的功能:
;@ 是輸出、是輸入、還是其他
MOV R1,#0x00000400
STR R1,[R0] ;@ 設置GPB5為輸出口, 位[10:9]=0b01
LDR R0,=0x56000014 ;@ R0設為GPBDAT寄存器。此寄存器
;@ 用於讀/寫端口B各引腳的數據
MOV R1,#0x00000000 ;@ 此值改為0x00000020,
;@ 可讓LED1熄滅
STR R1,[R0] ;@ GPB5輸出0,LED1點亮
MAIN_LOOP
B MAIN_LOOP
END
---------------------------------------------------------------------------------------------
2.使用分散加載文件GPIO.sct
;*************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
;LR_IROM1結尾地址不能超過4KB
;因為S3C2440的內部Stepingstone只有4KB,如果超過了4KB ,就必須從NAND搬移代碼到SDRAM
;而主程序裡並沒有搬移的程序,也就是保證裝載的程序必須在4KB以內的nand flash裡。
;其實還有個隱形的條件。LR_IROM10x00000FE0 最大也只能為0x00000FE0,因為第一條指令的反匯編是
LDR R0,[PC,#0x0014],要保證PC+0X0014是小於0x1000,當設置為0x00000fe0,這條指令的是把
地址0x00000fe8+0x0014=0x00000FFC的內容裝載到R0裡,仔細看代碼,果真如此。
;PC指針是指向下兩條指令的位置:(執行A,取指B,譯碼C),當執行A指令,PC已經指向C指令位置了。
如果設置成0x00000fe4,那麼地址是0x00000fec+0x0014=0x1000,已經不小於0x1000,所以不能設置成0x000000FE4。
------------------------------disassembly----------------------------------------------------
6: LDR R0,=0x56000010 ;@ R0設為GPBCON寄存器。此寄存器
7: ;@ 用於選擇端口B各引腳的功能:
8: ;@ 是輸出、是輸入、還是其他
0x00000FE0 E59F0014 LDR R0,[PC,#0x0014]
9: MOV R1,#0x00000400
0x00000FE4 E3A01B01 MOV R1,#0x00000400
10: STR R1,[R0] ;@ 設置GPB5為輸出口, 位[10:9]=0b01
0x00000FE8 E5801000 STR R1,[R0]
11: LDR R0,=0x56000014 ;@ R0設為GPBDAT寄存器。此寄存器
12: ;@ 用於讀/寫端口B各引腳的數據
0x00000FEC E59F000C LDR R0,[PC,#0x000C]
13: MOV R1,#0x00000000 ;@ 此值改為0x00000020,
14: ;@ 可讓LED1熄滅
0x00000FF0 E3A01000 MOV R1,#0x00000000
15: STR R1,[R0] ;@ GPB5輸出0,LED1點亮
16: MAIN_LOOP
0x00000FF4 E5801000 STR R1,[R0]
17: B MAIN_LOOP
0x00000FF8 EAFFFFFE B 0x00000FF8
0x00000FFC 56000010 ???PL
0x00001000 00000000 ANDEQ R0,R0,R0
-------------------------------------------------------------------
---------------GPIO.sct-----------------------------------------
LR_IROM1 0x00000FE00x04000000 { ; load region size_region
ER_IROM1 0x00000FE0 0x04000000 { ; load address = executionaddress
led_on.o (LED, +First)
;*(InRoot$$Sections)
.ANY (+RO)
}
RW_RAM1 0x30000000 UNINIT 0x04000000 { ; RW data
.ANY (+RW +ZI)
}
}
--------------------------------------------------------------------------------