双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

【入门】ARM开发板上的Hello World

brucegong brucegong 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区




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

说明:
硬件是一块以前的人开发后遗留下来的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 \
--only-section=.rodata \
--only-section=.data \
--only-section=.bss start.elf start.data
$(OBJCOPY) -O binary --only-section=.text start.elf start.text
cat start.text start.data > start.bin
rm -f *.o
rm -f *.elf
rm -f *.data
rm -f *.text
start.o: Start.s
$(CC) -o start.o -c Start.s
HelloWorld.o: HelloWorld.c
$(CC) -fno-builtin -o HelloWorld.o -c HelloWorld.c
clean:
rm -f *.o
rm -f *.elf
rm -f *.data
rm -f *.text
rm -f *.bin
-------------------------------------------------------------

ram.ld文件内容
-------------------------------------------------------------
/*控制链接器的行为,程序的起始地址为0x30005000,因此,编译好
的程序通过xmodem下载到内存中时必须以0x30005000为起点,否则
执行会出错*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
.text 0x30005000: { /* Real text segment */
_text = .; /* Text and read-only data */
*(.text)
. = ALIGN(4);
_etext = .; /* End of text section */
}

.rodata : {
__rodata_start = .;
*(.rodata)
. = ALIGN(4);
_erodata = .;
}

.data : {
__data_start = .;
*(.data)
. = ALIGN(4);
_edata = .;
}

.bss : {
__bss_start = .; /* BSS*/
*(.bss)
. = ALIGN(4);
_end = .;
}

}
-------------------------------------------------------------









...全文

相关推荐

zedboard-hello-world:Zedboard Hello World 项目

**zedboard-hello-world: Zedboard Hello World 项目**该项目是针对Zedboard平台的一个基础入门示例,旨在帮助用户熟悉Xilinx FPGA开发环境Vivado

黄荣钦

富芮坤FR8008A开发环境下的ARM开发

本文介绍了在富芮坤FR8008A开发环境下进行ARM开发的基本步骤,涵盖了工具链的安装、源代码的编写、程序的编译和烧录,以及最终在开发板上运行程序的过程。富芮坤FR8008A是一款基于ARM架构的开发板,提供了丰富的硬件资源和开发工具,为开发者提供了一个强大的平台来进行ARM开发。接下来,我们将编写一个简单的"Hello World"程序,并将其烧录到富芮坤FR8008A开发板上。至此,你已成功搭建了富芮坤FR8008A开发环境,并成功编写、编译、烧录并运行了一个简单的ARM程序。

HdData_Science

初来乍到,zynq的ps端之hello world

1. 为什么开始博客之旅 疫情带来的思考 西安疫情,让我从学习生活中慢了下来,呆在宿舍,肆无忌惮的玩了快两周,让我感到了空虚。自己大二开始就想着写写博客,来回顾自己的FPGA之路,但迟迟未行动起来。借此机会开启我的博客之旅。 2. zynq ps端介绍 我们使用的普通fpga和arm的结合构成了zynq开发板,通常fpga部分称为PL端,ARM部分称为PS端。为什么要有ps端,浅谈一下个人理解,随着时代的发展,大数据,算法,智能化等词语出现,这些一般都是软件人员开发,但fpga凭借着有并行处理进行加速,且.

fpga curry

01_NUCLEO-L476RG_Hello_World_world_stm32_

【标题】"01_NUCLEO-L476RG_Hello_World_world_stm32_" 提供了关于一个入门级STM32微控制器项目的线索。

呼啸庄主

ARM基础实验手册1

hello-world示例程序hello-world示例程序是ARM架构的入门级实验,旨在让读者快速了解ARM架构的基本概念和实验操作技能。

weixin_35780426
评论 13
收藏 已收藏
分享
返回顶部