第三课jz2440裸板开发之点亮led灯

前言:jz2440原理图及芯片手册下载地址

一、原理图及芯片手册分析

1.1 原理图部分

我们这里打算点亮LED灯,所以先查看了原理图,找到LED部分:
在这里插入图片描述
在这里插入图片描述
从原理图中可以看到,led灯一边接着一个3.3V的电源,另一边接着GPIO口,如下所示:
LED1对应GPF4
LED2对应GPF5
LED4对应GPF6
所以我们响点亮led灯,就需要设置GPF4、GPF5、GPF6这三个引脚为输出模式,当输出高电平的时候,三极管不同,灯灭,当输出低电平的时候,三极管导通,灯亮。

1.2 芯片手册部分

这里我们打开S3C2440芯片手册,找到第9章IO PORTS,找到GPFCON寄存器,如下:
在这里插入图片描述

二、代码编写

2.1.源文件编写

创建一个start.S文件,进行代码编写:

.text
.global _start

_start:
/*设置GPF4 GPF5 GPF6 GPF7为输出*/
ldr r1, =0x56000050
ldr r0,=0x1500
str r0, [r1]

/*设置 GPF4 GPF5 GPF6 GPF7为低电平*/
ldr r1, =0x56000054
ldr r0, =0x0
str r0, [r1]

/*死循环*/
halt:
	b halt

2.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
	arm-linux-objdump -D led_on.elf > led_on.dis
clean:
	rm *.bin *.o *.elf

到此一个简单的LED点亮程序就完成了。如果想进行跟多的LED测试,可以自行编写复杂一点的测试程序,但是原理就是这样了。

三、使用C语言编写代码

3.1源码

第二部分我们用汇编编写了这点灯的程序,这里我们再用C语言编写一次:
创建两个文件start.S及led.c文件。
start.S内容:

.text
.global _start

_start:

	/*调用c函数之前要设置栈 设置内存: sp 栈 */
	ldr sp, =4096  /* nand启动 */
//	ldr sp, =0x40000000+4096  /* nor启动 */

	/* 调用main */
	bl main

halt:
	b halt

led.c内容:

int main()
{
	unsigned int *pGPFCON = (unsigned int *)0x56000050;
	unsigned int *pGPFDAT = (unsigned int *)0x56000054;

/*设置GPF4 GPF5 GPF6 GPF7为输出*/
	*pGPFCON = 0x1500;
	
/*设置GPF4 GPF5 GPF6 GPF7输出0*/
	*pGPFDAT = 0;

	return 0;
}

这里我们使用了定义指针的方式访问物理地址,但是地址很多,不容易记住,所以我们这里引入一个头文件S3C2440_SOC.h,该头文件中定义了所有寄存器的地址,使用的时候直接使用名字即可。下面列出来该头文件中定义的一写宏

#define     __REG(x)					(*(volatile unsigned int *)(x)) 

/*Memory Controllers*/
#define     BWSCON                   __REG(0x48000000)   //Bus width & wait status control   
#define     BANKCON0                 __REG(0x48000004)   //Boot ROM control                  
#define     BANKCON1                 __REG(0x48000008)   //BANK1 control                     
#define     BANKCON2                 __REG(0x4800000C)   //BANK2 control                     
#define     BANKCON3                 __REG(0x48000010)   //BANK3 control                     
#define     BANKCON4                 __REG(0x48000014)   //BANK4 control                     
#define     BANKCON5                 __REG(0x48000018)   //BANK5 control                     
#define     BANKCON6                 __REG(0x4800001C)   //BANK6 control                     
#define     BANKCON7                 __REG(0x48000020)   //BANK7 control                     
#define     REFRESH                  __REG(0x48000024)   //DRAM/SDRAM refresh control        
#define     BANKSIZE                 __REG(0x48000028)   //Flexible bank size                
#define     MRSRB6                   __REG(0x4800002C)   //Mode register set for SDRAM BANK6 
#define     MRSRB7                   __REG(0x48000030)   //Mode register set for SDRAM BANK7 

引用之后的led.c文件内容:

#include "s3c2440_soc.h"

int main()
{
/*设置GPF4 GPF5 GPF6 GPF7为输出*/
	pGPFCON = 0x1500;
	
/*设置GPF4 GPF5 GPF6 GPF7输出0*/
	pGPFDAT = 0;
	return 0;
}

3.2 makefile

all:
	arm-linux-gcc -c -o led.o led.c
	arm-linux-gcc -c -o start.o start.S
	arm-linux-ld -Ttext 0 start.o led.o -o led.elf
	arm-linux-objcopy -O binary -S led.elf led.bin
	arm-linux-objdump -D led.elf > led.dis
clean:
	rm *.bin *.o *.elf *.dis

这个编译完的文件,我们在第一课讲解文件下载的时候 ,用的就是这个bin文件,这里就不在讲解怎么进行开发板的实验了,不熟悉的参照第一课。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值