这个程序是基于s3c2440 上编写的,程序是根据韦东山老师的教程编写出来的,但是韦东山是针对6410的,所特在此记录一下学习的过程。
这个程序是通过汇编代码来编写启动代码,然后调用c语言代码来实现的。程序的编写环境式linux。
(1)首先新建一个leds3.s 文件,输入内容如下:
-------------分割线--------------------
.globl _start
_start:
/* 硬件相关的设置:*/
/* Peripheral port setup (查看s3c2440 memory map ) */
/* 基地址+size*/
/* 查看s3c2440芯片说明 和 arm926ej-s cp15*/
ldr r0, =0x50000000
orr r0,r0,#0x08
mcr p15,0,r0,c15,c2,4 @128k(0x50000000-0x5000FFFF)
/* 关看门狗 看门狗每三秒就会重启系统,所以需要把看门狗关掉 */
/* 往 WTCON(0x53000000)写0*/
ldr r0, =0x53000000
mov r1, #0
str r1, [r0]
/*设置栈
设置sp指针的指向,尽量使sp在SRAM之外,因为SRAM为4k所以这里指向4*1024
*/
ldr sp, = 4*1024 @查看SRAM
bl main @这里调用的是C语言
halt:
b halt
-------------分割线--------------------
(2)再新建一个led3.c 文件,输入内容如下:
-------------分割线--------------------
void delay(){
volatile int i = 0x20000;
while(i--);
}
/*在这里定义了leds3.s 文件所调用了的main 函数*/
int main()
{
int i = 0x010 ;
volatile unsigned long *gpbcon = (volatile unsigned long *) 0x56000010; //0x56000010是GPBCON寄存器的地址
volatile unsigned long *gpbdat = (volatile unsigned long *) 0x56000014; //0x56000014是GPBDAT寄存器的地址
/*配置四个led灯为输出*/
/*查看TQ2440底板原理图和核心板原理图得到led1,led2,led3,led4分别连接到GPB5,GPB6,GPB7,GPB8上
再查看s3c2440芯片手册得到配置GPB[5:8]为输出的方式*/
*gpbcon = 0x15400 ;
while(1){
//i= 0000 0001 0000 。GPB5,GPB6,GPB7,GPB8都为0,GPB4为1
*gpbdat = i ;
i = i<<1;
if(i == 0x200) // 0x200 = 0010 0000 0000
i = 0x10;
delay();
}
return 0;
}
-------------分割线--------------------
(3)最后新建MakeFile,输入内容如下:
-------------分割线--------------------
led3.bin: leds3.o led3.o
arm-linux-ld -Ttext 0 -o led3.elf leds3.o led3.o
arm-linux-objcopy -O binary led3.elf led3.bin
arm-linux-objdump -D led3.elf > led3.dis
leds3.o : leds3.s
arm-linux-gcc -o leds3.o leds3.s -c
led3.o : led3.c
arm-linux-gcc -o led3.o led3.c -c
clean:
rm *.o led3.elf led3.bin led3.dis
-------------分割线--------------------
最后在linux下执行make编译即可得到我要的led3.bin。
代码:http://download.csdn.net/detail/u014699958/8888597