本文介绍zynq上三种方式启动文件的生成和注意事项,包括只用片上ram(ocm)和使用ddr3两种情况。jtag方式
jtag方式是调试中最常用的方式,在sdk中
在“project explorer”窗口工程上右键->debug as->debug configurations可以看到以下窗口
首次打开左边窗口中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;可以得到以下界面
通常打开该窗口后各项已填好,否则需要
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得到以下窗口
选择.mcs文件点击program即可。细心的朋友可以发现在选择.mcs文件时也可以选择.bin文件,经测试直接选择.bin文件下载到flash也可以成功启动,可能这就是新版sdk中不同时生成.mcs文件的原因吧。
然后设置板子为qspi启动,重新上电即可。
同上,这时只要将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模块。
注意
调试或下载出错时推荐处理步骤,直到问题解决
. 重新插拔下载器
. 板子断电后上电
. 关闭sdk重新打开(同时最好只打开一个sdk)
. 检查调试选项,是否设置好
. 检查zynq设置(如当用到ddr时,若选择ddr型号不对也是不能调试的)
若启动不正常可以尝试调试fsbl:
. 若要查看fsbl打印调试信息,则在fsbl_debug.h中定义宏fsbl_debug_info(#define fsbl_debug_info),当然在调试设置中也要设置stdio为对应uart(默认波特率为115200)或使用其它uart查看打印信息
. 调试fsbl时注意,当改变板子启动方式后需要重新上电或por复位后才生效
使用ddr
使用ddr方式即可需要使用fsbl来加载裸机程序,同时当然也支持配置pl部分.bit文件。所以除了裸机程序工程外还需要建立fsbl程序工程,该工程直接用sdk自带fsbl模板即可,如下图
注意选择使用与裸机程序同一个bsp;点击next
这里选择zynq fsbl,然后点击finish即可生成fsbl工程。
注意:若提示不能创建则通常是在bsp中没有打开对应的库(xilffs和xilrsa),
在“project explorer”窗口bsp上右键->board support package setting,打开两个库即可
从sd启动
类似的,从sd卡启动也需要boot.bin文件,生成方法类似前面,只是在create zynq boot image窗口需要add:
选择fsbl作为bootloader
选择pl部分.bit文件
选择裸机程序.elf