最简单的ARM裸机程序,帮你理解程序的运行启动(mini2440开发板)

2019-04-14 19:02发布


//菜鸟学嵌入式.
//这一个真正的全裸代码。具体原理是这样的:
//首先是设置到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:关掉开发板的电源,再开启电源。你发现灯亮了。