//Makefile文件
led.bin: led.o
arm-linux-ld -Ttext 0x0 -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin -f
//led.S GPJ0 3 5引脚常亮
#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244
.global _start
_start:
ldr r0, =0x11111111 //所有引脚设置为输出模式对应的16进制数
ldr r1, =GPJ0CON //GPJ0CON 寄存器位置
str r0, [r1] //把r0中的数存到r1指向的地方
ldr r0, =0xd7 //3 5位拉低,其他位拉高
ldr r1, =GPJ0DAT //GPJ0DAT 寄存器位置
str r0, [r1] //把r0中的数存到r1指向的地方
flag:
b flag //死循环 或 b.
//led.S 使用寄存器操作 3 4引脚常亮
#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244
.global _start
_start:
ldr r0, =0x11111111 //所有引脚设置为输出模式对应的16进制数
ldr r1, =GPJ0CON //GPJ0CON 寄存器位置
str r0, [r1] //把r0中的数存到r1指向的地方
ldr r0, =~((1<<3) | (1<<4)) //3 4位拉低,其他位拉高
ldr r1, =GPJ0DAT //GPJ0DAT 寄存器位置
str r0, [r1] //把r0中的数存到r1指向的地方
b. //死循环
//led.S 延时,流水灯效果
#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244
.global _start
_start:
ldr r0, =0x11111111 //所有引脚设置为输出模式对应的16进制数
ldr r1, =GPJ0CON //GPJ0CON 寄存器位置
str r0, [r1] //把r0中的数存到r1指向的地方
ldr r0, =~(1<<3) //3 位拉低,其他位拉高
ldr r1, =GPJ0DAT //GPJ0DAT 寄存器位置
str r0, [r1] //把r0中的数存到r1指向的地方
bl delay
ldr r0, =~(1<<4) // 4位拉低,其他位拉高
ldr r1, =GPJ0DAT //GPJ0DAT 寄存器位置
str r0, [r1] //把r0中的数存到r1指向的地方
bl delay
ldr r0, =~(1<<5) //5位拉低,其他位拉高
ldr r1, =GPJ0DAT //GPJ0DAT 寄存器位置
str r0, [r1] //把r0中的数存到r1指向的地方
bl delay
b _start //死循环
delay:
ldr r2, =9000000
ldr r3, =0x0
delay_loop:
sub r2, r2, #1 //r2 = r2 -r1
cmp r2, r3 //cmp影响Z标志位,如果r2等于r3,则Z=1,下一句中eq就会成立
bne delay_loop //如果Z等于0,则ne成立,该句执行
mov pc, lr //如果Z不等于0,则该句执行