1. 为什么你的ZynqMP板卡JTAG启动总失败?
刚拿到一块全新的ZynqMP开发板,手边只有JTAG仿真器却没有SD卡,这时候想快速启动系统进行后续开发该怎么办?相信很多工程师都遇到过这样的场景:按照官方文档操作,却在加载FSBL时卡在"PMU-FW is not running"的报错界面。这就像开车时钥匙插进去了却打不着火——明明硬件连接没问题,就是启动不了。
这个问题背后的根源在于ZynqMP芯片的特殊架构设计。与传统FPGA不同,ZynqMP的电源管理系统由专门的MicroBlaze处理器(PMU)控制。当板卡通过JTAG启动时,PMU固件默认处于休眠状态,导致后续的FSBL、ATF等组件无法正常加载。我在实际项目中就遇到过这种情况:客户现场急需调试,但板卡就是死活不启动,最后发现就是漏掉了PMU使能这个关键步骤。
要解决这个问题,我们需要理解ZynqMP的启动链条:
- 首先激活PMU处理器
- 加载并运行PMU固件(pmufw.elf)
- 通过PMU唤醒A53核心
- 按顺序加载FSBL→ATF→U-Boot
这个流程中最容易出错的就是第一步——很多开发者会直接跳到FSBL加载,却忽略了PMU这个"看门人"。接下来我会用最直白的语言,带你完整走通这个流程。
2. 准备工作:工具与文件检查
2.1 硬件连接要点
在开始之前,先确认你的硬件环境:
- 使用USB-JTAG仿真器(如Xilinx Platform Cable USB II)连接板卡
- 板卡启动模式跳线设置为JTAG模式(通常需要将MODE[4:0]引脚配置为00100)
- 确保电源稳定供电,我用示波器实测时发现电压波动会导致PMU初始化失败
- 通过串口终端(如Putty或Minicom)连接UART0,波特率设为115200
提示:如果使用第三方JTAG适配器,可能需要额外安装驱动。我在使用Segger J-Link时就遇到过识别问题,后来在Vivado中手动指定电缆类型才解决。
2.2 软件环境配置
推荐使用Vivado/Vitis 2020.1及以上版本,关键工具路径如下:
- xsdb工具:
<Vivado安装路径>/Vivado/2020.1/bin/xsdb - 所需固件文件:
pmufw.elf(PMU固件)zynqmp_fsbl.elf(第一阶段启动加载器)bl31.elf(ARM Trusted Firmware)u-boot.elf(U-Boot镜像)
这些文件通常可以在Petalinux工程的images/linux目录下找到。我建议新建一个专用工作目录,把这些文件都集中存放。曾经有同事因为文件路径包含中文空格导致加载失败,所以路径最好全英文。
3. 实战操作:从零启动完整流程
3.1 初始化JTAG连接
打开终端,进入存放固件的目录,启动xsdb:
cd /path/to/firmware <Vivado安装路径>/Vivado/2020.1/bin/xsdb连接JTAG目标板,执行以下命令序列:
connect targets正常情况会看到类似输出:
1 APU 2 RPU 3 PMU如果看不到PMU设备,说明硬件连接或供电有问题。我遇到过一种特殊情况:板卡的PROG_B信号未正确复位,需要手动短接复位按钮。
3.2 激活PMU处理器
这是最关键的一步,也是官方文档最容易忽略的部分。依次执行:
targets -set -filter {name =~ "PSU"} mwr 0xffca0038 0x1ff targets这个操作是在向PSU的CRL_APB模块写入特定值,解锁PMU控制权限。地址0xffca0038对应PMU_GLOBAL_CNTRL寄存器,写入0x1ff相当于按下"电源开关"。
3.3 加载PMU固件
现在可以加载PMU固件了:
targets -set -filter {name =~ "MicroBlaze PMU"} dow pmufw.elf con成功时会在串口看到:
PMU Firmware 2020.1 Oct 10 2020 14:23:45 PMU_ROM Version: xxxxxx如果卡在这里,八成是pmufw.elf文件损坏或不匹配。建议重新编译生成,我在使用2020.1版本固件搭配2020.2工具链时就出现过兼容性问题。
4. 逐级加载启动组件
4.1 加载FSBL
PMU运行后,就可以启动A53核心了:
targets -set -filter {name =~ "Cortex-A53 #0"} rst -processor dow zynqmp_fsbl.elf con stop串口输出应该包含:
Xilinx First Stage Boot Loader Release 2020.1 Oct 12 2020-15:32:214.2 加载ARM Trusted Firmware
接着是ATF阶段:
dow bl31.elf con stop正常会看到ARM版权信息和安全启动相关的日志输出。
4.3 启动U-Boot
最后加载U-Boot:
dow u-boot.elf con成功标志是出现熟悉的U-Boot提示符:
U-Boot 2020.01 (Nov 05 2020 - 12:34:56 +0000)5. 常见问题排查指南
5.1 报错"PMU-FW is not running"
这个问题出现的原因通常有:
- 忘记执行mwr 0xffca0038 0x1ff使能PMU
- PMU固件路径错误或文件损坏
- 板卡供电不稳定导致PMU初始化失败
解决方案:
- 检查是否严格按照3.2节步骤操作
- 重新生成pmufw.elf文件
- 用万用表测量板卡3.3V和1.8V电源轨
5.2 JTAG连接不稳定
症状表现为频繁断开连接或无法识别设备,可能原因:
- 电缆接触不良(尝试重新插拔)
- 信号干扰(缩短电缆长度,避免与电源线并行)
- 驱动问题(在Vivado Hardware Manager中刷新设备)
5.3 固件版本不匹配
典型报错如"Invalid ELF header"或"Unknown instruction",解决方法:
- 确认所有.elf文件来自同一Petalinux工程
- 检查Vivado/Vitis版本与固件编译版本一致
- 清理重建工程:
petalinux-build -x distclean
6. 高级技巧与优化建议
6.1 自动化脚本编写
频繁手动输入命令很麻烦,可以创建.xsdb脚本:
connect targets targets -set -filter {name =~ "PSU"} mwr 0xffca0038 0x1ff targets -set -filter {name =~ "MicroBlaze PMU"} dow pmufw.elf con targets -set -filter {name =~ "Cortex-A53 #0"} rst -processor dow zynqmp_fsbl.elf con stop dow bl31.elf con stop dow u-boot.elf con保存为boot.tcl后,通过xsdb -eval "source boot.tcl"一键执行。
6.2 调试信息增强
在PMU固件中添加自定义打印信息:
- 修改
<petalinux-project>/project-spec/meta-user/recipes-bsp/pmu-firmware下的源码 - 使用
Xil_Printf()函数输出调试信息 - 重新编译:
petalinux-build -c pmu-firmware
6.3 性能优化配置
对于需要快速迭代的场景,建议:
- 在U-Boot中配置网络启动:
setenv serverip 192.168.1.100; setenv ipaddr 192.168.1.101 - 使用RAMDISK减少对Flash的擦写次数
- 启用JTAG加速模式:在Vivado中设置
jtag_clock 30000000
经过多次项目实践,这套方法已经成功应用于5款不同型号的ZynqMP板卡。最复杂的一次是在-40℃的工业环境下调试,发现PMU启动需要额外50ms延时,最终通过修改PMU固件的PLL锁定检测逻辑解决了问题。