9、ZYNQ 启动模式
1、什么是固化
ZYNQ 支持的几种启动模式分别是 JTAG、 NAND、 QSPI FLASH 和 SD Card。
平时都是通过 JTAG 先下载 bit 流文件,再下载 elf 文件,最后点击 Run As 来运行程序。 JTAG 的方法是通过 TCL 脚本来初始化 PS,然后用 JTAG 收发信息,用于在线调试。但是这样只要一断电,程序就会丢失,掉电不保存。
如果需要板卡中程序掉电不消失,则需要对程序进行固化。 ZYNQ7000 SOC 芯片可以从 FLASH 启动,也可以从 SD 卡启动。这里详细介绍如何制作镜像文件,以及 SD 和 FLASH 的固化方法。
SD 固化:将镜像文件拷贝到 SD 卡,设置拨码开关,使系统从 SD 模式启动。那么每次断电重启后,系统都会从 SD 启动。
QSPI FLASH 固化:设置拨码开关,将镜像文件烧写进 FLASH,使系统从 QSPI-FLASH 模式启动。 那么每次断电重启后,系统都会从 FLASH 启动。
2、固化准备
如果我们要固化一个 ZYNQ 的程序,以及为这个程序做一个镜像文件,那么该如何做呢?
首先, 想到的两个文件就是 PL 部分需要的 bit 文件,以及 PS 需要的 elf 文件。但是仅有这两个文件不够的,我们还需要一段代码把 bit 文件以及 elf 文件安置好,这段代码就是大名鼎鼎的 FSBL.elf。
因此要制作一个镜像文件需要三个文件:FSBL.elf、 该工程.bit、 该工程.elf。
最后得到一个等式就是: BOOT.bin = FSBL.elf + 该工程.bit + 该工程.elf。在工程编译后,会产生该工程的 bit 文件和 elf 文件。关键是这个 FSBL.elf 怎么生成?不用担心, FSBL.elf 文件 xilinx 早就为我们准备好了,我们可以利用SDK 生成它。在此之前,我们先简单了解一下 zynq 的启动的过程。
(1)zynq 的从 SD 卡的启动的过程
zynq 和大多数 arm 启动过程一样,启动过程也分为 3 个阶段,这三个阶段分别称之为阶段 0、阶段 1 和阶段 2。
阶段 0:即传统的 BootROM 过程。 ZYNQ 芯片 ROM 里面固化了一段不可修改的程序,只要 ZYNQ 一上电,这段程序就会执行。它将对 ZYNQ 的 NAND、 NOR、 SD 等基本外设控制器进行初始化。把 SD 卡这类易失的存储器件初始化后,就会把其中的程序拷贝到 ZYNQ 的 OCM(On-chip memory)。这个被拷贝到片上 RAM 执行的程序就是我们今天要制作的文件——BOOT.bin。
阶段 1: BOOT.bin 加载到 OCM 上开始执行。 BOOT.bin 由 FSBL.elf+该工程.bit+该工程.elf 构成。阶段 1 要做的就是:首先配置 PS 部分, PS 完成初始化后,会去配置 PL 部分,最后去加载阶段 2 的代码。
阶段 2:这一阶段是可选的,主要是为了完成 Linux 系统启动过程。本次实验暂时不需要。
(2) zynq 启动模式位的选择
这里有个疑问,众所周知 ZYNQ 具有多种启动方式: NOR, NAND, Quad-SPI, SD Card 以及 JTAG 。 ZYNQ 如何判断到底从哪里启动呢?实际上,当上电后, ZYNQ 会根据模式管脚的设定,选用 boot 的方式。
我们这里使用的ZYNQ 开发板有两种启动模式,一种是 SD 启动,另外一种是 QSPI FLASH 启动。开发板通过拨码开关对管脚进行设置,改变启动模式。
注意: 请将开发板或核心板电源关闭后,对拨码开关操作,否则会对板卡造成损害。
开发板启动模式及拨码开关状态如下所示,默认拨码是 SD 启动:
核心板模式开关:
选中 helloworld 工程(要做固化的工程),创建一个FSBL1工程不改动,然后右单击,选择 Creat Boot Image。
在新窗口中,一共出现三个文件, 分别是 FSBL.elf、该工程 .bit、该工程 .elf 文件,如下图所示,制作镜像文件需要这三个文件:
一般会自动添加这 3 个文件, 顺序必须是 fsbl.elf、 system_wrapper.bit、 hello_world.elf, 之后直接单击 Create Image即可完成 Boot.bin 的创建,此文件可作为 SD 卡启动文件和 SPI 启动文件。
完成后,可以看到在 helloworld 工程(要做固化的工程)的文件夹中出现 bootimage 文件夹,展开后可以看到生成的 BOOT.bin 文件。这个 BOOT.bin 文件用于 SD 或 QSPI 固化。
3、开始固化
(1)SD 启动——固化测试
将生成的 BOOT.bin 文件,复制到 SD 卡,再将 SD 卡插到开发板,将拨码开关设置为SD卡启动,最后打开电源,则开机后系统从 SD 卡启动,程序掉电不消失。
注意: 放到 SD 卡的 bin 文件,文件名必须是 BOOT.bin,否则不识别。
(2)QSPI-FLASH 启动固化测试
从 VIVADO 2017.3 版本开始, Xilinx 官方为了使 Zynq-7000 和 Zynq UltraScale +实现流程相同,在 QSPI FLASH使用上做了变化,即 Zynq-7000 编程 flash 需要“指定的 fsbl”。这个 fsbl 用于初始化系统(主要是运行 ps7_init()函数)。 XILINX 官网中 Xilinx Answer 70548 和 Xilinx Answer 70148 提供了 VIVADIO 2017.3 版本 QSPI FLASH 下载方法。
读者需要注意,如果不修改引导用的 fsbl,下载 uboot.bin 到 FLASH会失败, 以下就是下载 FLASH 的具体办法。
本教程提供 VIVADO 2017.4 QSPI-FLASH 下载方法如下:
Step1: 新建环境变量
计算机属性高级系统设置高级环境变量新建系统变量
变量名: XIL_CSE_ZYNQ_UBOOT_QSPI_FREQ_HZ
变量值: 10000000
Step2: 生成加载 QSPI FLASH 的 fsbl 文件
新建一个新的 FSBL 文件,命名为 FSBL 2:
Step3: 打开 FSBL 2的 main.c 文件,在此处增加“BootModeRegister = JTAG_MODE; ”保存并编译。
Step4: 模式开关切换到 QSPI 启动模式,开发板通电。选择 Xilinx Tools > Program Flash 或单击Program Flash Memory。
加载刚才生成的 BOOT.BIN 文件和 FSBL 2文件,单击 Program。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)