芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 1526|回复: 0

【zynq课程笔记】【裸机】【第10课 】【Zynq启动原理与程序固化】

[复制链接]
  • TA的每日心情
    慵懒
    2023-5-22 10:35
  • 1

    主题

    3

    帖子

    50

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    50
    发表于 2023-3-20 17:29:06 | 显示全部楼层 |阅读模式
    更多课程笔记请查看:【zynq裸机编程课程笔记合集】

    1        为什么要固化
    各位同学大家好,前面的课程,我们已经带领大家进行了使用PS的MIO控制按键和LED灯亮灭的实验,并要求大家下去之后进行一定的实验练习。相信做过实验的同学就会发现一个问题,你实验时下载进开发板的程序,开关关掉再重新打开后,就会发现刚刚做的实验不在了。也就是程序断电就丢失了。和你们平常所接触的MCU的编程不太一样。那么为什么会存在这样的情况,我们又该如何操作,以让基于Zynq的电路板也能实现程序上电自动加载呢?今天的课程我们将带大家学习Zynq的固化。
    相信大家在学习和开发的过程中都有过这样的经历:对于一个需要频繁使用的程序,每次在我们将开发板断电后,都需要打开工程,重新烧录。这大大浪费了大家的时间,而且非常的麻烦。那么有没有一种方法可以让Zynq电路板一上电就自己运行我需要的那个程序呢?这个肯定是有的,也正是我们本节课程所要讲的内容,Zynq SoC FPGA应用程序的固化。
    所谓的固化,就是将我们所需要的程序烧写到Zynq芯片连接的片外非易失性存储器中,比如SD卡、QSPI Flash、Nor Flash。这些非易失性存储器具有掉电不丢失的特性,也就是说即使程序在运行的过程中因为某些原因导致开发板断电,我们烧录进去的程序也不会丢失,在下次开发板上电时,Zynq芯片就能根据电路板上设置的Zynq启动模式,自动从对应的非易失性存储器中读取程序代码并运行。
    那么可以看得出来,我们使用Zynq设计的产品或者项目,最终要投产,固化都是必不可少的步骤。
    那么我们如何才能将程序烧到这类非易失性存储器上呢?又该如何去配置启动模式呢?本节课程,我们就从原理开始,一步步带领大家了解并掌握这项基本技能。
    2        启动方式介绍
    Zynq7000系列的芯片总共有五种启动源,分别为Jtag、NAND Flash、NOR Flash、QSPI Flash以及SD卡(特别注意,Zynq7000系列的芯片不支持EMMC启动),而具体到我们的ACZ702开发板上,支持其中的Jtag、QSPI、SD卡三种启动方式。其中的Jtag启动方式为非安全的从引导模式,程序在烧录到开发板后掉电会丢失。而QSPI和SD卡启动模式,由于程序被加载进了对应的非易失性存储器中,程序数据即使掉电也不会丢失。
    既然支持的启动模式这么多,具体到某一个电路板上,Zynq芯片怎么知道该从哪里加载程序呢?其实,对于Zynq的启动模式,都是可以通过硬件电路设置的。Zynq芯片提供了7个用于启动模式设置的引脚(Boot Mode Pin)。这些引脚与PS GPIO的MIO [8:2]复用,其中MIO[5:2]控制zynq的启动模式,MIO[6]控制是否启用锁相环PLL,MIO[8:7]则分别用来控制两个MIO bank电压信号电平。其具体关系如下表所示(UG585::Chapter 6::Table6-4):
    1.png
    对于我们的ACZ702开发板,因为仅提供了QSPIFlash、SD卡、JTAG相关的硬件,没有设置Nand Flash以及Nor Flash,所以无法实现从Nand和Nor Flash中启动,也就是说我们的开发板仅支持从QSPI Flash、SD卡、JTAG模式启动,当然,这个设计属于Zynq芯片管脚和资源最大化利用的典型设计。这个并非是我们开发板本身的局限性,而是因为Zynq芯片内部有非常多的功能,每个功能使用时都有若干个信号需要通过MIO引出到芯片的物理管脚上,但是能够用于这些功能信号引出的MIO管脚数量又是非常有限的,导致很多功能无法同时存在于同一个硬件电路板上,比如为了能够实现USB、以太网等,不得不舍弃Nand和Nor Flash。关于处理器系统的功能使用和MIO分配,是一项需要多方面考虑权衡的工作,针对不同的应用场景和需求,合理选择使用的PS的外设功能以及MIO。
    根据开发板版本的不同,开发板设置启动模式的方式也有所不同。下图为v1.0和v2.0的ACZ702开发板上MIO[5:2] (PS_QSPI_DQ3~PS_QSPI_DQ0)的引脚电路:
    2.png

    可以看到,DQ0、DQ1直接接地,也就确定了开发板上JTAG为级联模式,而QSPI和SD卡启动模式的选择,则是由用户将DQ2和DQ3与VCC3P3和GND相连来实现。拿开发板来说,ACZ702V2.0通过拨码开关控制DQ2和DQ3究竟是连接到VCC3P3还是GND来设置开发板启动模式。ACZ702V1.0则是通过跳线帽控制DQ2和DQ3究竟是连接到VCC3P3还是GND来设置开发板启动模式。具体的启动方式切换表如下:

    ACZ702V1.0开发板启动模式
      
      
    MIO4 + 3.3V
    MIO5 + GND
      
    JTAG
      
    断开
    短接
      
    QSPI
      
    断开
    断开
      
    SD card
      
    短接
    断开
      
    NAND
      
    芯路恒ACZ702开发板未设计使用板载NAND FLASH
    ACZ702V2.0 开发板启动模式
      
    模式
      
    拨码开关
    0
    1
      
    JTAG
      
      
    QSPI
      
      
    SD card
      
    不同启动模式对应的硬件操作如下:
    3.png
    4.png

    3        启动过程分析
    了解了Zynq的启动方式之后,一些思考的比较深的同学可能会有疑问,就是这些模式脚是怎么影响启动模式的,Zynq的启动又是怎样的一个流程呢? Xilinx的官方手册UG585中(UG585::Chapter 6:: Figure 6‐1:)给出了Zynq的引导过程。
    5.png

    从图中可以看出,Zynq的启动过程一共分为以下三个阶段:
    l 阶段0: BOOT ROM(ZYNQ厂家固化代码)
    l 阶段1: FSBL (FirstStage Bootloader),通过SDK工具来生成。
    l 阶段2: 操作系统启动过程(u-boot)
    其中阶段0运行的是厂商已经固化好的程序,它会读取Boot mode寄存器来判断是哪种启动方式,并从对应启动设备中加载FSBL。
    阶段1运行的是用户通过SDK工具生成的FSBL代码和可执行文件,也就是我们常说的bin文件。它会初始化CPU、PS的必要的外设控制器,如DDR,串口、MIO等,并对PL进行配置。阶段2运行的是操作系统,为可选阶段,通常为Linux系统的启动。对于嵌入式裸机程序而言,通常只需进行阶段0和阶段1即可。
    因此对于我们来说,需要做的就是通过SDK生成阶段1所需的bin文件,这个文件由工程.elf+工程.bit+FSBL.elf文件构成。工程.bit就是我们通过Vivado软件生成的bitstream文件,用于配置PL;工程.elf文件,则是SDK编译后产生的链接文件;FSBL.elf则是在SDK软件中通过官方模板生成的链接文件。
    4        实验目的
    介绍完了Zynq程序固化相关的理论知识,接下来我们就以简单粗暴的方式,带领大家体验一下Zynq程序固化的具体操作方法。课程还是以第8课的例程为基础,带领大家一步步生成所需的文件,然后烧录到对应的非易失性存储器中,并最终实现程序的上电自动运行。
    5        硬件平台
    将程序固化到QSPI不需要使用到额外外设,准备好开发板即可。
    将程序固化到SD卡中则需要准备SD卡一张,以及读卡器一个,用来将bin文件存储进SD卡。
    6        IP配置
    ZYNQ固化不需要创建新的工程,打开LED例程,点击Open Block Design打开模块设计,双击ZYNQ核修改配置,随后进入MIO Configuration界面进行如下操作:
    1.使能Memory Interfaces下的           QuandSPI Flash,IO选择MIO1…6
    2.使能I/O peripherals下的SD0,IO选择MIO40…45
    3.设置Banck1电平标准为LVCMOS 1.8V
    操作1,2的作用是使能相应存储器的控制器,对MIO的选择是根据QSPI Flash和SD在开发板上连接的引脚所决定的,它们在硬件上连接的引脚如下图所示:
    6.png

    图 3  QSPI Flash引脚连接
    7.png
    图 4  SD引脚连接
    从图中我们可以看出,它们都是直接连接在PS上的,因此不需要进行管脚约束。这里我们可以直接点击Bitstream来生成比特流,软件会自动帮我们对设计进行更新。
    7        创建FSBL工程
    通过前面的操作,我们已经完成了硬件系统的设计,并得到了相应的FPGA配置文件(bit)。
    接下来我们需要更新新的硬件资源描述文件到SDK中, 在菜单栏中点击File->Export->Export Hardware,以生成本系统的硬件描述文件。导出时勾选包含bitstream文件。
    导出硬件描述文件后我们就可以点击File->Launch SDK来打开Vivado提供的SDK集成开发软件。此时软件会根据我们新导出的硬件资源描述文件对原来的工程重新编译,等待编译完成,软件就会生成我们所需要的工程.elf文件。

    那么此时,我们已经得到了工程.bit文件和工程.elf文件,接下来,还需要生成一个FSBL.elf文件。为了能够创建FSBL工程,我们需要右键单击LED_bsp,勾选xilffs以启用FatFs文件系统。

    该系统是面向小型嵌入式的一种通用FAT文件系统,利用SPI Flash芯片驱动或者SD驱动,把FatFs文件系统代码移植到工程中,就可以利用文件系统的各种函数,对SPI Flash芯片以文件格式进行读写操作。
    接下来点击File->New->Application Project创建一个名为FSBL的工程,创建时选择使用原工程的bsp,模板选择Zynq FSBL。
    创建完FSBL工程后,我们不需要对工程进行任何操作,工程会自动编译出我们所需要的FSBL.elf文件。
    8.png
    至此三个文件我们都已经得到,接下来便需要通过SDK使用这几个文件生成我们所需要的bin文件。
    8        生成bin文件
    首先点击LED工程,再点击软件上方功能栏的Xilix,选择Create Boot Image,就会进入bin文件生成界面。此时软件自动为我们添加好了所需的三个文件,检查文件是否正确,并记住bin文件的存储路径。(这里如果不先点击LED工程,打开界面时软件只会添加部分文件,剩余的文件需要手动添加)
    9.png
    这里的BOOT.bin便是我们所需要的bin文件,至于LED.bif文件,该文件为启动信息文件,会按引导顺序指定引导映像的每个组件。
    点击Create Image软件便会在指定路径中生成bin文件以及一个.bif文件,接下来我们便可以开始固化环节。
    9        固化到QSPI
    首先在断电情况下将开发板启动模式设置为Jtag,随后连接硬件
    10.png
    12.png

    由于设计只是进行固化操作,对供电要求较低,所以我们使用Type-C供电就可以了,接着拨动拨码开关到USB侧,给开发板上电。那么接下来就可以烧录镜像文件了
    还是点击Xilinx,接着点击ProgramFlash,配置烧录任务。在ImageFile项中选择生成的BOOT.bin文件,FSBL File项中选择FSBL.elf文件。这两个文件的相对路径,可以参考下图:
    13.png
    配置完成后点击Program开始烧录,烧录的时间可能较长,需要耐心等待。烧录成功后Console栏会打印信息提醒。
    14.png
    接着将开发板断电,设置启动模式为QSPI后再从新上电。
    15.png
    等待片刻,直到代表PL侧配置完成的LED灯亮起。接着长按按键S1,PS侧LED灯D4如果能够不断亮灭,则说明固化成功。反之固化失败,用户需要检查自己前面步骤是否符合流程。
    16.png
    10    固化到SD卡
    在进行固化之前,我们需要对SD卡进行格式化操作,来确保SD卡的文件系统是FAT32格式,那么怎做呢:
    将SD卡插进读卡器中,再将读卡器插到电脑的USB接口上。接着打开电脑的资源管理器,右键SD选择格式化,在格式化的选项中选择操作系统为FAT32接着点击开始,等待格式化完成。
    格式化完成之后,我们需要将将固化使用到的bin文件拷贝到SD卡根目录中,这里给出bin文件的相对路径以供参考。
    17.png
    将bin文件拷贝到SD卡后,接下来从电脑上弹出SD卡设备,将SD从读卡器上取出。确认开发板是断电状态,将SD卡插入到开发板的SD卡卡槽上,然后设置启动模式为SD卡启动。
    18.png
    接下来为开发板上电,等待片刻,直到代表PL侧配置完成的LED灯亮起。接着长按按键S1,PS侧LED灯D4如果能够不断亮灭,则说明固化成功。反之固化失败,用户需要检查自己前面步骤是否符合流程。
    11    总结
    至此,关于Zynq的程序固化的相关理论和实验内容我们就介绍完毕了。总结一下,这节课中,我们带领大家了解了Zynq的几种启动方式和启动的几个阶段,并带着大家一起完成了QSPI和SD卡的固化实验。那么在整个固化的过程中呢,我们最终所需要做的就是生成Boot.bin文件,随后将这个文件烧写到QSPI Flash或者存储到SD卡中。
    希望大家下去之后,按照本课程讲解的内容和方法,自己完成QSPI FLASH和SD卡的固化实验过程。
    如果大家自己在固化的过程中出现问题,可以检查以下我们统计的高频错误:
    1.       修改了硬件逻辑系统后硬件资源描述文件有没有导出
    2.       生成bin文件时选择的三个文件是不是正确的。
    对于实在不知道错误在哪,无法解决的,欢迎大家在我们的群内提问,或者在我们的论坛www.corecourse.cn中搜索“zynq裸机编程课程笔记合集”在对应的课程帖中提问交流。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-4-29 02:41 , Processed in 0.115812 second(s), 35 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表