点亮LED(汇编版)

led点灯汇编程序

在点亮LED前,我们应该先确定硬件资源的实际情况,包括所需的引脚和相关寄存器设置。

下图是开发板LED相关的原理图。节选自002_JZ2440资料光盘_20180516(免费)/资料光盘/B盘/原理图sch/JZ2440_V2电路图.pdf

attachments-2020-04-UyLGmG6U5e9fc6756aaa5.png

LED原理图

attachments-2020-04-ofTgr23V5e9fc69593c42.png

LED引脚使用

从上面两个图中可以看出,开发板上的LED为低电平导通,并使用了GPF4,GPF5,GPF6三个引脚。

下面查找与GPFx配置相关的寄存器。节选自002_JZ2440资料光盘_20180516(免费)/资料光盘/B盘/芯片手册/芯片手册/CPU三星S3C2440A芯片手册.pdf

attachments-2020-04-SyLKjbYD5e9fcd802fc8c.png

GPFx相关寄存器地址

attachments-2020-04-xkCXfpMv5e9fce3e41101.png

GPFx控制寄存器

attachments-2020-04-X4ciP1h95e9fceba65324.png

GPFx数据寄存器

点亮LED所需的操作即为配置相关寄存器。具体配置如下:

点亮第一个LED的操作为:设置GPFCON[9:8]=0b01,设置GPFDAT[4]=0。

点亮第二个LED的操作为:设置GPFCON[11:10]=0b01,设置GPFDAT[5]=0。

点亮第三个LED的操作为:设置GPFCON[13:12]=0b01,设置GPFDAT[6]=0。

led_on.S代码如下:

.text
.global _start

_start:

/* 配置GPF4为输出引脚
 * 把0x100写到地址0x56000050(GPFCON地址)
 */
	ldr r1, =0x56000050
        //点亮第一个LED
	ldr r0, =0x100	/* mov r0, #0x100 */  
        //点亮第二个
        //ldr r0, =0x400
        //点亮第三个
        //ldr r0, =0x1000
	str r0, [r1]


/* 设置GPF4输出高电平 
 * 把0写到地址0x56000054(GPFDAT地址)
 */
	ldr r1, =0x56000054
	ldr r0, =0	/* mov r0, #0 */
	str r0, [r1]

	/* 死循环 */
halt:
	b halt

说明:

.text

.text段保存代码,是只读和可执行的,后面那些指令都属于.text段。

.global _start

_start是一个符号(Symbol),符号在汇编程序中代表一个地址,可以用在指令中,汇编程序经过汇编器的处理之后,所有的符号都被替换成它所代表的地址值。

.global告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号。

_start就像C程序的main函数一样特殊,是整个程序的入口,链接器在链接时会查找目标文件中的_start符号代表的地址,把它设置为整个程序的入口地址,所以每个汇编程序都要提供一个_start符号并且用.globl声明。

ldr指令

ldr指令把数据从内存加载到寄存器。

str指令

str指令把数据从寄存器保存到内存。

Makefile文件如下:

all:
	arm-linux-gcc -c -o led_on.o led_on.S
	arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
	arm-linux-objcopy -O binary -S led_on.elf led_on.bin
	arm-linux-objdump -D led_on.elf > led_on.dis
clean:
	rm *.bin *.o *.elf

说明:

注意在Makefile编写过程中,注意书写格式。

arm-linux-gcc:编译命令

arm-linux-ld:链接命令

arm-linux-objcopy:复制生成命令

arm-linux-objdump:反编译命令

arm-linux-gcc/ld/objcopy/objdump命令由于arm-linux-gnueabi-gcc的版本不同,造成Makefile文件报错,该问题可以通过建立软链接方式解决。命令如下:

cora@cora-pc:~$ sudo ln -s arm-linux-gnueabi-gcc arm-linux-gcc
cora@cora-pc:~$ sudo ln -s arm-linux-gnueabi-ld arm-linux-ld
cora@cora-pc:~$ sudo ln -s arm-linux-gnueabi-objcopy arm-linux-objcopy
cora@cora-pc:~$ sudo ln -s arm-linux-gnueabi-objdump arm-linux-objdump

注意:编译器应选用arm-linux-gnueabi-gcc,使用其他的编译器可能导致开发板无法运行。

编译器的差异可参考https://www.jianshu.com/p/fd0103d59d8e

0 条评论&回复

请先 登录 后评论
Corason
Corason

4 篇文章

作家榜 »

  1. 百问网-周老师 18 文章
  2. st_ashang 14 文章
  3. 渐进 12 文章
  4. zxq 11 文章
  5. helloworld 8 文章
  6. 谢工 5 文章
  7. Litchi_Zheng 5 文章
  8. DebugArm 5 文章