LED实验
参考文件:http://blog.csdn.net/TQW4321/archive/2009/03/01/3948191.aspx
//这一个真正的全裸代码。具体原理是这样的:
//首先是设置到NAND Flash 启动。当ARM 上电后,会自动读取NANDFlash
// 0x0000000地址处执行代码。我们将代码编译联接地址也设为0x0000000
//然后,用Jflash 烧写时,烧写到NAND Flash的0x0000000。那么上电后就会
//执行你的代码。
1:交叉环境的建立
2:连上开发板与PC上的JTAG线.开发板接上电源,
设置从NAND FLASH启动.(一定要确定是NANDFLASH启动)
否则烧写的时候不成功。
开启开发板电源.
3:编译 start.S
@******************************************************************************
@ File:start.S (引用:韦东山Linux视频第1期之S3C6410\韦东山视频_S3C6410_第1期裸板_第2期驱动代码\ARM\1th_led\start.S)
@ 功能:LED点灯程序,点亮LED
@ mini6410 的LED口是GPB5,GPB6,GPB7,GPB8.给它们送[低电平点亮;高电平点灭].
@ 它的配置地址是: 0x7F008820 我们将向这个地址中写入值,将GPB5/6/7/8 这四个引脚设为输出口,
@ 它的数据地址是: 0x7F008824 我们向这里面送相应的值就会相应的点亮相应的灯。
@******************************************************************************
.globl _start
_start:
/* 硬件相关的设置 */
/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4 @256M(0x70000000-0x7fffffff)
/* 关看门狗 */
/* 往WTCON(0x7E004000)写0 */
ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]
/* 设置GPMCON让GPM3作为输出引脚 */
ldr r1, =0x7F008820
mov r0, #0x1000
str r0, [r1]
/* 设置GPMDAT让GPM3输出0 */
ldr r1, =0x7F008824
mov r0, #0
str r0, [r1]
halt:
b halt
4:下面是Makefile文件内容。将它放在与start.S同一个文件夹下。
led.bin: start.o
arm-linux-ld -Ttext 0 -o led.elf start.o
arm-linux-objcopy -O binary led.elfled.bin
arm-linux-objdump -D led.elf > led.dis
start.o :start.S
arm-linux-gcc -o start.o start.S -c
clean:
rm *.o led.elf led.bin led.dis
其中 arm-linux-ld -Ttext 0 -o led.elf start.o 这一句的意思是连接到0x00000000地址。
当你下载的时候,就是下载到nandflash中0x0000000处运行。
这一句:arm-linux-objcopy -O binary led.elf led.bin 将elf格式文件变成.bin文件,这个.bin
的二进制文件,是可以在mini6410开发板上运行的。
5:注意。start.S 的后缀是一个大写的S,而不是小写的s.
进入刚才,你保存文件的文件夹之后。
执行make. make后会生成一个 led.bin文件。
6: 将刚才的led.bin文件复制到 Jflash
执行如下语句: ./Jflash-s3c2440 led_on.bin/t=5 /d=0
出现第一个提示时输入:5--表示烧写的flash类型是 64M的k9s1208
出现第二个提示时输入: 0--表示从第k9s1208 program
出现第三个提示时输入: 0--表示从第0块烧写。然后就是烧写的过程.
再出现提示时输入 : 2 --表示退出烧写。
7:关掉开发板的电源,再开启电源。你发现灯亮了。
循环点亮多个LED的代码只要把“/* 设置GPMCON让GPM0/1/2/3作为输出引脚 */”及“/* 设置GPMDAT让GPM3输出0 */”部分改为下面的即可:
/* 设置GPMCON让GPM0/1/2/3作为输出引脚 */
ldrr1, =0x7F008820
ldrr0, =0x1111 //改为GPM0/1/2/3作为输出引脚
strr0, [r1]
/* 设置GPMDAT让GPM3输出0 */
ldrr1, =0x7F008824
movr0, #0
loop:
strr0, [r1]
addr0, r0, #1
cmpr0, #16
moveqr0, #0
bldelay
bloop
delay:
movr2, #0x10000
delay_loop:
subr2, r2, #1
cmpr2, #0
bnedelay_loop
movpc, lr
改为C语言编写:
(1)在Start.S文件里,同样要做硬件相关的设置和关看门狗,并且在后面加上设置栈的代码:
/* 设置栈 */
ldr sp, =8*1024
bl xxxxx /*调用C函数*/
halt:
b halt
(2)C语言部分代码为:
void delay() /*延时函数*/
{
volatile int i = 0x10000;
while (i--);
}
int xxxxx()
{
int i = 0;
volatile unsigned long *gpmcon = (volatile unsigned long *)0x7F008820;
volatile unsigned long *gpmdat = (volatile unsigned long *)0x7F008824;
/* gpm0,1,2,3设为输出引脚 */
*gpmcon = 0x1111;
while (1)
{
*gpmdat = i;
i++;
if (i == 16)
i = 0;
delay();
}
return 0;
}
上面的都是一些个人总结,是关于S3C6410开发板的。