当前位置: 代码迷 >> 驱动开发 >> 【入门】ARM开发板上的Hello World,该怎么解决
  详细解决方案

【入门】ARM开发板上的Hello World,该怎么解决

热度:48   发布时间:2016-04-28 11:10:45.0
【入门】ARM开发板上的Hello World



搞了三天,终于出来了。虽然狂简单,但是这是我的一大步。发个帖子纪念一下。如果这些东西对你有用,请你留言让我知道。哪怕就是一个“顶”字,也是对我的鼓励。
谢谢。

说明:
硬件是一块以前的人开发后遗留下来的ARM开发板,芯片内部的rom支持xmodem协议,即:可以通过串口下载程序并执行。这个串口就是代码中用来打出Hello   World的串口0,波特率为38400。

Start.s文件内容
-------------------------
/*
引导程序
通常引导程序需要初始化硬件等等。
但是当前的测试程序只需要输出Hello   World,完全在内存里面运行,因此不需要初
始化硬件。唯一需要用到的外设UART0已经被芯片内部的程序初始化过了
amain和bmain都可以作为主入口(当然,输出的内容会不一样)
*/
.global   _start
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

.section   ".text "
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

_start:
b     ResetHandler
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

     
ResetHandler:
        @bl   to   c   function
ldr   pc,=amain
-------------------------

HelloWorld.c文件内容
-------------------------
/*
0x20060000是UART0的地址
bmain函数中的asm内容和写在start.s中是同一个效果
*/
void   uart_write_chr(unsigned   char   chr)
{
(*((volatile   unsigned   char   *)(0x20060000)))   =   chr;
}

void   bmain(void)
{
int   i   =   0;
int j;

asm( "ldr     r0,=0x0D ");
asm( "ldr     r1,=0x20060000 ");
asm( "str     r0,[r1] ");

asm( "ldr     r0,=0x0A ");
asm( "ldr     r1,=0x20060000 ");
asm( "str     r0,[r1] ");

for(i   =   0;i   <   100;i++)
{
for(j   =   0;j   <   500;j++)
;
asm( "ldr     r0,=0x48 ");
asm( "ldr     r1,=0x20060000 ");
asm( "str     r0,[r1] ");
}
}

int   amain(int   argc,char*   argv[])
{
        char*       str   =   "\nHello   World!\n ";
        char* pStr   =   str;

        pStr   =   str;
               
        bmain();
        while(*pStr   !=   '\0 ')
        {
        uart_write_chr(*pStr);
        pStr++;
        }        
return   0;
}

-------------------------

MakeFile文件内容
-------------------------
#ram.ld是一个非常关键的文件,它制定了链接器的工作方式
#ram.ld的注释部分需要仔细阅读

CROSS   =   arm-elf-

AS   =   $(CROSS)as
LD   =   $(CROSS)ld
CC   =   $(CROSS)gcc
OBJCOPY   =   $(CROSS)objcopy

LDFLAGS =   -T   ram.ld

LIBS =   /tools/H-i686-pc-cygwin/lib/gcc-lib/arm-elf/3.0/libgcc.a   \
  /tools/H-i686-pc-cygwin/arm-elf/lib/libc.a

all:   start.bin

start.bin: start.o   HelloWorld.o
$(LD)   $(LDFLAGS)   -o   start.elf   start.o   HelloWorld.o   $(LIBS)
$(OBJCOPY)   -O   binary   \
  相关解决方案