我们前面的例程都是在 SDK 开发环境中用 JTAG 直接下载程序运行,如果开发板断电,程序就会丢失,如何让程序能够在开发板断电后再上电能重新启动,这就需要用到应用程序的固化。 ZYNQ7000 SOC 芯片可以从 FLASH 启动,也可以从 SD 卡里启动, 本文给大家介绍程序的 FLASH 或者 SD 卡启动的方法。
前面我们也介绍过, Zynq7000 SOC 芯片上电后,运行的是 ARM 系统(PS)。然后再通过 ARM 系统软件部分加载 FPGA 的比特流文件.bit 至 FPGA(PL),启动 FPGA 的逻辑功能。 下面给大家介绍一下 ZYNQ 系统的启动流程:
开法板的启动分两个阶段,第一阶段是 BOOT ROM,第二阶段是 FSBL (First Stage Bootloader)。经过两个阶段,应用程序开始运行。
第一阶段 (BOOT ROM)
1). AX7010/AX7020 开发板上电后,Zynq7000 SOC 会首先执行片内 Boot ROM 代码, Boot ROM 代码读取 Boot mode 寄存器会决定是哪一种启动方式(SD card/QSPI Flash/JTAG)。
2). 确定好哪种启动方式后, Boot ROM 从相应的启动设备(SD Card/QSPI Flash)加载 First
Stage Bootloader (FSBL) 到 On Chip Memory(OCM) RAM,开始将执行权交付给 FSBL。
第二阶段 FSBL (First Stage Bootloader)
FSBL 开始执行, 后面我们会介绍了如何利用 SDK 工具一步步生成 FSBL 代码和可执行文
件,结合代码可知 FSBL 主要做了如下工作:
1).初始化 CPU,初始化串口;
2). Processor System (PS) 一些控刢器的初始化,如 MIO, PLL, CLK and DDR;
3). 禁止 L1 Data Cache;
4). 注册 ARM 中断向量;
5). 通过 Boot mode 寄存器,判断是哪种启动方式
a). QSPI Flash 启动方式:
初始化 QSPI Flash 控制器;
从 Flash 拷贝 system.bit 到 FPGA (如果 Flash 中存有 system.bit);
从 QSPI Flash 拷贝应用程序的代码到 DDR3;
调转到应用程序执行;
b). SD Card 启动方式:
初始化 SD 控刢器;
从 SD Card 拷贝 system.bit 到 FPGA (如果 BOOT.BIN 中存有 system.bit);
从 SD card 拷贝应用程序的代码到 DDR3;
调转到应用程序执行;
c). JTAG 启动方式,直接退出。
我们只是一个测试工程,可以找一个前面完成的工程,比如helloworld 或者有点现象一点的sdk 流水灯,当然也可更复杂一点的。这里我就采用流水灯工程。
因为我们需要写入SD 卡和Qspi,需要修改工程,就是提供sd卡和qspi 的支持,下面的图示是基于黑金的开发板或核心板AC7010,如果不一致,你需要核对你硬件的设计。
1. 为了不影响前面的项目,把my_led 工程另存为my_led_flash。
2. 打开项目后,双击打开 Diagram 原理图中的 Processing_system7_0, 打开配置 ZYNQ 的配置界面,在 Peripheral I/O Pins 项,使能 Quad SPI Flash
同样,我们需要使能 SD0 的接口, SD 卡在 AX7010/AX7020 开发板上是连接到 PS 的
MIO40~MIO45 的管脚上。
3. 在 MIO Configuration 项,把 Quad SPI Flash 的 MIO1~MIO6 Speed 配置成 fast 模式。
在 SD_0 项,选择 CD 前面的钩, IO 选择 MIO47(需要跟开发板一致), SD_0 的 IO 速度配置
成 fast 模式。
再配置 Bank1 I/O Voltage 的电压为 1.8V。
保存好原理图,等等,产生比特流bit,,输出硬件(Export hardware),启动SDK(Launch SDK)
在sdk 里, Xilinx->program FPGA
debug 或Run 验证你的sdk 工程运行正常。
如果你还没有运行的工程,那你就建立一个,并且调试运行好。下面我们烧写的就是这个程序。
在 SDK 开发环境里 , 点击菜单 File -> New -> Application Project
仅在 Project name: 输入 fsbl, Hardware Platform 需要选择 system_wrapper_hw_platform_0,这个hardware platform和你上面的工程应该是一样的。
Next 后,选择 Zynq FSBL 模板
软件会自动编译生成 fsbl.elf 文件,当然也可手动编译一下,如果认为有问题。
为了能够让串口打印出 Bootloader 的信息,我们这里需要在 fsbl_debug.h 文件里添加一条语句,定义一下“FSBL_DEBUG_INFO”常量。修改后保存,重新编译一下 fsbl 顷目。
接下去我们要把 FSBL 可执行文件, FPGA 的比特流文件和 应用程序结合成一个 Bin 文件。
1. 选择菜单 Xilinx Tools->Create Boot Image
2. 点击 Browse 按键选择 Zynq Boot Image 文件.bif 的存放地址。
我的是:C:\alinx\my_led_flash\output.bif
3. 点击 Add 按钮, 在弹出的 Add new boot image partition 对话框中, 点击 Browse 选择我们刚生成的 FSBL 可执行文件 fsbl.elf。这里 Partition type 为 bootloader, fsbl.elf 作为bootloader 程序
我的是:C:\alinx\my_led_flash\my_led_flash.sdk\fsbl\Debug\fsbl.elf
4. 点击 Add 按钮,在弹出的 Add new boot image partition 对话框中, 点击 Browse 按钮找到 FPGA 的比特流文件 system_wrapper.bit, 这里 Partition type 为 datafile。
我的是:C:\alinx\my_led_flash\my_led_flash.sdk\system_wrapper_hw_platform_0\system_wrapper.bit
5. 同样的方法添加应用程序文件 myled.elf, 这里 Partition type 也是 datafile。
我的是:
3 个文件添加后如下所示:
有了这一次后,以后可以如下方式进行,不用每次都导入。上面图是第一次的操作,后面可以import from existing BIF file.
说实在的,第一次我操作有误,bit 文件错误成了hdf 文件,下面修改后才执行正确。
6. 点击 Create Image 按钮,生成 BOOT.bin
我们需要测试 FLASH 的启动方法,需要把生成的 BOOT.bin 文件烧写到 QSPI FLASH 中。
具体步骤如下:
1. 开发板需要连接 JTAG 线到电脑,把开发板上的启动配置的跳线帽插到中间的两个 Pin 上,
也就是从 QSPI Flash 启动,再开发板上电。
2. 在 SDK 开发环境里,选择菜单 Xilinx Tools->Program Flash。
其实在这个操作前应该Xilinx Tools->Program FPGA,可能以前是不需要这样操作。
3. 在这个操作对话框里,需要输入fsbl.elf文件, image File 就是我们上面生成的,Hardware Platform 也是我们上面选择的system_wrapper_hw_platform_0。硬件平台都应该与上面创建时一致。
4. 点击 Program 按钮下载,程序会开始下载 BOOT.bin 文件到开发板的 QSPI FLASH 中。
Console 窗口显示 Flash Operation Successful 信息,说明烧写成功。
复位或者重开机启动,就可以看到程序运行了,流水灯或者串口显示。
从 SD 卡启动的方法更简单,叧要把前面生成的 BOOT.bin 文件拷贝到 SD, 因为AX7010/AX7020 开发板使用的是 micro SD 卡,所以大家要向 SD 卡拷贝 BOOT.bin 文件的话,需要用到 USB 接口的 SD 读卡器。
先用 FAT32的格式格式化一下 SD 卡,然后拷贝 BOOT.bin 文件到 SD 中。
把 Micro SD 卡再插入到开发板的 SD 卡槽中,再把 Boot 启动配置的跳线帽调到 SD 位置的两个引脚上。
加电或复位就看到程序运行了。
介绍到此为止,很多开发板的资料都应该有介绍,下一篇介绍加密的方式写入flash或者SD卡。