//菜鸟学嵌入式.
//这一个真正的全裸代码。具体原理是这样的:
//首先是设置到NAND Flash 启动。当ARM 上电后,会自动读取NAND Flash
// 0x0000000地址处执行代码。我们将代码编译联接地址也设为0x0000000
//然后,用Jflash 烧写时,烧写到NAND Flash的0x0000000。那么上电后就会
//执行你的代码。
1:交叉环境的建立
按照 mini2440用户手册,175页成功设置好 .
2:连上开发板与PC上的JTAG线.开发板接上电源,
设置从NAND FLASH启动.(一定要确定是NAND FLASH启动)
否则烧写的时候不成功。
开启开发板电源.
3:编译 led_on.S
@******************************************************************************
@ File:led_on.S (引用:嵌入式linux应用开发完全手册 韦东山 编著。)我做了一点改动。
@ 功能:LED点灯程序,点亮LED
@ mini2440 的LED口是 GPB5,GPB6,GPB7,GPB8.给它们送[低电平,则点亮 ][高电平,则点灭].
@ 它的配置地址是:0x56000010 我们将向这个地址中写入值,将GPB5/6/7/8 这四个引脚设为输出口,
@ 它的数据地址是:0x56000014 我们向这里面送相应的值就会相应的点亮相应的灯。
@ 比如送0x00000060 --> bit8,bit7 为低电平,bit6,bit5 是高电平.因此led4,3亮,led2,1灭。
@******************************************************************************
.text
.global _start
_start:
LDR R0,=0x56000010 @ R0设为GPBCON寄存器。此寄存器
@ 用于选择端口B各引脚的功能:
@ 是输出、是输入、还是其他
MOV R1,#0x00015400 @ 设置GPB5,GPB6,GPB7,GPB8,为输出口 #表示后面的是立即数,0x表示是十六进制数。
STR R1,[R0] @ 将R1中的值,送到地z址:0x56000010中
LDR R0,=0x56000014 @ R0设为GPBDAT寄存器。此寄存器
@ 用于读/写端口B各引脚的数据
MOV R1,#0x00000060 @ 此值改为0x00000020,
@ 可让LED1熄灭
STR R1,[R0] @ GPB5输出0,LED1点亮
MAIN_LOOP:
B MAIN_LOOP
4:下面是Makefile文件内容。将它放在与led_on.S同一个文件夹下。
其中 arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf 这一句的意思是连接到0x0000000地址。
当你下载的时候,就是下载到nandflash中0x0000000处运行。(不知这样理解是否准确)
这一句:arm-linux-objcopy -O binary -S led_on_elf led_on.bin 将elf格式文件,变成.bin文件,这个.bin
的二进制文件,是可以在mini2440开发板上运行的。
led_on.bin : led_on.S
arm-linux-gcc -g -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
rm -f led_on.bin led_on_elf *.o
5:注意。led_on.S 的后缀是一个大写的S,而不是小写的s.
进入刚才,你保存文件的文件夹之后。
执行make.
make后会生成一个 led_on.bin文件。
6:将光盘里jflash2440.tgz解压.会生成一个Jflash文件夹
将刚才的led_on.bin文件复制到 Jflash
执行如下语句: ./Jflash-s3c2440 led_on.bin /t=5 /d=0
出现第一个提示时输入:5 --表示烧写的flash类型是 64M的k9s1208
出现第二个提示时输入: 0 --表示从第k9s1208 program
出现第三个提示时输入: 0 --表示从第0块烧写。然后就是烧写的过程.
再出现提示时输入 : 2 --表示退出烧写。
7:关掉开发板的电源,再开启电源。你发现灯亮了。