JZ2440裸机实验-点亮LED

实验环境:

1.JZ2440  V3开发板

2.在UBUNTU 9.1下编译链接

下载方式:采用UBOOT+DNW的下载方式,默认已经装好了UBOOT和DNW的相关驱动等


一、准备工作

查阅JZ2440  V3的原理图,可以看到LED1、2、3分别连接到GPF4、5、6,并且低电平点亮LED


查阅2440的芯片手册,可以看到,只需要控制GPFCON和GPFDAT寄存器来控制IO为输出模式,并且输出低电平即可



二、程序编写

1.源文件(led_on.S)的编写

.global _start
_start:
	// 第一步:把0x1500写入0x56000050(GPFCON)位置
	ldr r0, =0x1500  			// 从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断这个数
	ldr r1, =0x56000050			// 是合法立即数还是非法立即数。一般写代码都用ldr伪指令
	str r0, [r1]				// 寄存器间接寻址。功能是把r0中的数写入到r1中的数为地址的内存中去

	// 第二步:把0x0写入0x56000054(GPFDAT)位置
	ldr r0, =0x0
	ldr r1, =0x56000054
	str r0, [r1]				// 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮

flag:							// 这两行写了一个死循环。因为裸机程序是直接在CPU上运行的,CPU会
	b flag						// 逐行运行裸机程序直到CPU断电关机。如果我们的程序所有的代码都
								// 执行完了CPU就会跑飞(跑飞以后是未定义的,所以千万不能让CPU
								// 跑飞),不让CPU跑飞的办法就是在我们整个程序执行完后添加死循环

NOTE:

在汇编中,. 表示当前地址,所以上面的死循环部分可以直接写成  b.

2.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
clean:
	rm *.bin *.o *.elf 

三、编译、链接、下载

1.在LINUX环境下,编译链接得到led_on.bin文件


2.开发板上电,按空格键终止UBOOT启动内核,进入菜单,按D键,将程序下载到SDRAM中,同时启动DNW下载工具,将BIN文件传输给开发板,完成程序的烧写


可以看到已经点亮了三颗LED

四、扩展

实现LED的闪烁

#define GPFCON	0x56000050
#define GPFDAT	0x56000054
 
.global _start
_start:
	// 第一步:LED引脚设置为输出模式
	ldr r0, =0x1500  
	ldr r1, =GPFCON			
	str r0, [r1]				

flash:
	// 全部点亮
	ldr r0, =0x0
	ldr r1, =GPFDAT
	str r0, [r1]				// 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮

	// 延时
	bl delay					// 使用bl进行函数调用
	// 全部熄灭
	ldr r0, =((1<<4) | (1<<5) | (1<<6))
	ldr r1, =GPFDAT
	str r0, [r1]				// 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮	
	
	// 第五步:延时
	bl delay
	
	b flash
	
	
	
// 延时函数:函数名:delay
delay:
	ldr r2, =9000000    //通过设置设个可以更改延时时间
	ldr r3, =0x0
delay_loop:	
	sub r2, r2, #1				//r2 = r2 -1
	cmp r2, r3					// cmp会影响Z标志位,如果r2等于r3则Z=1,下一句中eq就会成立
	bne delay_loop
	mov pc, lr					// 函数调用返回

延时函数解释:

1、延时函数原理

在汇编中实现延时的方法:用一些没有目的的代码来执行消耗时间,达到延时的效果。

2、汇编编写延时函数

汇编编写延时函数的原理,用一个寄存器存放一个数字,然后在循环中每个循环里给数字减1,然后再判断这个数字的值是否为0.如果为0则停止循环,如果不为0则继续循环。

3、汇编编写及调用函数的方式

汇编中整个汇编的主程序是一个死循环,这个死循环是我们汇编程序的主体,类似于C中的main函数。其他函数必须写在这个主死循环程序的后面(死循环外),不然会出错。

汇编编写delay延时函数时,要注意函数的初始化和函数体的位置,不能把初始化写在了循环体内。

汇编中调用函数用bl指令,子函数中最后用mov pc, lr来返回。



参考文献:1.朱老师课件

                2.开发板附带相关说明手册

猜你喜欢

转载自blog.csdn.net/wwwlyj123321/article/details/80839547