1,寄存器确认
1.1,查看LED硬件电路
1.2,查看I/O口
1.3,查看芯片手册
2,代码
.text @代码段
@设置LED灯的配置寄存器 GPX2CON7为输出状态
ldr r0,=0x11000c40 @将GPX2CON寄存器地址写入r0
ldr r1,[r0] @将寄存器中的数据写入r1
bic r1,#0xf0000000 @将GPX2CON[7]清零
orr r1,#0x10000000 @将GPX2CON[7]设置为输出模式
str r1,[r0] @设置GPX2CON寄存器
@设置LED灯输出高、低电平 GPX2DATA[7]
ldr r0,=0x11000c44
loop:
ldr r1,[r0]
tst r1,#0x80
orreq r1,#0x80
bicne r1,#0x80
str r1,[r0]
bl delay1s
b loop
delay1s:
ldr r4,=0x1ffffff
delay1s_loop:
cmp r4,#0
beq delay1s_end
sub r4,r4,#1
b delay1s_loop
delay1s_end:
mov pc,lr
.end
3,编译环境搭建
3.1,安装交叉编译工具
3.2,添加环境变量
linux@linux:~/gcc-4.6.4/bin$ vi ~/.bashrc
linux@linux:~$ source ~/.bashrc
4,编译
4.1,makefile文件
CROSS = arm-none-linux-gnueabi-
CC=$(CROSS)gcc
LD=$(CROSS)ld
OBJCOPY=$(CROSS)objcopy #用来转化文件格式(把Linux文件格式进行转化)
all : led.s
$(CC) -g -c -o led.o led.s #-c表示编译进行到汇编阶段完成后停止,此时已经生成了目标文件(.o)(下一阶段是链接)
$(LD) led.o -Ttext 0x40001000 -o led.elf #-Ttext表示指定链接地址(程序中第一条指令存放的地址)(.elf文件用于Linux中在gdb下调试)
$(OBJCOPY) -O binary -S led.elf led.bin #(.elf文件中包含调试信息,通过objcopy,去掉调试信息)
$(CROSS)objdump -D led.elf > led.dis #反汇编,通过执行文件反向得到汇编程序
clea:
rm -f *.o *.elf *.bin *.dis
4.2,编译
linux@linux:~/ARM_4412/led$ ls
led.s Makefile
linux@linux:~/ARM_4412/led$ make
arm-none-linux-gnueabi-gcc -g -c -o led.o led.s
arm-none-linux-gnueabi-ld led.o -Ttext 0x40001000 -o led.elf
arm-none-linux-gnueabi-ld: warning: cannot find entry symbol _start; defaulting to 40001000
arm-none-linux-gnueabi-objcopy -O binary -S led.elf led.bin
arm-none-linux-gnueabi-objdump -D led.elf > led.dis
linux@linux:~/ARM_4412/led$ ls
led.bin led.dis led.elf led.o led.s Makefile
5,下载
linux@linux:~/ARM_4412/led$ cp led.bin /mnt/hgfs/Linuxsharexiaomei/
loadb 40001000
go 40001000
指令,执行程序5.查看开发板运行状态
6,例
流水灯
.text @代码段
b reset @0x00reset
ldr pc,_undefine_instruction @0x04 undefine instruction
ldr pc,_software_interrupt @0x08software interrupt
ldr pc,_prefetch_abort @0x0cprefetch abort
ldr pc,_data_abort @0x10data abort
ldr pc,_not_use @0x14(reserved)
ldr pc,_irq @0x18irq
ldr pc,_fiq @0x08software1cfiq
_undefine_instruction:
.word _undefine_instruction
_software_interrupt:
.word _software_interrupt
_prefetch_abort:
.word _prefetch_abort
_data_abort:
.word _data_abort
_not_use:
.word _not_use
_irq:
.word _irq
_fiq:
.word _fiq
reset:
@设置LED2灯的配置寄存器 GPX2CON7为输出状态
ldr r0,=0x11000c40 @将GPX2CON寄存器地址写入r0
ldr r1,[r0] @将寄存器中的数据写入r1
bic r1,#0xf0000000 @将GPX2CON[7]清零
orr r1,#0x10000000 @将GPX2CON[7]设置为输出模式
str r1,[r0] @设置GPX2CON寄存器
@设置LED3灯的配置寄存器 GPX1CON0为输出状态
ldr r0,=0x11000c20
ldr r1,[r0]
bic r1,#0x0000000f
orr r1,#0x00000001
str r1,[r0]
@设置LED4灯的配置寄存器 GPF3CON4为输出状态
ldr r0,=0x114001E0
ldr r1,[r0]
bic r1,#0x000f0000
orr r1,#0x00010000
str r1,[r0]
@设置LED5灯的配置寄存器 GPF3CON5为输出状态
ldr r0,=0x114001E0
ldr r1,[r0]
bic r1,#0x00f00000
orr r1,#0x00100000
str r1,[r0]
reset_end:
main:
loop:
bl led2_u
bl led3_d
bl led4_d
bl led5_d
bl delay1s
bl led2_d
bl led3_u
bl led4_d
bl led5_d
bl delay1s
bl led2_d
bl led3_d
bl led4_u
bl led5_d
bl delay1s
bl led2_d
bl led3_d
bl led4_d
bl led5_u
bl delay1s
b loop
main_end:
led2_u:
@设置LED2灯输出高电平 GPX2DATA[7]
ldr r0,=0x11000c44
ldr r1,[r0]
orr r1,#0x80
str r1,[r0]
led2_u_end:
mov pc,lr
led2_d:
@设置LED2灯输出低电平 GPX2DATA[7]
ldr r0,=0x11000c44
ldr r1,[r0]
bic r1,#0x80
str r1,[r0]
led2_d_end:
mov pc,lr
led3_u:
@设置LED3灯输出高电平 GPX1DATA[0]
ldr r0,=0x11000c24
ldr r1,[r0]
orr r1,#0x01
str r1,[r0]
led3_u_end:
mov pc,lr
led3_d:
@设置LED2灯输出低电平 GPX1DATA[0]
ldr r0,=0x11000c24
ldr r1,[r0]
bic r1,#0x01
str r1,[r0]
led3_d_end:
mov pc,lr
led4_u:
@设置LED4灯输出高电平 GPF3DATA[4]
ldr r0,=0x114001E4
ldr r1,[r0]
orr r1,#0x10
str r1,[r0]
led4_u_end:
mov pc,lr
led4_d:
@设置LED4灯输出低电平 GPF3DATA[4]
ldr r0,=0x114001E4
ldr r1,[r0]
bic r1,#0x10
str r1,[r0]
led4_d_end:
mov pc,lr
led5_u:
@设置LED5灯输出高电平 GPF3DATA[4]
ldr r0,=0x114001E4
ldr r1,[r0]
orr r1,#0x20
str r1,[r0]
led5_u_end:
mov pc,lr
led5_d:
@设置LED5灯输出低电平 GPF3DATA[4]
ldr r0,=0x114001E4
ldr r1,[r0]
bic r1,#0x20
str r1,[r0]
led5_d_end:
mov pc,lr
delay1s:
ldr r4,=0x2ffffff
delay1s_loop:
cmp r4,#0
beq delay1s_end
sub r4,r4,#1
b delay1s_loop
delay1s_end:
mov pc,lr
.end