Vivado QSPI固化流程中的双FSBL策略与版本兼容性解析

张开发
2026/6/9 15:09:32 15 分钟阅读
Vivado QSPI固化流程中的双FSBL策略与版本兼容性解析
1. Vivado QSPI固化问题的背景与根源最近在Vivado 2017.4版本中使用QSPI方式固化程序时遇到了一个奇怪的现象Flash擦除操作显示成功但最终程序却无法正确写入Flash。这个问题困扰了我好几天直到深入研究了Xilinx的更新日志才找到答案。原来从Vivado 2017.3版本开始Xilinx为了统一Zynq-7000和Zynq UltraScale系列芯片的QSPI Flash编程流程对底层实现做了重大调整。这个调整带来的一个副作用就是在Zynq-7000平台上如果使用QSPI引导模式启动指定的FSBL会尝试从Flash加载分区这直接导致了Flash编程时的异常行为。这个问题具体表现为两种症状要么根本无法下载到Flash要么下载后程序无法正常启动。我在实际项目中两种情况都遇到过特别是后者更让人头疼——看似下载成功了但重启后系统就是不工作。2. 双FSBL策略的解决方案2.1 为什么需要两个FSBL经过多次尝试和验证我发现最可靠的解决方案是创建两个独立的FSBL工程。第一个FSBL专门用于生成BOOT.bin文件第二个FSBL则专门用于实际的Flash编程操作。这种分离的策略完美避开了Xilinx引入的兼容性问题。第一个FSBL我们称为fsbl_boot保持标准配置不做任何修改它的唯一任务就是参与生成BOOT.bin文件。第二个FSBL称为fsbl_load则需要特殊配置关键是要修改启动模式寄存器强制系统以JTAG模式启动即使我们实际上是在进行QSPI编程。2.2 环境变量配置在开始具体操作前我们需要设置一个关键的系统环境变量变量名XIL_CSE_ZYNQ_UBOOT_QSPI_FREQ_HZ 变量值10000000这个变量控制QSPI Flash的通信频率设置为10MHz是一个比较保守且可靠的值。设置完成后记得重启电脑使环境变量生效。我在多个项目中发现忽略这一步往往会导致后续操作失败。3. 详细操作步骤解析3.1 硬件配置与bit文件生成首先在Vivado中配置PS端选择QSPI模式。这里有个关键选择Single SS 4bit IO还是Dual Quad SPI。这个选择取决于你的硬件设计如果板卡上只有一颗QSPI Flash芯片选择Single SS 4bit IO如果有两颗Flash芯片选择Dual Quad SPI配置完成后保存设计并生成bit文件。这里有个小技巧建议在生成bit文件前先做一次设计验证Validate Design确保没有配置错误。3.2 创建BOOT.bin文件启动SDK后首先创建第一个FSBL工程fsbl_boot。这个工程保持默认配置即可不需要做任何修改。然后按照以下步骤生成BOOT.bin右键点击fsbl_boot工程选择Create Boot Image在弹出的窗口中按顺序添加三个文件fsbl.elfbootloader类型top.bitdatafile类型应用程序的.elf文件datafile类型点击Create Image生成BOOT.bin我建议把这些文件都放在同一个目录下这样管理起来更方便。在实际项目中我遇到过因为文件路径太长导致的问题所以最好使用简短的路径。3.3 创建专用FSBL加载程序接下来创建第二个FSBL工程fsbl_load这个工程需要特殊配置在main.c中找到Read bootmode register部分添加代码BootModeRegister JTAG_MODE;或者在fsbl_debug.h中添加#define FSBL_DEBUG_INFO这个修改的关键作用是强制系统以JTAG模式启动从而绕过QSPI模式下的bug。同时开启调试信息可以在串口输出中看到更多详细信息方便排查问题。4. QSPI Flash编程实战4.1 硬件准备在进行实际编程前需要确保开发板电源稳定模式开关切换到QSPI启动位置JTAG连接可靠我遇到过不少因为硬件连接不良导致的问题建议在开始前仔细检查所有物理连接。4.2 编程操作步骤在SDK中选择Xilinx - Program Flash加载两个关键文件之前生成的BOOT.binfsbl_load工程生成的fsbl_load.elf选择正确的Flash类型与Vivado中的配置一致点击Program开始烧写烧写过程中建议通过串口监视输出信息。正常情况下你应该能看到完整的擦除、编程、校验过程。如果中途出现错误串口输出通常会给出有价值的线索。4.3 验证与测试编程完成后不要急着断电。先通过串口确认是否有正确的启动信息输出。然后断电再上电观察系统是否能从QSPI Flash正常启动。如果启动失败可以尝试以下排查步骤检查BOOT.bin文件是否完整确认Flash类型选择是否正确验证环境变量是否设置正确检查硬件连接特别是QSPI的时钟和数据线5. 不同QSPI配置的注意事项5.1 Single vs Dual模式选择Single模式使用单颗Flash芯片4线接口Dual模式使用两颗Flash芯片共享时钟和部分控制信号。选择错误会导致编程失败或性能下降。我建议在设计初期就明确Flash配置并在所有工具中保持一致的设置。5.2 时钟频率优化虽然我们设置了保守的10MHz频率但在实际产品中可能需要优化。可以通过以下步骤调整逐步提高XIL_CSE_ZYNQ_UBOOT_QSPI_FREQ_HZ的值每次修改后测试编程可靠性和启动成功率找到最高稳定工作频率注意频率设置过高可能导致编程失败或系统不稳定。我在一个项目中曾经将频率提升到30MHz但在高温环境下出现了可靠性问题最后不得不降回20MHz。5.3 跨版本兼容性考虑虽然本文聚焦2017.4版本但这个双FSBL策略在其他版本也可能有用。特别是在以下情况从旧版本迁移到新版本的项目需要同时支持多种硬件平台的项目遇到类似QSPI编程问题的场景建议在项目文档中明确记录使用的策略和配置这对后续维护和升级很有帮助。我在维护一个跨版本项目时详细记录了每个版本的特殊配置这为后续的问题排查节省了大量时间。

更多文章