开发环境OPENJTAG+2440+ECLIPSE
GPxCON每两个位控制一个一个引脚:00输入,01输出,10特殊功能
初始化三个寄存器:rGPxCON,rGPxUP,rGPxDAT
crt0.S
@******************************************************************************
@ File:crt0.S
@ 功能:LED点灯程序,点亮LED1
@******************************************************************************
.text
.global _start
_start:
LDR R0,=0x56000050 @ R0设为GPfCON寄存器。此寄存器
@ 用于选择端口B各引脚的功能:
@ 是输出、是输入、还是其他
MOV R1,#0x00000400
STR R1,[R0] @ 设置GPf5为输出口, 位[10:9]=0b01
LDR R0,=0x56000054 @ R0设为GPfDAT寄存器。此寄存器
@ 用于读/写端口f各引脚的数据
MOV R1,#0x00000000 @ 此值改为0x00000020,
@ 可让LED1熄灭
STR R1,[R0] @ GPB5输出0,LED1点亮
MAIN_LOOP:
B MAIN_LOOP
Makefile
CC = arm-elf-gcc
LD = arm-elf-ld
AR = arm-elf-ar
OBJCOPY = arm-elf-objcopy
OBJDUMP = arm-elf-objdump
CFLAGS := -Wall -O2
CPPFLAGS := -nostdinc
objs := crt0.o @汇编后的文件添加到此处
all:led.bin
led.bin: $(objs)
${LD} -Tled.lds -Ttext 0x00000000 -o led_elf $^
${OBJCOPY} -O binary -S led_elf $@
${OBJDUMP} -D -m arm led_elf > led.dis
%.o:%.c
${CC} -g -c -o $@ $<
%.o:%.S
${CC} -g -c -o $@ $<
clean:
make clean -C lib
rm -f led.bin led_elf led.dis *.o
led.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. =0x00000000; @运行地址内部4Kram
. = ALIGN(4);
.text :
{
crt0.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
_end = .;
}
如果想要在eclipse下进行仿真调试还需要一个init文件用于初始化内存时钟等
将crt0.s Makefile 和led.lds三个文件放到Linux下即可编译,注意编译前讲Makefile中的elf改为GCC