前言: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文件,这里就不在讲解怎么进行开发板的实验了,不熟悉的参照第一课。