您的位置:首页 > 其它

我的第一个裸机程序

2013-06-17 13:11 615 查看
学电子专业的同学伤不起啊,每天都要面对那复杂的数学运算。生活中充满了数字,也就没有什么时间来搞点业余爱好了。只有午睡时有点空来写点;

学习过单片机的应该都写过一点点程序,可是这样一个嵌入式开发平台如何能够做一些很简单的事呢?我用我学过的单片机思路来写点ARM11裸机程序。

我用的是FriendlyARM tiny6410。我写的一个最容易的LED程序,程序我只用了C语言,没有用汇编(汇编真的不是那么好写,蛋疼)

下面是我写的程序的源代码:

//Copyright - (c) 2011/1/10 xueyang

#define rGPKCON0 (*(volatile unsigned *)(0x7F008800))
#define rGPKCON1 (*(volatile unsigned *)(0x7F008804))
#define rGPKDAT (*(volatile unsigned *)(0x7F008808))
#define rGPKPUD (*(volatile unsigned *)(0x7F00880C))

#define rMPLLCON (*(volatile unsigned *)0x7E00F010)
#define rCLKDIVN (*(volatile unsigned *)0X7E00F020)
void delay(void);
_start(void)
{
rGPKCON0 = (rGPKCON0 & ~(0xffffU<<16))|(0x1111U<<16);
rGPKPUD = (rGPKPUD & ~(0xffU << 8))|(0x00U<<8);
for(;;)
{
int data = 0x09;
rGPKDAT = (rGPKDAT & ~(0xf<<4)) | ((data & 0xf)<<4);
delay();
data = 0x06;
rGPKDAT = (rGPKDAT & ~(0xf<<4)) | ((data & 0xf)<<4);
delay();
}
}
void delay(void)
{
unsigned int k;
for(k = 0; k < 200000; k++);
}

程序是非常的容易的,我这里就不多讲了。

可以用仿真器下载到开发板上去,也可以用dnw下载到开发板(方法的驱动/程序源码后面有时间再写一篇)

我们程序中可以不用汇编,

我们的C编译器会给我们带来一些新的问题:

1.头文件

2.库函数

3.地址

4.多个程序文件编译时的依赖

但编译要注意,我用的下面的命令编译来解决目前面临的问题(环境是之前配置好的交叉编译环境):

arm-none-linux-gnueabi-gcc -c hello.c -o hello.o //编译生成可执行文件

arm-none-linux-gnueabi-ld -Ttext=0x50000000 hello.o -o hello -e _start //编译生成无.o的文件,指定_start处开始运行,并指定运行地址0x50000000

arm-none-linux-gnueabi-objcopy -I elf32-littlearm -O binary hello hello.bin //去头(格式转换)

由于水平有限,若有什么错误,欢迎大家指正!<xueyang1122@gmail.com>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: