参考ok210裸机参考说明整理此文档。。。。。希望对大家有用。
一、开发环境
1、 学习过简单的C语言和ARM汇编语言。
2、 开发平台:windows xp +虚拟机VMware,使用arm‐linux‐gcc4.4.1编译代码。
3、 配套开发板:OK210开发板+Android(linux)系统,所有裸机程序均在OK210开发板上正常运行。
二、环境搭建
1、虚拟机的安装及Ubuntu的安装与设置请按照光盘资料《OK210软件手册》说明操作。
2、OK210开发板系统烧写请按照光盘资料《OK210软件手册》说明操作。
三、循环点亮led 灯
1、 查看原理图
OK210开发板提供了4个LED,其‘底板原理图.pdf ’下:
对应的ARM 管脚
2、 程序讲解
1) Init.s
.global _start
_start:
bl main //
halt:
b halt
.global关键字用来让一个符号对链接器可见,可以供其他链接对象模块使用。.global _start 让
_start 符号成为可见的标识符,这样链接器就知道跳转到程序中的什么地方并开始执行。
BL指令引起处理器转移到" main .c"处开始执行。
2) Makefile
CFLAGS := -Wall -O2 -fno-builtin -ffreestanding -nostdlib led_wtd.bin: init.o main.o
arm-linux-ld -Ttext 0x0 -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led_elf.dis
%.o : %.S
arm-linux-gcc $(CFLAGS) -o $@ $< -c
%.o : %.c
arm-linux-gcc $(CFLAGS) -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis forlinx –f
1.执行arm-linux-gcc $(CFLAGS) -o $@ $< -c命令 将当前目录下的init.s和main.c文件编译成.O文件
2.执行arm-linux-ld -Ttext 0x0 -o led.elf $^命令 将.O文件链接称elf文件。
3.执行arm-linux-objcopy -O binary led.elf led.bin命令 将elf文件抽取为.bin文件。
4.执行arm-linux-objdump -D led.elf > led_elf.dis命令,将elf文件反汇编后保存在dis文件中。
3) main.c
#define GPH2_CON (*(volatile unsigned long *)0xE0200C40)
#define GPH2_DAT (*(volatile unsigned long *)0xE0200C44)
#define GPH2_PUD (*(volatile unsigned long *)0xE0200C48)
#define GPD0CON (*(volatile unsigned long *)0xE02000A0)
void clock_init(void);
void putc(char c);
void uart_init(void);
void putout(char * c);
int print(const char *fmt, ...);
static void Delay(int count)
{
volatile int i, j = 0;
volatile static int loop = 800000000/10000;
for(;count > 0;count‐‐)
for(i=0;i < loop; i++) { j++; }
}
void main(void)
{
int i;
GPD0CON &= ~(0xF << 0);//关闭蜂鸣器
GPH2_CON=(GPH2_CON & ~0x0000FFFF)| 0x00001111;
//设置low4 为管脚为输出方式
clock_init();
uart_init();
//MP0_4DAT |= 0xF0;
for( i=4;i<8;i++)//关闭led
{
GPH2_DAT |= ( 1<< i);
Delay(100000);
}
char print[40]={'l','e','d','1',' ','i','s',' ','o','p','e','n'};
char print1[40]={'l','e','d','1',' ','i','s',' ','c','l','o','s','e'};
while(1)
{
for( i=0;i<4;i++)//循环点亮led
{
print[3]= i+48;
print1[3]= i+48;
GPH2_DAT &= ~( 1<< i);
putout(print);//输出打印信息
Delay(300000);
GPH2_DAT |= ( 1<< i);
putout(print1);// 输出打印信息
Delay(300000);
}
}
}
第一步 执行GPH2_CON=(GPH2_CON & ~0x0000FFFF)| 0x00001111;
语句设置GPH2_CON寄存器高四位为输出功能。
第二步 关闭4个led
第三步 循环点亮4个led 执行GPH2_DAT &= ~( 1<< i);;点亮led,
执行GPH2_DAT |= ( 1<< i);;关闭led。
3、 编译代码
运行VMware软件出现如下界面,点击“Power on this virtual machine” 运行虚拟机。
启动之后出现以下界面:
选择Applications ‐>Accessories‐>Files:
右击桌面,选择“Creat New Folder”新建一个名称为work的文件夹,将裸机程序放到此文件夹下。
选择Applications ‐>System Tools‐>XTerm
进入了编译环境
输入cd work 回车进入work文件夹,
输入ls –l 回车可以看到路径下包含的裸机程序,
输入cd forlinx_led,回车,进入forlinx_led路径下,
输入make 编译led 逻辑程序,编译成功,生成可以在开发板运行的bin文件。
4烧写运行
1)将开发板调试串口和电脑相连,建立以超级终端连接,设置波特率为115200,数据流控制为无。
2)启动开发板当超级终端显示打印信息Hit any key to stop autoboot: 按任意键输出以下信息,输入5回车 。
输入“loadb 20008000” 回车。 或者 “loadb c00080000” 回车.注意:20008000指的是s5pv210的ddr2低位两片内存的地址;c0008000 是20008000 内存物理地址的虚拟地址。
单击菜单栏“传送”按钮在下拉菜单中选择“发送文件”选项。
在弹出的对话框中选择要烧写的bin文件,单击“发送”按钮。
弹出以下对话框,表示正在将bin文件下载到开发板。
文件传输成功,输入“go 20008000” 运行逻辑程序。
程序运行后可以看到4个led 循环点亮,并在超级终端输出打印信息如下:
led1 is close
led2 is open
led2 is close
led3 is open
led3 is close
led4 is open
led4 is close
其他程序类似的下载和运行方法;
Go命令是uboot的执行命令。