第二期: 第四节, 裸机编程 LED 汇编代码。
1 首先是 关于汇编代码的解释。
来看看原理图:
再来看看 GPL2_0 的寄存器地址。
来看看代码:
.globl _start
.arm
_start:
// 这是 GPL2_0 的 CON 寄存器的地址。
LDR R0,=0x11000100
LDR R1,[R0]
//首先是清零,最后4位
BIC R1,R1,#0x0000000f
//然后是将 最后4位设置成 1 , 也就是 输出模式。
ORR R1,R1,#0x00000001
//然后写回。
STR R1,[R0]
loop:
//这是 GPL_0 的data寄存器的地址。
LDR R0,=0x11000004
LDR R1,[R0]
//首先是 将 第一位 置一, 也就是输出高电平
ORR R1,R1,#0x1
STR R1,[R0]
//然后跳到 延时函数。
BL delay
//接下来就是 将最后 一位置0 也就是 输出低电平。
//这是在实现闪烁功能。
LDR R1,[R0]
BIC R1,R1,#0x1
STR R1,[R0]
BL delay
// 然后是循环的闪烁
B loop
delay:
LDR R2,=0xfffffff
loop1:
// 这是一个延时函数, 就是从 fffff 不断向下减1, 直到减到0 为止。
SUB R2,R2,#0x1
CMP R2,#0x0
BNE loop1
MOV PC,LR
.end
2 然后是关于 关于 makefile 的编写。
TARGET=led
all:
arm-none-linux-gnueabi-gcc -O0 -g -c -o $(TARGET).o $(TARGET).s
arm-none-linux-gnueabi-ld $(TARGET).o -Ttext 0x40008000 -N -o $(TARGET).elf
arm-none-linux-gnueabi-objcopy -O binary -S $(TARGET).elf $(TARGET).bin
clean:
rm -rf *.o *.elf *.dis *.bin
3 然后就是 编译+烧写+测试。
烧写 ,编译, 程序在板子上的运行都是正常的。