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.开发板附带相关说明手册
下一篇: 2440的UART初始化