zynq 程序固化和启动

我们前面的例程都是在 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 启动方式,直接退出。

Vivado 工程修改

我们只是一个测试工程,可以找一个前面完成的工程,比如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 工程运行正常。

如果你还没有运行的工程,那你就建立一个,并且调试运行好。下面我们烧写的就是这个程序。

生成 FSBL 可执行文件

在 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 顷目。

BOOT.BIN 文件的生成

接下去我们要把 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 并启动


我们需要测试 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 卡启动

从 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卡。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章