zynq的三种启动方式(JTAG,SD,QSPI)

本文介绍zynq上三种方式启动文件的生成和注意事项,包括只用片上RAM(OCM)和使用DDR3两种情况

JTAG方式

JTAG方式是调试中最常用的方式,在SDK中

  • 在“Project Explorer”窗口工程上右键->Debug As->Debug Configurations可以看到以下窗口

zynq的三种启动方式(JTAG,SD,QSPI)_第1张图片

  • 首次打开左边窗口中Xilinx C/C++ application(GDB)下没有子项,这时双击Xilinx C/C++ application(GDB)即可新建一个调试;
  • 这时右边窗口会自动填充如上图,若没有则手动填入;
  • 在右边Application窗口指定要下载调试的.elf文件;
  • 在右边STDIO Connection可以指定标准输入输出串口,即printf打印串口,若这里选择开发板上uart的com口,则调试时printf的信息打印到调试时Console窗口,同时也可从Console窗口输入数据,以此将数据通过串口发送到开发板上
  • 以上设置完成后点击Debug即可开始调试;
  • 若以上在“Project Explorer”窗口工程上右键->Run As->Run Configurations;配置与此类似,最后点击run即可开始运行,只是不是调试而是直接上板运行。

只用OCM

只用OCM指不使用DDR3的方式,与使用DDR3的方式略有不同。这里不用FSBL来加载PL部分的.bit文件和第二阶段启动程序(裸机程序),而直接用BootROM加载裸机程序到OCM,即将裸机程序当做FSBL来运行,当然还要以下处理才可以:

  • 包含进头文件:#include “ps7_init.h”
  • 在裸机程序main函数开始处调用:ps7_init()
  • 从design_1_wrapper_hw_platform_1目录复制ps7_init.c和ps7_init.h文件到裸机程序所在的src目录中

注意:这里样调用ps7_init()只适用于只用OCM的情况,经测试打开DDR3后再这样调用会在ps7_init()中初始化失败,调试发现在初始化PLL时失败(原因未知)。

为何要调用ps7_init()呢?从上面图片调试可以看到初始化文件(Initialization files)ps7_init.tcl,其与ps7_init()效果相同;同时在调试配置窗口右下角也可以看到“Summary of operations to be performed”也有调试时的运行过程,也有调用ps7_init等,之后再加载要调试的elf;由于不是通过JTAG运行,所以没有运行这里ps7_init.tcl中,所以直接在裸机程序开始处调用ps7_init()。

这里没有使用FSBL,不能加载.bit文件(zynq启动过程另介绍),所以只适用于没有使用PL(包括PL逻辑或PL的IO等)的情况;由于OCM大小为256KB,而在BootROM阶段只能访问192KB,所以“只用OCM”时要求裸机程序小于192KB才行。

从SD启动

要从SD卡启动,则需要BOOT.bin文件(添加了BootROM识别的头信息文件),生成方式如下:

  • 在“Project Explorer”窗口工程上右键->Create Boot Image 或Xilinx Tools ->Create zynq Boot Image;可以得到以下界面

zynq的三种启动方式(JTAG,SD,QSPI)_第2张图片

  • 通常打开该窗口后各项已填好,否则需要

    1. 选择Create new BIF file
    2. 然后选择BIF文件目录
    3. 在Boot image partitions中Add裸机程序.elf文件,要将Partition type选择为bootloader
  • 确定输出文件为BOOT.bin后点击Create Image即可生成

此时只要将BOOT.bin复制到SD卡,设置板子为SD卡启动,重新上电即可。

从QSPI启动

有了以上SD启动的操作,从QSPI就比较简单了,查看部分资料,烧写到QSPI需要.mcs文件,在Create Boot Image中生成BOOT.bin的同时也生成了.mcs文件,但是在我使用SDK版本中(2015.3)生成BOOT.bin文件时发现没有.mcs文件,再查资料发现可以通过bootgen命令可以生成.mcs文件;最后从Create Boot Image窗口的上面部分有说明,只要将输出文件BOOT.bin的后缀改为.mcs即可生成.mcs格式文件。有了.mcs文件就可以下载了,Xilinx Tools ->Program Flash得到以下窗口

zynq的三种启动方式(JTAG,SD,QSPI)_第3张图片

选择.mcs文件点击Program即可。细心的朋友可以发现在选择.mcs文件时也可以选择.bin文件,经测试直接选择.bin文件下载到flash也可以成功启动,可能这就是新版SDK中不同时生成.mcs文件的原因吧。

然后设置板子为QSPI启动,重新上电即可。

使用DDR

使用DDR方式即可需要使用FSBL来加载裸机程序,同时当然也支持配置PL部分.bit文件。所以除了裸机程序工程外还需要建立FSBL程序工程,该工程直接用SDK自带FSBL模板即可,如下图

zynq的三种启动方式(JTAG,SD,QSPI)_第4张图片

注意选择使用与裸机程序同一个BSP;点击next

zynq的三种启动方式(JTAG,SD,QSPI)_第5张图片

这里选择Zynq FSBL,然后点击finish即可生成FSBL工程。

注意:若提示不能创建则通常是在BSP中没有打开对应的库(xilffs和xilrsa),如下图

zynq的三种启动方式(JTAG,SD,QSPI)_第6张图片

在“Project Explorer”窗口BSP上右键->Board Support Package Setting,打开两个库即可

zynq的三种启动方式(JTAG,SD,QSPI)_第7张图片

从SD启动

类似的,从SD卡启动也需要BOOT.bin文件,生成方法类似前面,只是在Create zynq Boot Image窗口需要Add:

  • 选择FSBL作为bootloader
  • 选择PL部分.bit文件
  • 选择裸机程序.elf

以上顺序需要注意,如下图

zynq的三种启动方式(JTAG,SD,QSPI)_第8张图片

同上,这时只要将BOOT.bin复制到SD卡,板子设置为SD卡启动,在板子重新上电即可。

从QSPI启动

类似只用OCM的情况,将.bin下载然后然后设置板子为QSPI启动,重新上电即可。

这里需要特别注意,“使用DDR”时用SD卡和QSPI启动需要在vivado中将zynq上SD模块和QSPI模块打开,不像“只用OCM”时不打开这些模块也能启动;分析查看FSBL程序可知必须要定义了XPAR_PS7_DDR_0_S_AXI_BASEADDR才能从SD或QSPI启动,所以这里也必须打开DDR模块。

注意

调试或下载出错时推荐处理步骤,直到问题解决

  1. 重新插拔下载器
  2. 板子断电后上电
  3. 关闭SDK重新打开(同时最好只打开一个SDK)
  4. 检查调试选项,是否设置好
  5. 检查zynq设置(如当用到DDR时,若选择DDR型号不对也是不能调试的)

若启动不正常可以尝试调试FSBL:

  • 若要查看FSBL打印调试信息,则在fsbl_debug.h中定义宏FSBL_DEBUG_INFO(#define FSBL_DEBUG_INFO),当然在调试设置中也要设置STDIO为对应UART(默认波特率为115200)或使用其它UART查看打印信息
  • 调试FSBL时注意,当改变板子启动方式后需要重新上电或POR复位后才生效

你可能感兴趣的:(zynq)