最终目标: 点亮led灯
1:通过原理图,确定nLED_1的引脚关系 ---- GPF4
2:查看S3C2440手册,找到控制GPF4引脚的方法 ---- GPFCON(配置寄存器) ---- GPFDAT(数据寄存器)
3:往GPFCON和GPFDAT这两个寄存器写数据,实现点亮led灯
寄存器相关截图:
所以,需要点亮nLED_1,我们要通过GPFCON寄存器设置GPF4引脚作为输出引脚,通过GPFDAT寄存器设置0或1开控制LED灯的亮灭。
更直白点是,往0x56000050(GPFCON)、0x56000054(GPFDAT) 写入数据
汇编代码:
@******************************************************************************
@ File:led_on.S
@ 功能:LED点灯程序,点亮LED1
@******************************************************************************
.text
.global _start
_start:
LDR R0,=0x56000050 @ R0设为GPFCON寄存器。此寄存器
@ 用于选择端口B各引脚的功能:
@ 是输出、是输入、还是其他
MOV R1,#0x00000100
STR R1,[R0] @ 设置GPF4为输出口
LDR R0,=0x56000054 @ R0设为GPBDAT寄存器。此寄存器
@ 用于读/写端口B各引脚的数据
MOV R1,#0x00000000 @ 此值改为0x00000010,
@ 可让LED1熄灭
STR R1,[R0] @ GPF4输出0,LED1点亮
MAIN_LOOP:
B MAIN_LOOP
分析:
1. LDR指令
LDR 伪指令用于加载立即数或一个地址值到指定寄存器
LDR R0,=0x56000050 @加载地址0x56000050到R0寄存器 ----- GPFCON寄存器
2.MOV指令
MOV R1,#0x00000100 @把十六进制数 0x00000100 赋值给R1寄存器
这里的0x00000100 === 配置GPF4为输出,需要对GPFCON寄存器的[9:8]进行赋值,也就是 0000000100000000b 转换成十六进制 0x00000100
3.STR指令
STR R1,[R0] @向R0寄存器写入R1寄存器的数据 即: CPFCON ===> 0x00000100 设置GPF4为输出引脚
后面的 0x56000054 的操作一样的原理
Makefile文件
---------------------------------------------------------------------
led_on.bin : led_on.S
arm-linux-gcc -g -c -o led_on.o led_on.S #编译 led_on.S
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf #连接成elf可执行程序, -Ttext 0x00000000 定义代码段开始地址(0地址)
arm-linux-objcopy -O binary -S led_on_elf led_on.bin #转换elf文件为bin文件(方便烧写)
clean:
rm -f led_on.bin led_on_elf *.o
--------------------------------------------------------------------
烧写 --- 上电
nLED_1 成功点亮啦~!