zoukankan      html  css  js  c++  java
  • 第十章 MIZ702 ZYNQ制作UBOOT固化程序

    10.0难度系数★☆☆☆☆☆☆

    10.1是什么是固化

    我们前几章将的程序都是通过JTAG先下载bit流文件,再下载elf文件,之后点击Run As来运行的程序。JTAG的方法是通过TCL脚本来初始化PS,然后用JTAG收发信息,可用于在线调试。但是这样只要一断电,程序就丢失了。还得全部重新来过。

    本章介绍通过制作镜像文件,将镜像文件拷贝到SD卡,然后将拨码开关拨到SD启动,那么每次断电之后程序都会自动从SD启动,程序就别固化,而不会掉电丢失了。

    10.2固化的流程

    wps92CC.tmp

    10.3固化准备

    第七章 ZYNQ GPIO使用之EMIO》中的实验其实就是一个最简单的“PS + PL”运用的体现。如果我们想固化这个程序,及为这个程序做一个镜像文件,制作改镜像需要哪些材料呢?

    首先,想到的两个文件就是PL部分需要的bit文件,以及PS需要的elf文件。但是仅仅是这两个文件是远远不够的。我们还需要一段代码吧bit文件以及elf文件安置好。那么这段代码就是大名鼎鼎的FSBL.elf。

    所以要制作这样一个镜像文件我们需要:FSBL.elf、bit、elf。

    最后得到一个等式就是:BOOT.bin = FSBL.elf+该工程.bit+该工程.elf。该工程的bit文件和elf文件在我们的程序编译完之后都有了,关键是这个FSBL.elf这么那里找?不用担心,FSBL.elf文件xilinx找就为我们准备好了,我们可以利用SDK生成它。再次之前,我们先简单了解一下zynq的启动的过程。

    10.4 zynq的从SD卡的启动的过程

    和大多数arm启动过程一样,这个启动过程也分为3个阶段,这三个阶段分别称之为阶段0、阶段1和阶段2。

    阶段 0:即传统的BootROM过程,zynq芯片里有个rom里面固化了一段不可修改的程序,只有zynq一上电,这段程序就会执行,它将对zynq的NAND、NOR、SD等基本外设控制器进行初始化。把SD卡这类易失的存储器件初始化好了之后,就会把其中的程序拷贝到zynq的OCM(On-chip memory),那么这个被拷贝到片上RAM执行的程序就是我们今天要制作的文件——BOOT.bin。

    阶段 1:BOOT.bin加载到OCM上就开始执行了,之前说过BOOT.bin其实就是由FSBL.elf+该工程.bit+该工程.elf构成。而阶段1要做的就是:首先配置PS部分,PS完成初始化后,会去配置PL部分,最后还可以去加载阶段 2的代码。

    阶段 2:这一阶段是可选的,主要是为了完成Linux系统启动过程。我们这次是还是裸奔,所以暂时不需要。

    10.5 zynq启动模式位的选择

    这里有个疑问,众所周知zynq具有多种启动方式:NOR, NAND, Quad-SPI, SD Card 以及JTAG 。zynq如何判断到底从哪里启动呢?事实上,当上电后,zynq 会根据模式管脚的设定选用boot的方式。而这个管脚的设定是通过MiZ702按键旁的拨码开。

    SD卡启动模式选择拨码开关1-2-5-6 为ON  接到GND     3-4 为OFF 上拉到VCC

    wps92DD.tmp

    QSPI FLASH启动模式选择拨码开关1-2-3-5-6为ON  接到GND   4 为OFF 上拉到VCC

    wps92DE.tmp

    MiZ702模式选择通过拨码开关来实现,当拨码开关ON状态接通到GND 否则接通到3V3.

    wps92DF.tmp

    MiZ702通过拨码开关设置MIO的电平状态

    我们的开发板MiZ702默认拨码的顺序,就是默认的SD卡启动,具体参看模式位应该如何选择:

    · MIO[2]/Boot_Mode[3]设置JTAG模式

    · MIO[5:3]/Boot_Mode[2:0] 选择Boot模式

    · MIO[6]/Boot_Mode[4] 使能内部PLL

    · MIO[8:7]/Vmode[1:0] 用于配置

    wps92F0.tmp

    10.6 BOOT.bin制作过程详解

    Step1:双击打开SDK并为工作空间选择一个目录,后点击OK:

    wps92F1.tmp

    Step2:新建一个应用工程

    wps92F2.tmp

    Step3:填写工程名,点击Next

    wps9302.tmp

    Step4:现在工程类型为Zynq FSBL

    wps9303.tmp

    Step5:按下快捷键Ctrl + B编译工程就能得到我们梦寐以求的FSBL.elf。这个文件可以到我们刚刚设置的工作空间的Debug目录下找打,我这边具体目录是:D:MiZ702FSBLFBLSDebug。

    wps9304.tmp

    Step6:我们将FSBL.elf连同《EMIO 使用详解》工程中的elf和bit文件拷贝到一个文件夹下备用。

    wps9305.tmp

    Step7:单击SDK的工具栏处的Xilinx Tool->Creat Zynq Boot Image

    wps9306.tmp

    Step8:依次添加FBLS.elf,design_1_wrapper.bit,以及emio.elf,请务必按顺序添加。

    wps9317.tmp

    Step9:点击add,添加FSBL.elf

    wps9318.tmp

    Step10:点击add,添加system_wrapper.bit

    wps9319.tmp

    Step11:点击add,添加EMIOTest.elf文件

    wps931A.tmp

    wps931B.tmp

    Step12:三个文件添加完毕之后,点击Creat Image生成BOOT.bin

    在之前设定的文件夹下找到,BOOT.bin并且将其拷到SD卡中,再把SD卡插到MiZ702,打开电源,和上次工程出现的现象重现了,这次断电之后,程序也不会消失了~~

    最后提醒下放大SD卡的bin文件,一定得叫BOOT.bin,不然不识别。

    10.7 从Quad-SPI启动

    Step1:设置配置模式

    正确设置模块开关跳线,也就是把MIO5切换到OFF(上拉为H)其他全部切换到ON(短接到GND)

    wps932B.tmp

    Step2:给开发板通电,同时连接串口到PC(不是必须的可以不连接)

    Step3:选择Xilinx Tools > Program Flash

    wps932C.tmp

    Step4:下载过程,需要几分钟时间

    wps932D.tmp

    Step5:下载过程,输出的情况

    wps932E.tmp

    Step6:下载完成后断电重启,就能看到从QSPI FLASH加载了

    10.8 本章小结

    本章详细讲解了SD卡下UBOOT的制作过程和如果编程QSPI FLASH。这样固化后程序就不容易丢失了。


    第十ZYNQ DDR3 PS读写操作方案

    本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写。

    本文所使用的开发板是Miz702
    PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4

    11.0本章难度系数★☆☆☆☆☆☆

    11.1 搭建硬件工程

    Step1:新建一个名为为Miz702_sys的工程

    wps932F.tmp

    Step2:选择RTL Project 勾选Do not specify source at this time

    wps9340.tmp

    Step3:由于Miz702兼容zedboard 因此选择zedboard开发包

    wps9341.tmp

    Step4:单击Finish

    wps9342.tmp

    11.2使用IP Integrator创建硬件系统

    Step1:单击Create Block Design

    Step2:输入system

    wps9343.tmp

    Step3:单击下图中wps9344.tmp添加IP按钮

    wps9355.tmp

    Step4:搜素单词z选择ZYNQ7 Processing System,然后双击

    wps9356.tmp

    Step5:添加进来了ZYNQ CPU IP,然后单击Run Block Automation

    wps9357.tmp

    Step6:直接单击OK

    wps9358.tmp

    Step7:在你点击了OK后,你会发现DDR以及FICED_IO自劢的延伸出来。

    wps9359.tmp

    Step8:连线的作用就是把PS的时钟可以接入PL部分,当然这里我们暂时用不到PL部分的资源。在Block文件中,我们迚行连线,将鼠标放在引脚处,鼠标变成铅笔后迚行拖拽,连线如下图所示:

    wps935A.tmp

    Step9:双击ZYNQ,使能UART1点击Run Connection Automation,按照如图所示配置后单击OK

    wps936A.tmp

    Step10: 右击 system.bd, 单击Generate Output Products

    wps936B.tmp

    Step11:支部操作会产生执行、仿真、综合的文件

    wps936C.tmp

    Step12:右击system.bd 选择 Create HDL Wrapper 这步的作用是产生顶层的HDL文件

    wps936D.tmp

    Step13:选择Leave Let Vivado manager wrapper and auto-update 然后单击OK

    wps936E.tmp

    11.3导出SOC硬件到SDK

    Step1:File->Export->Export Hardware

    wps937F.tmp

    Step2:勾选Include bitstream 直接单击OK

    wps9380.tmp

    Step3:File->Launch SDK加载到SDK

    wps9381.tmp

    Step4:单击OK

    wps9382.tmp

    11.4软件工程

    新建一个PL_PS_INTC空的工程,并且添加main.c

    DDR3的地址建好后,在mem_demo_bsp->ps7->cortexa9_0的路径下,打开xparameters_ps.h这个头文件,这个头文件是cortexA9可以直接控制的外设地址的宏定义。在里面可以找到DDR的地址,可以看到如下代码:

    /* Canonical definitions for DDR MEMORY */
    #define XPAR_DDR_MEM_BASEADDR 0x00000000U
    #define XPAR_DDR_MEM_HIGHADDR 0x3FFFFFFFU

    等会我们要使用这个地址,对DDR3进行读写操作,读写操作函数在mem_demo_bsp->ps7->cortexa9_0的路径下,打开xil_io.h这个头文件,这个头文件是cortexA9可以直接控制的内存映射或者映射到了地址空间的IO。在里面可以看到如下代码:
    //从某个地址读数据 
    u8 Xil_In8(INTPTR Addr);
    u16 Xil_In16(INTPTR Addr);
    u32 Xil_In32(INTPTR Addr);

    //向某个地址写数据。
    void Xil_Out8(INTPTR Addr, u8 Value);
    void Xil_Out16(INTPTR Addr, u16 Value);
    void Xil_Out32(INTPTR Addr, u32 Value);
    OK,有了这些就可以简单的对DDR进行续写操作了

    14.3代码实现

    /*

    * main.c

    *

    *  Created on: 2016年4月4日

    *      Author: Administrator

    */

    #include "stdio.h"

    #include "xparameters.h"

    #include "xparameters_ps.h"

    #include "xil_printf.h"

    #include "xil_io.h"

    #define DDR_BASEARDDR      XPAR_DDR_MEM_BASEADDR + 0x10000000

    int main()

    {

        int i;

        int rev;

        xil_printf("Hello World ");

        for(i=0; i<32; i++)

        {

            Xil_Out32(DDR_BASEARDDR+i*4,i);

        }

        for(i=0; i<32; i++)

        {

            rev = Xil_In32(DDR_BASEARDDR+i*4);

            xil_printf("the address at  %x data is : %x " ,DDR_BASEARDDR+i*4, rev);

        }

        return 0;

    }

    11.5 测试结果

    串口终端的结果如下:
    Hello World

    the address at  10000000 data is : 0

    the address at  10000004 data is : 1

    the address at  10000008 data is : 2

    the address at  1000000C data is : 3

    the address at  10000010 data is : 4

    the address at  10000014 data is : 5

    the address at  10000018 data is : 6

    the address at  1000001C data is : 7

    the address at  10000020 data is : 8

    the address at  10000024 data is : 9

    the address at  10000028 data is : A

    the address at  1000002C data is : B

    the address at  10000030 data is : C

    the address at  10000034 data is : D

    the address at  10000038 data is : E

    the address at  1000003C data is : F

    the address at  10000040 data is : 10

    the address at  10000044 data is : 11

    the address at  10000048 data is : 12

    the address at  1000004C data is : 13

    the address at  10000050 data is : 14

    the address at  10000054 data is : 15

    the address at  10000058 data is : 16

    the address at  1000005C data is : 17

    the address at  10000060 data is : 18

    the address at  10000064 data is : 19

    the address at  10000068 data is : 1A

    the address at  1000006C data is : 1B

    the address at  10000070 data is : 1C

    the address at  10000074 data is : 1D

    the address at  10000078 data is : 1E

    the address at  1000007C data is : 1F
    ....................

    11.4 本章小结

    通过本章的学习,在仅仅使用PS可以对DDR3读写,这样在处理一些速度不快但是量很大的数据时很方便,当然这种方式每次读写都需要CPU干预,效率是比较低的,主要看需求吧。

    淘宝店铺:https://osrc.taobao.com

    官网论坛:www.osrc.cn

  • 相关阅读:
    win8系统下,python 2.7安装xlrd,xlutils和xlwt的方法
    phone number
    string to int
    Linux P2V Azure
    Azure IaaS 知识点小节
    Exchange端口列表
    自签名证书和私有CA签名的证书的区别 创建自签名证书 创建私有CA 证书类型 证书扩展名(转)
    Power BI REST API
    Web App 压力测试
    Azure IaaS限制
  • 原文地址:https://www.cnblogs.com/milinker/p/5828267.html
Copyright © 2011-2022 走看看