本帖最后由 q15920078530 于 2015-8-7 12:57 编辑
【OK210试用体验】裸机篇 -- 点亮第一个发光二极管
相信所有学过51等单片机的都知道,点亮第一个发光二极管是进行裸板程序开发的开始。对于不同阶段的不同芯片的点亮LED,所经过的步骤的有所不同,但是根本的还是不变。在这个第一个裸板程序--点亮LED中,我将不在windows下运用ADS等一气呵成的工具,走一条对自己是崭新的路,在Linux下用arm-linux-gcc交叉编译工具链来完成。
查看原理图
写程序来控制LED的亮灭之前,当然是要来看看原理图啦。打开 OK210 V1.1硬件资料原理图PDF 和 核心板原理图。
第一次看核心板原理图可能比较头晕,可以透过索引来寻找对应的引脚。通过此原理图我们可以知道,分别给XM0ADDRx(x对应四个LED,4、5、6、7)低电平,则LED亮,反之则灭。
配置寄存器
查看好原理图之后,在写程序之前我们还要查看对应控制该GPIO的寄存器,通过配置其来完成驱动。这个时候三星大哥的官方资料的作用就无比巨大了,参考 OK210 V1.1三星原厂资料s5pv210HWUser Manual 下的文档 S5PV210_UM_REV1.1.pdf 。找到一下页面。
这里我们要配置两个寄存器, 配置寄存器CON和输入输出模式寄存器DAT,我们在用交叉编译器编写程序当中,要先知道寄存器的地址,才能去配置所要的功能,图中我们可以知道MP0_4 CONTROL REGISTER的地址是0xE020_0340,MP0_4DAT, R/W, Address = 0xE020_0344。我们的目标是点亮第一个LED,所以我们把此对应的CON配置成输出模式,即0b0001,对应的DAT寄存器的有效位是8位,如果我们点亮的是第4位,则是0x10。
编写程序
点亮一个LED的程序,代码量是可想而知,所以我们直接用ARM汇编来编写。在ubuntu的某个目录文件夹下建立一个led.S文件,输入:
/* led_on.S */
.text
.global _start
_start:
ldr r0, =0xE0200340 @ configure GPIO_MP0_4 CONFIG REGIDTER
ldr r1, =0x00010000
str r1, [r0]
ldr r0, =0xE0200344 @ configure GPIO_MP0_4 DATA REGISTER
ldr r1, =0x000000e0
str r1, [r0]
halt:
b halt
代码最后加入死循环。
为了方便进行编译链接操作,所以还要编者Makefile
led.bin : led.o
arm-linux-ld -Ttext 0xD0020010 -o led.elf $^
arm-linux-objcopy -O binary led.elf $@
arm-linux-objdump -D led.elf > led.dis
led.o : led.S
arm-linux-gcc -c $< -o $@
clean :
rm*.o *.elf *.bin *,dis
具体编写思路可以参考
。这里指定了程序的链接地址(运行)为 0xD0020010,从 上一帖中的S5PV210的启动流程中我们可以知道,这个地址为 BL1 的起 始地址,具体的可以直接查看S5PV210启动流程帖。
make
编写好程序之后,我们要对程序进行编译链接。直接在储存源文件和Makefile文件的目录下输入make即可编译链接,中间产生的文件可以用make clean来清除,但是之前要把 .bin 文件拷贝到要烧写的目录下。
编写头信息程序
我们在S5PV210的启动流程中可以知道,在BL1阶段运行驱动程序之前,我们还要给它加入16个字节的头信息,来校验计算程序的对错。我们可以 addheader.c 文件,内容可以参考S5PV210启动流程的官方例子,附上个不错的例子文件
。这个.c文件可以直接用自带的gcc编译器来完成编译链接 - gcc -o addheader addheader.c
制作目标文件
- ./addheader led/led.bin 210.bin
烧写程序
将SD卡装到读卡器中插入电脑,如果虚拟机与主机之间没有建立文件共享关系,可以直接让SD挂载到虚拟机之中,有文件共享的可以将 .bin 文件拷贝到windows下。将 210.bin文件移入第一个扇区,拷贝好之后插入开发板,调节到SD卡启动,即可enjoy!!!!
实验现象