赞
踩
第一部分是玩pcduino3下的裸机,这个过程可以让我们更好的理解嵌入式系统,熟悉我们使用的这个平台。
首先介绍下开发环境:
虚拟机:VMware® Workstation 10.0.2 build-1744117
系统:Linux slackware 3.2.29-smp #2 SMP
交叉编译器:arm-linux-gnueabihf- 版本号:gcc version 4.8.2 20130805 (prerelease) (crosstool-NG linaro-1.13.1-4.8-2013.08 - Linaro GCC 2013.08)
编辑器:Vim
硬件连接如下:
USB 5V电源线和USB转TTL线连接到pcduino3上,如图:
说是流水灯,其实我只用到两个灯,这个板子的LED不多,并没有专门的流水灯配置。我们先看一下原理图:
我仅仅用到TX_LED和RX_LED两个灯:
我们用到这里的TX和RX两个灯,重新回到原理图看看哪两个管脚来控制这两个LED的:
PH15和PH16分别控制TX_LED和RX_LED。
在弄清楚硬件连接后,在正式编写汇编代码之前,我们先理清A20的boot顺序,根据其datasheet上简洁的介绍,它支持mmc启动,也支持nand flash启动,并且mmc启动优先于nand flash启动。A20的datasheet并没有详细写出boot的硬件细节,大概的估摸出大概步骤如下:mmc启动条件下,硬件会自动将mmc卡中位于偏移量在8K和40K之间的数据搬移到内部的SRAM1和SRAM2中:
现在的uboot支持spl方式,就是位于前32k的部分首先在SRAM中运行,然后初始化DRAM和MMC接口,然后再搬移后续的uboot到内存中运行,再进行加载kernel的操作。
除了这一点,还要注意,MMC启动时需要加上特定的头,这里我们要用到uboot/tools里面的mksunxiboot工具加这个头。这个头由32个字节的结构体boot_file_head定义,这个结构体里面有MAGIC和check sum。然后生成一条跳转代码来跳转到真正地代码处进行执行。
代码分为两个汇编文件:start.S和led.S。start.S设定栈指针,然后就跳到led.S中的主函数中。
start.S代码如下:
- .text
- .global _start
-
-
- _start:
-
- ldr sp, =0x00007f00
-
- bl main
-
- halt_loop:
- b halt_loop
led.S如下:
- .equ PH_CFG1, 0x01C20900
- .equ PH_CFG3, 0x01C20904
-
- .equ PH_PULL0, 0x01C20918
- .equ PH_PULL1, 0x01C2091C
-
- .equ PH_DAT, 0x01C2090C
-
-
- .global main
-
- main:
- ldr r0,=PH_CFG1
- ldr r1,=0x10000000
- str r1, [r0]
-
- ldr r0,=PH_CFG2
- ldr r1,=0x00000001
- str r1, [r0]
-
- ldr r0,=PH_PULL0
- ldr r1,=0x55555555
- str r1, [r0]
-
- ldr r0,=PH_PULL1
- ldr r1,=0x55555555
- str r1, [r0]
- ledloop:
-
- ldr r0,=PH_DAT
- ldr r1,=0x000f0000
- str r1, [r0]
-
- bl delay
-
- ldr r0,=PH_DAT
- ldr r1,=0x0000f000
- str r1, [r0]
-
- bl delay
-
- b ledloop
-
- delay:
- ldr r3,=0xfffff
-
- delay1:
- sub r3,r3,#1
- cmp r3,#0x0
- bne delay1
- mov pc,lr

最后就可以看到两个灯一闪一闪亮晶晶了,现在还没有初始化时钟,注意调整延时,不然效果不大对。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。