嵌入式Linux开发入门,通过汇编语言点亮FS4412上的LED小灯
LED实验步骤
- 通过电路原理图分析LED的控制逻辑
- 通过电路原理图查找LED和4412的链接关系
- 通过数据手册分析GPIO中哪些寄存器可以控制LED
- 通过程序去操控对应的寄存器完成对LED的控制
分析控制关系
因为发光二极管LED2右侧为高点平,所以当LED2左侧为低电平的时候,电路导通,LED2将会被点亮
当三极管在基集得到一个高点平,三极管才会导通,LED2左侧将接地
所以GPX2_7给高点平,LED2就会亮,给低电平,LED2就会灭
连接关系
连接关系主要是FS4412的底板和核心板的连接关系,在此块开发板中:
LED2: GPX2_7
LED3: GPX1_0
LED4: GPF3_4
LED5: GPF3_5
寄存器分析
GPX2CON
- 其地址为0x11000C40:
- 主要是控制引脚的输入或输出状态
- GPX2CON可以控制8个IO口,LED2是由GPX2_7控制的,所以我们只要设置GPX2CON[7]即可
GPX2DAT
- 其地址为0x110000C44
- GPX2DAT低8位有效,每1个bit控制一个端口输出电平的高低,该位置1,则输出高电平,置0,则输出低电平
代码实现
@ 汇编版本:
.text
_start:
MAIN:
BL LED_CONFIG
LOOP:
BL LED_ON
BL DELAY
BL LED_OFF
BL DELAY
B LOOP
LED_CONFIG: @ 寄存器配置
LDR R2, =0x11000C40 @ GPX2CON寄存器地址
LDR R1, =0x10000000 @ 寄存器待写入的值
STR R1, [R2]
MOV PC, LR @ 返回MAIN
LED_OFF: @ 寄存器设置数值:关闭LED
LDR R2, =0x11000C44 @ GPX2DAT寄存器地址
LDR R1, =0x00000000
STR R1, [R2]
MOV PC, LR
LED_ON: @ 寄存器设置数值: 开启LED
LDR R2, =0x11000C44 @ GPX2DAT寄存器地址
LDR R1, =0x00000080
STR R1, [R2]
MOV PC, LR
DELAY: @延时函数
LDR R1, =100000000
L:
SUB R1, R1, #1
CMP R1, #0
BNE L
MOV PC, LR
STOP:
B STOP
.end
# Makefile
TARGET = led
CROSS_COMPILE = arm-linux-gnueabihf-
CC = $(CROSS_COMPILE)gcc # 编译器编译
LD = $(CROSS_COMPILE)ld # 编译器链接
OBJCOPY = $(CROSS_COMPILE)objcopy
all:
$(CC) -c $(TARGET).s -o $(TARGET).o
$(LD) $(TARGET).o -Ttext 0x40008000 -o $(TARGET).elf
$(OBJCOPY) -O binary -S $(TARGET).elf $(TARGET).bin
.PHONY:
clear:
rm $(TARGET).o $(TARGET).elf $(TARGET).bin