Vivado QSPI固化流程优化:双FSBL策略与关键环境变量配置详解

张开发
2026/4/12 3:06:27 15 分钟阅读

分享文章

Vivado QSPI固化流程优化:双FSBL策略与关键环境变量配置详解
1. Vivado QSPI固化问题的背景与根源最近在Vivado 2017.4版本中使用QSPI方式固化程序时遇到了一个让人头疼的问题Flash擦除操作显示成功但程序始终无法正常写入。经过一番排查发现这个问题其实源于Xilinx官方在Vivado 2017.3版本引入的一个改动。这个改动本意是好的 - Xilinx希望统一Zynq-7000和Zynq UltraScale系列的QSPI Flash使用流程。但就是这个统一带来了意想不到的问题。具体来说在QSPI引导模式下启动时指定的FSBL会尝试从Flash加载分区这直接导致了Flash编程的错误行为。结果就是要么无法下载程序到Flash要么下载后无法正常启动。这个问题困扰了我好几天直到发现需要采用双FSBL策略才能解决。简单来说就是需要创建两个不同功能的FSBL程序一个专门用于生成BOOT.bin文件另一个则专门用于实际的Flash编程操作。这种看似绕路的方法实际上完美避开了官方改动引入的陷阱。2. 关键环境变量的配置2.1 XIL_CSE_ZYNQ_UBOOT_QSPI_FREQ_HZ的作用在开始具体操作前我们需要先配置一个关键的环境变量XIL_CSE_ZYNQ_UBOOT_QSPI_FREQ_HZ。这个变量控制着QSPI Flash的通信频率默认情况下可能不适合所有板卡。我建议将这个值设置为1000000010MHz这个值在大多数情况下都能稳定工作。设置方法很简单右键点击我的电脑选择属性进入高级系统设置点击环境变量按钮在系统变量中新建一个变量变量名XIL_CSE_ZYNQ_UBOOT_QSPI_FREQ_HZ变量值10000000设置完成后记得重启电脑使环境变量生效。这个步骤看似简单但非常重要它确保了后续QSPI操作使用正确的通信频率。2.2 QSPI模式的选择在Vivado中配置PS端时QSPI模式的选择也很关键。主要有两种常见模式Single SS 4bit IO适用于单颗QSPI Flash芯片4线模式Dual Quad SPI适用于双QSPI Flash芯片配置选择哪种模式取决于你的硬件设计。以我最近做的一个项目为例使用的是单颗QSPI Flash所以选择了Single SS 4bit IO模式。选错模式会导致后续编程失败所以一定要确认清楚你的硬件配置。3. 双FSBL工程的创建与配置3.1 生成BOOT.bin的FSBL工程第一个FSBL工程的主要任务是生成BOOT.bin文件。这个工程的创建比较常规在Vivado中生成bit文件后启动SDK确保bit文件被正确选中新建一个FSBL工程这个工程不需要做任何修改右键点击FSBL工程选择Create Boot Image在创建BOOT.bin的过程中需要添加三个关键文件fsbl.elf刚创建的FSBL可执行文件作为bootloadertop.bitFPGA的比特流文件tt.elf需要固化的应用程序可执行文件这三个文件的添加顺序很重要FSBL必须第一个bit文件第二个应用程序第三个。点击Create Image后就会在指定目录生成BOOT.bin文件。3.2 用于编程Flash的FSBL工程第二个FSBL工程我习惯命名为fsbl_load才是解决这个问题的关键。这个工程需要在main.c文件中做一个小修改找到Read bootmode register的位置添加一行代码BootModeRegister JTAG_MODE;这行代码的作用是将启动模式强制设置为JTAG模式从而避免FSBL尝试从QSPI Flash加载程序。这是解决官方bug的核心技巧。另外我建议在fsbl_debug.h文件中添加#define FSBL_DEBUG_INFO这样可以启用串口调试信息输出方便排查问题。4. 完整的QSPI Flash编程流程4.1 准备工作在开始编程前需要确保硬件板卡的模式开关已切换到QSPI启动模式两个FSBL工程都已正确编译BOOT.bin文件已生成环境变量已正确设置4.2 编程步骤在SDK中选择Xilinx - Program Flash在弹出的对话框中选择BOOT.bin文件由第一个FSBL工程生成选择fsbl_load.elf文件由第二个FSBL工程生成设置Flash Type这个必须与之前在Vivado中设置的QSPI模式一致点击Program按钮开始编程编程过程中可以通过串口查看fsbl_load输出的调试信息确认编程是否正常进行。编程完成后建议给板卡断电再上电测试QSPI启动是否正常。5. 常见问题排查在实际操作中可能会遇到各种问题。以下是我总结的几个常见问题及解决方法编程失败检查环境变量是否设置正确QSPI模式是否与硬件匹配两个FSBL工程是否都正确编译。编程成功但无法启动可能是BOOT.bin文件生成有问题检查三个文件的添加顺序是否正确或者尝试重新生成BOOT.bin。速度慢可以尝试调整XIL_CSE_ZYNQ_UBOOT_QSPI_FREQ_HZ的值但不要超过Flash芯片的额定频率。调试信息不显示确认fsbl_debug.h中已定义FSBL_DEBUG_INFO并检查串口连接和设置是否正确。我在实际项目中采用这套方法后QSPI固化成功率大大提高。虽然步骤看起来有点多但一旦熟悉后整个过程其实很顺畅。关键是要理解每个步骤的作用这样遇到问题时才能快速定位和解决。

更多文章