JZ2440点亮一个LED灯

和"hello world"在应用程序中的地位一样,在裸机程序中,点亮一个LED的程序也同样重要,这是打开我们学习裸机编程的一个大门,现在就介绍一下我的第一个裸机程序。
实验所使用的开发板为三星的JZ2440开发板,编写程序之前,需要进行第一步查看原理图

  1. 查看开发板原理图
    在这里插入图片描述
    上面是LED在开发板上的原理图,从图上我们可以看到三个LED灯,它们的接法都是一样的,首先LED的一侧接入的是3.3V,学过物理的我们应该知道,只要给LED的另一端一个低电平,LED就可以亮起来,然后对网络标号"n_LED_1"进行查找,通过追踪我们找到了LED_1在CPU上接入的引脚是GPF4,如下图所示
    在这里插入图片描述
  2. 查看开发板CPU的数据手册,找到操作GPF4的引脚,我们需要将GPF4设置为输出模式,并且配置它输出为低电平
    在这里插入图片描述
    在这里插入图片描述
  3. 编写程序
    和我们之前所写的程序有点不一样,在裸机上它的第一个程序是一个汇编程序,所以在这里建立一个汇编文件
.text					/* 代码段 */
.global _start			/* 全局标号 */
_start:
/* 配置GPF4输出 */
ldr r0, =0x56000050	/* GPFCON的基地址 */
ldr r1, =0x100			/* 配置输出模式 */
str r1, [r0]			

/* 输出低电平 */
ldr r0, =0x56000054	/* GPFDAT基地址 */
ldr r1, =0x0			/* 输出低电平 */
str r1, [r0]			

halt:
b halt				/* 死循环 *

对于上面程序的几点说明,这是一个最简单的汇编点亮LED的程序,可以实现我们的目标

ldr 目的寄存器,源寄存器: 将源存储器地址里的值保存到目的寄存器中(load)
上面的使用的ldr是一个伪指令,它虽然和真正的汇编指令ldr名字一样,但是它们的用法却是不相同的,
在伪指令中,在地址的前面加入一个"=",伪指令实际上被翻译成了真正的汇编指令
str 源寄存器,目的寄存器:将源寄存器地址中的值写到目的寄存器中(store)
b 标号:跳转指令
代码的结尾是一个死循环,避免程序运行到我们不能预料的地方

还要建立一个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 *.o *.bin *.elf

将生成的led_on.bin文件烧写进开发板中,启动就可以看见led1被成功点亮
`

发布了33 篇原创文章 · 获赞 2 · 访问量 1037

猜你喜欢

转载自blog.csdn.net/weixin_41791581/article/details/101234119
今日推荐