ZYNQ 程序固化与升级指南

张开发
2026/4/22 9:07:40 15 分钟阅读

分享文章

ZYNQ 程序固化与升级指南
文章目录前言一、ZYNQ 烧录文件的组成1.1 裸机/裸跑程序1.2 Linux 系统二、核心概念FSBL 是什么2.1 FSBL 的定义2.2 FSBL 的核心职责2.3 FSBL 的生成时机三、更底层的起点BootROM3.1 BootROM 是什么3.2 BootROM 的核心职责3.3 为什么需要 BootROM3.4 BootROM 与 FSBL 的分工四、完整的程序加载流程4.1 启动链路全景图4.2 简化版流程图五、常见问题与解答Q1什么情况需要烧录 .elfQ2既然 .elf 被打包在 BOOT.bin为什么还要每次固化 .elfQ3XSA文件不变是不是就不需要更换 .elfQ4升级过程会自动校验吗六、升级文件的产生流程6.1 完整的文件生成链路6.2 不同场景下的升级文件七、实践一键烧录脚本7.1 使用说明7.2 运行日志7.3 U-Boot 命令详解八、总结附录常用 Flash 类型参数前言在 ZYNQ 开发过程中程序如何固化、如何升级是每个开发者都会遇到的问题。本文将以问答形式系统梳理 ZYNQ 程序烧录相关的核心知识点帮助你从原理到实践全面掌握。一、ZYNQ 烧录文件的组成1.1 裸机/裸跑程序ZYNQ 的烧录文件通常打包成一个BOOT.bin文件包含三个核心部分组成部分文件格式作用FSBL.elf第一阶段引导加载程序初始化PS端硬件硬件逻辑.bit配置FPGA逻辑电路用户程序.elf在ARM上运行的应用程序这三部分按照FSBL → BIT → ELF的顺序打包成 BOOT.bin顺序错误会导致启动失败。1.2 Linux 系统Linux 系统的启动文件更为复杂通常包含BOOT.binFSBL .bit U-BootuImageLinux内核镜像devicetree.dtb硬件描述文件uramdisk.image.gz根文件系统二、核心概念FSBL 是什么2.1 FSBL 的定义FSBL是First Stage Boot Loader第一阶段引导加载程序的缩写。简单理解ZYNQ 上电后ARM 核心执行的第一段用户程序就是 FSBL。2.2 FSBL 的核心职责职责具体内容初始化PS端配置ARM核心、DDR内存、时钟、中断等加载PL端把.bit文件配置到FPGA逻辑区域加载用户程序从Flash读取程序到DDR然后跳转执行支持安全启动可选验证镜像签名、解密等2.3 FSBL 的生成时机FSBL 是在Vitis旧称 SDK中生成的流程如下textVivado硬件设计 → 导出XSA文件 → Vitis创建FSBL工程 → 编译生成fsbl.elf关键点只要 Vivado 硬件设计变了PS配置、DDR参数、引脚分配等就必须重新生成 FSBL。三、更底层的起点BootROM3.1 BootROM 是什么BootROM是 ZYNQ 芯片内部固化、不可修改的一段只读代码位于芯片的 ROM 中。它是 ZYNQ 上电后执行的第一段代码。可以把它理解为芯片的“硬件出厂设置”——类似电脑主板的 BIOS但更底层。3.2 BootROM 的核心职责职责说明初始化基本硬件配置 CPU、时钟等最基础的功能读取启动模式检测拨码开关确定从 QSPI/SD卡/JTAG 等介质启动加载 FSBL从启动介质读取BOOT.bin头部加载到芯片内部 RAMOCM验证并跳转检查 CRC 校验和通过后跳转到 FSBL 执行3.3 为什么需要 BootROM没有 BootROMZYNQ 上电后不知道该怎么启动。核心原因要从外部 Flash 读取代码必须先有代码来初始化 Flash 控制器——这是一个“先有鸡还是先有蛋”的问题。BootROM 作为芯片内部预置的代码解决了这个悖论。3.4 BootROM 与 FSBL 的分工BootROMFSBL位置芯片内部 ROM固化外部 Flash可更新是否可修改❌ 不可修改✅ 可以修改主要任务加载 FSBL初始化 DDR、配置 PL、加载用户程序对开发者的影响只需遵守其格式要求需要根据硬件生成一句话总结BootROM 负责找到并加载 FSBL然后就把控制权交出去了。开发者无需修改它只需要按照它的要求打包 BOOT.bin 即可。四、完整的程序加载流程4.1 启动链路全景图┌─────────────────────────────────────────────────────────────┐ │ 1. 上电复位 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 2. BootROM芯片内部固定不可修改 │ │ - 初始化最基本硬件CPU、时钟等 │ │ - 读取启动模式拨码开关QSPI/SD卡/JTAG │ │ - 从启动介质读取 BOOT.bin 头部 │ │ - 验证 Header 的 CRC 校验和 │ │ - 将 FSBL 加载到 OCM芯片内部 RAM │ │ - 跳转到 FSBL │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 3. FSBL存储在 Flash 中用户可以修改 │ │ - 初始化 DDR 内存 │ │ - 配置 PL加载 .bit 文件到 FPGA │ │ - 从 Flash 读取用户程序到 DDR │ │ - 验证分区校验和 │ │ - 跳转到用户程序 │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ 4. 用户应用程序 │ │ - 裸机程序直接运行 │ │ - Linux运行 U-Boot → 加载内核 → 挂载文件系统 │ └─────────────────────────────────────────────────────────────┘4.2 简化版流程图上电复位 ↓ ┌─────────────────────────────────────────┐ │ BootROM芯片固化不可修改 │ │ 读取启动模式 → 加载FSBL → 验证 → 跳转 │ └─────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ FSBL可更新 │ │ 初始化DDR → 配置PL → 加载用户程序 → 跳转 │ └─────────────────────────────────────────┘ ↓ 用户应用程序五、常见问题与解答Q1什么情况需要烧录 .elf答案FSBL.elf文件变了或者 Flash 里没有 FSBL 时才需要。情况是否需要烧录.elfFlash是空白的第一次烧录✅ 必须Vivado硬件设计变了✅ 必须只改了C代码app.elf❌ 不需要只改了PL逻辑.bit❌ 通常不需要量产时升级固件❌ 不需要Q2既然 .elf 被打包在 BOOT.bin为什么还要每次固化 .elf这是一个很容易混淆的问题。关键在于烧录时指定的-fsbl参数和打包在BOOT.bin里的 FSBL是两个不同用途的 FSBL。烧录工具使用的FSBL打包在BOOT.bin里的FSBL存放位置电脑硬盘上的.elf文件BOOT.bin镜像内部运行时间烧录过程中临时运行正常启动时运行核心任务为烧录工具提供运行环境初始化系统并启动应用是否需要频繁更新不需要看硬件是否变化通俗理解烧录时的FSBL U盘启动盘制作一次可反复使用BOOT.bin里的FSBL C盘里的系统引导程序随系统更新而变化Q3XSA文件不变是不是就不需要更换 .elf是的完全正确。只要.xsa文件硬件平台描述文件没有变化用于烧录的fsbl.elf就完全不需要更换。日常固件升级时你只需要替换BOOT.binfsbl.elf可以视为一个固定不变的烧录“驱动”。Q4升级过程会自动校验吗是的升级过程会自动进行校验。校验分为两个层面烧录过程校验program_flash工具使用-verify选项写入后自动读取Flash内容并比对启动过程校验BOOT.bin内部机制BootROM检查Header的CRC校验和FSBL检查每个分区的校验和建议烧录命令中始终添加-verify选项确保写入数据的完整性。六、升级文件的产生流程6.1 完整的文件生成链路textVivado硬件设计 ↓ 导出 XSA文件硬件平台描述 ↓ Vitis创建工程 FSBL工程 → 编译 → fsbl.elf ↓ 应用工程 → 编译 → app.elf ↓ Boot Image打包工具bootgen ↓ BOOT.bin最终烧录文件6.2 不同场景下的升级文件升级场景需要替换的文件是否需要换fsbl.elf应用程序更新BOOT.bin否FPGA逻辑更新BOOT.bin包含新.bit否除非接口变化硬件配置变化BOOT.bin fsbl.elf是首次烧录空白板BOOT.bin fsbl.elf是七、实践一键烧录脚本以下是一个带详细打印信息的烧录脚本将所需文件放在同一文件夹双击即可完成升级echo off chcp65001nul title Zynq QSPI Flash 烧录工具 color 0AechoechoZynq QSPI Flash 一键烧录脚本echoecho. :: 设置Xilinx工具路径请根据实际安装路径修改setPATH_XILINXC:\Softwares\Xilinx\Vitis\2021.1\bin :: 检查工具路径是否存在ifnot exist%PATH_XILINX%\program_flash(echo[错误]找不到 program_flashecho请检查路径: %PATH_XILINX% pauseexit/b1)echo[1/5]Xilinx 工具路径检测: 通过 echo. :: 检查当前目录下的文件echo[2/5]检查烧录文件...setBIN_FILEsetELF_FILEfor%%fin(*.bin)do(setBIN_FILE%%fecho找到 BIN 文件: %%f)for%%fin(*.elf)do(setELF_FILE%%fecho找到 ELF 文件: %%f)echo. :: 检查 .bin 文件是否存在if%BIN_FILE%(echo[错误]当前文件夹下没有找到 .bin 文件echo请确保 BOOT.bin 或其它 .bin 文件在此目录下 pauseexit/b1)::新增强制要求 .elf 文件if%ELF_FILE%(echo[错误]当前文件夹下没有找到 .elf 文件echo烧录空白 Flash 时必须提供 fsbl.elf 文件echo请将 fsbl.elf 复制到当前目录后重试 echo.echo提示如果 Flash 中已有 FSBL 且无需更新echo请手动移除本脚本中的 .elf 检查逻辑 pauseexit/b1)::echo[3/5]文件校验通过echo将烧录 BIN: %BIN_FILE%echo使用 FSBL: %ELF_FILE% echo. :: 用户确认echo[4/5]请确认以下事项:echo1. 板卡已设置为 JTAG 模式echo2. 下载器已连接并上电echo3. 即将烧录文件: %BIN_FILE% echo.set/pconfirm确认继续烧录(Y/N): if/i not%confirm%Y(echo用户取消烧录 pauseexit/b0):: 开始烧录 echo.echo[5/5]正在烧录 QSPI Flash...echo请勿断开电源或 USB 连接... echo. call%PATH_XILINX%\program_flash-f%BIN_FILE%-offset0-flash_typeqspi-x4-single-fsbl%ELF_FILE%-verify:: 检查结果if%errorlevel% neq0(echo.echo[错误]烧录失败错误代码: %errorlevel%echo请检查:echo- 下载器是否连接正常echo- 板卡是否上电echo- flash_type 参数是否正确 pauseexit/b %errorlevel%):: 烧录成功 echo.echoecho烧录成功完成echoecho.echo下一步操作:echo1. 断开电源echo2. 将板卡启动模式切换到 QSPIecho3. 重新上电程序应从 Flash 启动 echo. pause7.1 使用说明将上述脚本保存为program_qspi.bat修改脚本中的PATH_XILINX为你的实际安装路径将BOOT.bin和fsbl.elf放在同一文件夹板卡设置 JTAG 模式连接下载器并上电双击program_qspi.bat即可完成烧录7.2 运行日志7.3 U-Boot 命令详解以下是嵌入式开发中最核心、最常用的 U-Boot 命令详解sf probe格式sf probe 总线编号 [时钟频率] [SPI模式]总线编号SPI 控制器的编号通常是 0时钟频率设置 SPI 时钟频率Hz0表示使用 Flash 芯片的默认时钟频率通常是 40-50 MHzSPI 模式SPI 工作模式0-3模式说明0CPOL0, CPHA0最常用1CPOL0, CPHA12CPOL1, CPHA03CPOL1, CPHA1说明U-Boot 中用于初始化和探测 SPI Flash 设备的命令。这是执行任何 Flash 操作读、写、擦除前必须首先运行的命令。sf erase格式sf erase 偏移地址 长度偏移地址Flash 中的起始位置十六进制长度要擦除的字节数十六进制说明U-Boot 中用于擦除 SPI Flash 数据的命令。由于 Flash 的物理特性必须先擦除才能写入数据。sf write格式sf write 内存地址 Flash偏移地址 长度内存地址数据在 DDR 内存中的源地址Flash偏移地址写入 Flash 的目标起始地址长度要写入的字节数十六进制说明U-Boot 中用于将数据写入 SPI Flash的命令。在执行此命令前必须先执行sf probe初始化 Flash并且目标区域必须已经被擦除。sf read格式sf read 内存地址 Flash偏移地址 长度内存地址数据要写入的 DDR 内存目标地址Flash偏移地址Flash 中读取的起始位置长度要读取的字节数十六进制说明U-Boot 中用于从 SPI Flash 读取数据到内存的命令。这是验证烧录结果、备份数据、调试系统时最常用的命令之一。八、总结知识点核心要点BOOT.bin组成FSBL .bit app.elf顺序固定BootROM的作用芯片内部固化的引导代码负责加载FSBLFSBL的作用上电后第一段用户程序初始化硬件、加载FPGA、启动应用FSBL生成时机在Vitis中从XSA文件编译生成何时需要烧录.elfXSA变化时或首次烧录空白板升级校验机制烧录用-verify BootROM/FSBL的CRC校验日常升级操作只需替换BOOT.binfsbl.elf固定不变附录常用 Flash 类型参数Flash类型program_flash参数单路QSPI4线qspi-x4-single最常用双路QSPI2线qspi-x2-single双片并联8线qspi-x8-dual_parallel本文基于 ZYNQ 7000 系列编写UltraScale 系列原理相同具体参数请参考对应文档。

更多文章