构成:
- Makefile
- Write2sd
- Mkv210_image.c
- start.S
- Makefile(常用情况:编译和链接分开)
编译器:gcc
链接器:ld
$@ $<自动变量
led.bin: start.o
arm-linux-ld -Ttext 0x0(链接地址) -o led.elf(可执行程序) $^
arm-linux-objcopy(制作镜像) -O binary led.elf led.bin
arm-linux-objdump(反汇编) -D led.elf > led_elf.dis
gcc mkv210_image.c -o mkx210
./mkx210 led.bin 210.bin
%.o : %.S -c编译不链接 -o指定名字
arm-linux-gcc -o $@ $< -c
%.o : %.c 编译
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis mkx210 -f
2.write2sd:作用:dd命令将210.bin写入sd卡
#!/bin/sh
sudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1
3.Mkv210_image.c:制作sd卡启动镜像
4.start.S
/**************************
点亮led
- 了解led物理特性
- 查看数据手册及相应寄存器
- GPIO CON控制寄存器:模式,输入输出等
DAT数据寄存器:引脚状态(高低电平)
PUD:控制引脚内部弱上拉或下拉(输入时可能用)
DRV:配置GPIO引脚驱动能力 电流大小
CONPDN:低功耗模式下的xx
PUDPDN:低功耗模式下的xx
**************************/
_start:
//把寄存器定义出来,操作寄存器
ldr r0, = 0x11111111 //arm =看出ldr伪指令
ldr r1, =0xe0200240
str r0, [r1] //寄存器间接寻址r0放至r1的地址
ldr r0, = 0x0
ldr r1, =0xe0200244
str r0, [r1]
flag:
b flag //死循环
/***********复杂的led**************************/
#define GPJ0CON 0xE0200240
#define GPJ0DAT 0xE0200244
//定义寄存器宏
.global _start
_start:
ldr r0, =0x11111111
ldr r1, =GPJ0CON
str r0, [r1]
//写GPIO控制寄存器
flash:
ldr r0, =~(1<<3)
ldr r1, =GPJ0DAT
str r0, [r1]
//写GPIO数据寄存器
bl delay
//延时
ldr r0, =~(1<<4)
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
ldr r0, =~(1<<5)
ldr r1, =GPJ0DAT
str r0, [r1]
bl delay
b flash
//跳到flash循环闪烁
delay: //延时函数
ldr r2, =9000000
ldr r3, =0x0
delay_loop:
sub r2, r2, #1 //相当于r2--
cmp r2, r3 //判断是否相等 如果不等会自动设置标志位
bne delay_loop //不等 继续循环
mov pc, lr //返回连接寄存器加载到pc指针 用来返回
自己写代码过程
- 汇编需要知道的
ldr伪指令 将立即数写进寄存器
str寄存器间接寻址
b 常用于不返回的跳转,比如跳到某个标号处
bl用于子程序跳转(要返回,返回地地存于LR)
Mov将lr地址放入pc 返回程序