• 一步步玩pcDuino3--mmc下的裸机流水灯


            第一部分是玩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	

    代码非常easy,编译完后记得使用mksunxiboot工具处理一下,最后使用dd命令烧写到8K偏移处。

            最后就能够看到两个灯一闪一闪亮晶晶了,如今还没有初始化时钟,注意调整延时,不然效果不大对。



            


            



            

  • 相关阅读:
    质量属性--信息技术手册
    蓝桥杯赛前整理
    感悟:荔枝架构实践与演进历程
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    感悟:淘宝架构演进背后——零售业务中台架构设计探讨及实践
    为什么要考研???
    寒假学习笔记03
    寒假学习笔记02
    寒假学习笔记01
    数据清洗与数据处理
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10552730.html
  • Copyright © 2020-2023  润新知