从SD卡到QSPI:ZYNQ MPSoC启动模式切换与固件烧录实战

张开发
2026/4/12 13:25:12 15 分钟阅读

分享文章

从SD卡到QSPI:ZYNQ MPSoC启动模式切换与固件烧录实战
1. ZYNQ MPSoC启动模式基础解析第一次接触ZYNQ MPSoC的开发者可能会被它的多种启动方式搞晕。其实就像我们电脑可以选择从硬盘、U盘或者光盘启动一样ZYNQ也支持从SD卡、QSPI Flash、NAND Flash等多种存储介质启动。我刚开始接触时也犯过迷糊直到后来在实际项目中反复折腾才真正搞明白其中的门道。ZYNQ MPSoC的启动模式由板载的四个模式开关Mode Pins决定。这四个开关的不同组合对应不同的启动方式就像密码锁一样需要正确设置。最常见的两种模式是SD卡启动开发调试阶段常用和QSPI Flash启动产品部署阶段常用。SD卡启动适合快速迭代开发而QSPI启动则更适合最终产品因为它不需要外部存储介质系统上电就能自动运行。这里有个容易踩坑的地方模式开关的状态读取是在上电复位POR时进行的。也就是说如果你在设备运行过程中拨动开关是不会有任何变化的。这个特性我是在一个深夜调试时发现的当时死活无法切换启动模式后来才意识到需要完全断电后再上电。2. 从SD卡启动到QSPI启动的完整切换流程2.1 准备工作与环境搭建在开始切换之前我们需要准备好以下工具和环境安装好Vitis SDK的开发机建议2020.1及以上版本USB转串口调试工具如FT232支持ZYNQ MPSoC的开发板一根可靠的JTAG下载器我强烈建议在开始操作前先用SD卡启动方式确保系统基本功能正常。这样可以排除硬件问题把注意力集中在启动模式切换本身。具体操作是将模式开关设置为1-ON, 2-ON, 3-OFF, 4-OFF对应SD0启动模式然后上电观察串口输出。2.2 QSPI Flash烧录实战烧录QSPI Flash是整个过程中最关键的环节。这里我分享一个自己总结的三步法第一步切换至JTAG模式 将四个模式开关全部设置为ON这样芯片会进入JTAG模式允许我们通过Vitis直接编程Flash。这里有个细节要注意有些开发板的开关标注可能不太直观建议用万用表确认实际连接状态。第二步准备烧录文件 在Vitis中创建Flash编程工程时需要特别注意文件的选择。除了常规的boot.bin外还需要包含FSBLFirst Stage Bootloader和应用程序镜像。我建议先用默认配置生成一个简单的测试镜像验证烧录流程是否正常。# 示例生成boot.bin的命令行方式 bootgen -image boot.bif -arch zynqmp -o BOOT.BIN -w on第三步执行烧录操作 在Vitis菜单中选择Xilinx - Program Flash在弹出的对话框中选择正确的Flash型号如MT25QU256设置偏移地址为0x00000000选择刚才生成的BOOT.BIN文件点击Program开始烧录烧录过程中控制台会显示进度信息。根据Flash容量不同这个过程可能需要几分钟。我曾经遇到过烧录失败的情况后来发现是JTAG连接不稳定导致的换成质量更好的下载线后就解决了。3. PMU固件集成与boot.bin深度解析3.1 PMU固件的重要性PMUPlatform Management Unit是ZYNQ MPSoC中一个非常重要的子系统负责电源管理、错误监测等功能。如果没有正确集成PMU固件系统虽然可能启动但会缺少关键的管理功能串口也会持续输出PMU-FW is not running的警告信息。我在一个工业控制项目中就吃过这个亏。当时系统看似运行正常但在长时间工作后出现了莫名其妙的复位问题。后来排查发现就是因为缺少PMU固件导致温度监控和电源管理功能缺失。添加PMUFW后系统稳定性得到了显著提升。3.2 boot.bin文件结构详解boot.bin是ZYNQ MPSoC启动过程中读取的第一个文件它的结构很有讲究。通过bootgen工具我们可以将多个组件打包成一个镜像文件。一个完整的boot.bin通常包含以下部分FSBLFirst Stage Boot LoaderPMU固件pmufw.elfPL端比特流可选应用程序镜像创建boot.bin时组件的顺序非常重要。正确的顺序应该是PMUFW - FSBL - 其他组件。我在早期项目中经常搞错这个顺序导致系统无法正常启动。# 示例boot.bif文件内容 the_ROM_image: { [bootloader]fsbl.elf pmufw.elf [destination_devicepl]system.bit u-boot.elf }3.3 集成PMU固件的实操步骤在Vitis中集成PMU固件到boot.bin的过程其实很简单但有几个关键点需要注意确保使用的pmufw.elf与你的芯片型号匹配在创建boot image时通过Add按钮添加pmufw.elf调整组件顺序使PMUFW位于FSBL之前对于包含PL配置的项目记得添加.bit文件一个常见的错误是使用不匹配的PMUFW版本。我有次使用了旧版SDK生成的pmufw.elf结果系统启动后PMU功能异常。后来从当前SDK安装目录下重新获取对应版本的固件才解决问题。4. 系统验证与故障排查4.1 上电验证的正确姿势完成QSPI烧录和模式开关设置后真正的考验才开始。验证系统是否正常启动需要关注以下几个关键点串口输出信息健康的系统会显示清晰的启动日志包括PMU初始化、FSBL执行、应用程序加载等阶段硬件状态指示灯大多数开发板都有电源指示灯和用户LEDPL端功能验证如果设计包含PL逻辑可以观察流水灯等简单功能是否正常我习惯使用一个简单的检查清单[ ] 模式开关设置正确QSPI模式通常为1-ON,2-ON,3-OFF,4-ON[ ] 串口终端配置正确波特率通常为115200[ ] 电源供应稳定[ ] 复位信号正常4.2 常见问题与解决方案在实际项目中我遇到过各种各样的启动问题。以下是几个典型案例及其解决方法案例1串口无任何输出 可能原因模式开关设置错误QSPI内容未正确烧录电源问题 解决方法确认开关设置用SD卡启动验证硬件基本功能检查电源电压和电流案例2PMU-FW未运行警告 可能原因boot.bin中缺少pmufw.elfPMU固件顺序不正确使用了不匹配的PMUFW版本 解决方法检查boot.bin组成确认pmufw.elf位置和版本重新生成boot image案例3系统启动后随机复位 可能原因电源不稳定时钟问题PMU监控触发 解决方法添加PMU固件检查电源设计分析复位原因寄存器5. 进阶技巧与最佳实践经过多个项目的实践我总结出了一些提高成功率的技巧版本管理对boot.bin的各个组件做好版本记录特别是当SDK升级后要重新生成所有组件备份策略在烧录QSPI前先读取原始内容备份以防需要恢复调试技巧在FSBL中添加自定义调试信息帮助定位启动问题电源考量QSPI启动时要注意电源时序特别是使用外部Flash时对于量产环境我还建议建立自动化烧录流程开发定制化的测试固件实现启动失败后的恢复机制在最近的一个项目中我们实现了通过SD卡自动更新QSPI内容的功能。这样现场升级时就不需要打开设备连接JTAG了大大提高了维护效率。实现这个功能的关键是在应用程序中添加QSPI编程逻辑并设计可靠的双备份机制防止升级失败导致设备变砖。

更多文章