欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JZ2440裸机实验-点亮LED

程序员文章站 2022-03-13 17:25:06
...

实验环境:

1.JZ2440  V3开发板

2.在UBUNTU 9.1下编译链接

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


一、准备工作

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

JZ2440裸机实验-点亮LEDJZ2440裸机实验-点亮LED

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

JZ2440裸机实验-点亮LED


二、程序编写

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文件

JZ2440裸机实验-点亮LED

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

JZ2440裸机实验-点亮LED

可以看到已经点亮了三颗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.开发板附带相关说明手册

相关标签: ARM