嵌入式linux-ARM体系结构及接口技术,安装交叉编译工具链,编写LED灯闪烁的ARM裸机汇编代码,并下载编译好的.bin文件到4412开发板

1,寄存器确认

1.1,查看LED硬件电路

在这里插入图片描述

1.2,查看I/O口

在这里插入图片描述

1.3,查看芯片手册

在这里插入图片描述

在这里插入图片描述

2,代码

	.text 	@代码段

	@设置LED灯的配置寄存器 GPX2CON7为输出状态
	ldr r0,=0x11000c40 	@将GPX2CON寄存器地址写入r0
	ldr r1,[r0] 		@将寄存器中的数据写入r1
	bic r1,#0xf0000000 	@将GPX2CON[7]清零
	orr r1,#0x10000000 	@将GPX2CON[7]设置为输出模式
	str r1,[r0] 		@设置GPX2CON寄存器

	@设置LED灯输出高、低电平 GPX2DATA[7]
	ldr r0,=0x11000c44
loop:

	ldr r1,[r0]
	tst r1,#0x80
	orreq r1,#0x80
	bicne r1,#0x80
	str r1,[r0]
	bl delay1s

	b loop

delay1s:     
     ldr 	r4,=0x1ffffff  
delay1s_loop:     
	 cmp   	r4,#0   
	 beq delay1s_end
     sub    r4,r4,#1
	 b    delay1s_loop    
delay1s_end:
	mov pc,lr

    .end

3,编译环境搭建

3.1,安装交叉编译工具

  1. 拷贝交叉编译工具链gcc-4.6.4.tar.xz到linux下
  2. tar -vxf gcc-4.6.4.tar.xz解压后得到gcc-4.6.4

在这里插入图片描述

  1. 在bin目录下可以看到交叉编译工具arm-none-linux-gnueabi-gcc

在这里插入图片描述

在这里插入图片描述

3.2,添加环境变量

在这里插入图片描述

  1. 可以看到,编译必须使用全路径 ~/gcc-4.6.4/bin/arm-none-linux-gnueabi-gcc
  2. 为了不每次编译都使用全路径,可以将工具路径添加到环境变量中

在这里插入图片描述

在这里插入图片描述

  1. 如果想要改配置永久生效,可以在启动脚本中添加该指令
linux@linux:~/gcc-4.6.4/bin$ vi ~/.bashrc 

在这里插入图片描述

  1. 更新脚本:
linux@linux:~$ source ~/.bashrc 

4,编译

4.1,makefile文件

CROSS = arm-none-linux-gnueabi-
CC=$(CROSS)gcc
LD=$(CROSS)ld
OBJCOPY=$(CROSS)objcopy 	#用来转化文件格式(把Linux文件格式进行转化)
    
all : led.s
	$(CC) -g -c -o led.o led.s  	#-c表示编译进行到汇编阶段完成后停止,此时已经生成了目标文件(.o)(下一阶段是链接)
	$(LD) led.o -Ttext 0x40001000 -o led.elf 	#-Ttext表示指定链接地址(程序中第一条指令存放的地址)(.elf文件用于Linux中在gdb下调试)
	$(OBJCOPY)  -O binary -S led.elf led.bin 	#(.elf文件中包含调试信息,通过objcopy,去掉调试信息)
	$(CROSS)objdump -D led.elf > led.dis 		#反汇编,通过执行文件反向得到汇编程序
	 
clea:
	 rm -f *.o *.elf *.bin *.dis

4.2,编译

linux@linux:~/ARM_4412/led$ ls
led.s  Makefile
linux@linux:~/ARM_4412/led$ make
arm-none-linux-gnueabi-gcc -g -c -o led.o led.s  
arm-none-linux-gnueabi-ld led.o -Ttext 0x40001000 -o led.elf
arm-none-linux-gnueabi-ld: warning: cannot find entry symbol _start; defaulting to 40001000
arm-none-linux-gnueabi-objcopy  -O binary -S led.elf led.bin
arm-none-linux-gnueabi-objdump -D led.elf > led.dis
linux@linux:~/ARM_4412/led$ ls
led.bin  led.dis  led.elf  led.o  led.s  Makefile

5,下载

  1. 将编译好的.bin文件拷贝纸Windows
linux@linux:~/ARM_4412/led$ cp led.bin /mnt/hgfs/Linuxsharexiaomei/
  1. 在超级终端输入指令
loadb 40001000

在这里插入图片描述

  1. 传输文件

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 输入go 40001000指令,执行程序

在这里插入图片描述

5.查看开发板运行状态

6,例

流水灯

	.text 	@代码段
	b reset 						@0x00reset
	ldr pc,_undefine_instruction 	@0x04 undefine instruction
	ldr pc,_software_interrupt 		@0x08software interrupt
	ldr pc,_prefetch_abort 			@0x0cprefetch abort
	ldr pc,_data_abort  			@0x10data abort
	ldr pc,_not_use      			@0x14(reserved)
	ldr pc,_irq 					@0x18irq
	ldr pc,_fiq 					@0x08software1cfiq

_undefine_instruction:
	.word _undefine_instruction
_software_interrupt:
	.word 	_software_interrupt
_prefetch_abort:
	.word _prefetch_abort
_data_abort:
	.word _data_abort
_not_use:
	.word _not_use
_irq:
	.word _irq
_fiq:
	.word _fiq



reset:
	@设置LED2灯的配置寄存器 GPX2CON7为输出状态
	ldr r0,=0x11000c40 	@将GPX2CON寄存器地址写入r0
	ldr r1,[r0] 		@将寄存器中的数据写入r1
	bic r1,#0xf0000000 	@将GPX2CON[7]清零
	orr r1,#0x10000000 	@将GPX2CON[7]设置为输出模式
	str r1,[r0] 		@设置GPX2CON寄存器

	@设置LED3灯的配置寄存器 GPX1CON0为输出状态
	ldr r0,=0x11000c20 	
	ldr r1,[r0] 		
	bic r1,#0x0000000f 	
	orr r1,#0x00000001 	
	str r1,[r0] 		
	
	@设置LED4灯的配置寄存器 GPF3CON4为输出状态
	ldr r0,=0x114001E0 	
	ldr r1,[r0] 		
	bic r1,#0x000f0000 	
	orr r1,#0x00010000 	
	str r1,[r0] 	
	
	@设置LED5灯的配置寄存器 GPF3CON5为输出状态
	ldr r0,=0x114001E0 	
	ldr r1,[r0] 		
	bic r1,#0x00f00000 	
	orr r1,#0x00100000 	
	str r1,[r0] 	
reset_end:


main:

loop:

	bl led2_u
	bl led3_d
	bl led4_d
	bl led5_d
	bl delay1s

	bl led2_d
	bl led3_u
	bl led4_d
	bl led5_d
	bl delay1s

	bl led2_d
	bl led3_d
	bl led4_u
	bl led5_d
	bl delay1s

	bl led2_d
	bl led3_d
	bl led4_d
	bl led5_u
	bl delay1s

	b loop

main_end:

led2_u:
	@设置LED2灯输出高电平 GPX2DATA[7]
	ldr r0,=0x11000c44
	ldr r1,[r0]
	orr r1,#0x80
	str r1,[r0]
led2_u_end:
	mov pc,lr

led2_d:
	@设置LED2灯输出低电平 GPX2DATA[7]
	ldr r0,=0x11000c44
	ldr r1,[r0]
	bic r1,#0x80
	str r1,[r0]
led2_d_end:
	mov pc,lr

led3_u:
	@设置LED3灯输出高电平 GPX1DATA[0]
	ldr r0,=0x11000c24
	ldr r1,[r0]
	orr r1,#0x01
	str r1,[r0]
led3_u_end:
	mov pc,lr

led3_d:
	@设置LED2灯输出低电平 GPX1DATA[0]
	ldr r0,=0x11000c24
	ldr r1,[r0]
	bic r1,#0x01
	str r1,[r0]
led3_d_end:
	mov pc,lr

led4_u:
	@设置LED4灯输出高电平 GPF3DATA[4]
	ldr r0,=0x114001E4
	ldr r1,[r0]
	orr r1,#0x10
	str r1,[r0]
led4_u_end:
	mov pc,lr

led4_d:
	@设置LED4灯输出低电平 GPF3DATA[4]
	ldr r0,=0x114001E4
	ldr r1,[r0]
	bic r1,#0x10
	str r1,[r0]
led4_d_end:
	mov pc,lr

led5_u:
	@设置LED5灯输出高电平 GPF3DATA[4]
	ldr r0,=0x114001E4
	ldr r1,[r0]
	orr r1,#0x20
	str r1,[r0]
led5_u_end:
	mov pc,lr

led5_d:
	@设置LED5灯输出低电平 GPF3DATA[4]
	ldr r0,=0x114001E4
	ldr r1,[r0]
	bic r1,#0x20
	str r1,[r0]
led5_d_end:
	mov pc,lr

delay1s:     
     ldr 	r4,=0x2ffffff  
delay1s_loop:     
	 cmp   	r4,#0   
	 beq delay1s_end
     sub    r4,r4,#1
	 b    delay1s_loop    
delay1s_end:
	mov pc,lr
	
    .end
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值