主题 : 最简单的ARM裸机程序 复制链接 | 浏览器收藏 | 打印
一点一点的去做。动手!!
级别: 新手上路
UID: 3945
精华: 0
发帖: 18
金钱: 115 两
威望: 63 点
贡献值: 0 点
综合积分: 36 分
注册时间: 2009-02-17
最后登录: 2013-08-17
楼主  发表于: 2009-03-01 23:51

 最简单的ARM裸机程序


//菜鸟学嵌入式.
//这一个真正的全裸代码。具体原理是这样的:
//首先是设置到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:关掉开发板的电源,再开启电源。你发现灯亮了。  
坚持是人类最伟大的品质
级别: 侠客
UID: 3501
精华: 0
发帖: 52
金钱: 530 两
威望: 530 点
贡献值: 0 点
综合积分: 104 分
注册时间: 2009-01-14
最后登录: 2009-06-16
1楼  发表于: 2009-03-02 12:05
我一看要连JTAG线就头疼,我的本上只有个9针的接口
级别: 新手上路
UID: 3402
精华: 0
发帖: 9
金钱: 80 两
威望: 72 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2009-01-09
最后登录: 2018-10-28
2楼  发表于: 2009-03-04 22:25
我就这个水平的,哈哈。
级别: 侠客
UID: 1500
精华: 0
发帖: 69
金钱: 22615 两
威望: 4696 点
贡献值: 0 点
综合积分: 138 分
注册时间: 2008-09-03
最后登录: 2017-07-16
3楼  发表于: 2009-03-04 22:44
不是吧,这个程序这么眼熟,是不是韦东山那本书的程序哦,你可以考虑一下,假如从nor flash启动,内存有没有初始化好,要把程序到内部ram中怎么改
级别: 新手上路
UID: 6013
精华: 0
发帖: 18
金钱: 180 两
威望: 140 点
贡献值: 0 点
综合积分: 36 分
注册时间: 2009-05-16
最后登录: 2009-10-22
4楼  发表于: 2009-05-20 12:29
想不明白,为什么这个裸机程序不用INIT.S 还有用ADS的裸机程序时,没有用到NANDFLASH驱动的?  哪个大哥说一下噫。。
级别: 新手上路
UID: 63158
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
贡献值: 0 点
综合积分: 4 分
注册时间: 2012-02-15
最后登录: 2012-02-16
5楼  发表于: 2012-02-16 17:26