Xilinx ZYNQ 7000+Vivado2015.2系列(五)之ZYNQ的三种启动方式-JTAG、SD card、Flash
前言:
前面我们都是使用JTAG方式下载比特流文件,然后下载elf文件,最后点击Run as或者Debug as来运行程序。
JTAG方式是通过tcl脚本来初始化PS,然后用JTAG收发信息,
优点是可以在线调试,
缺点是断电后程序就丢失了。
为了解决程序丢失的问题,可以制作镜像文件烧写到sd卡或者flash中,上电即可加载程序。
ZYNQ有两大类启动模式:
从BootROM主动启动,
从JTAG被动启动。
在没有外部JTAG的情况下,处理系统(PS)与可编程逻辑(PL)都必须依靠PS来完成芯片的初始化配置。
即借助CPU来完成配置,这也是ZYNQ系列的不同之处。
板子依然使用的是zc702。
启动模式设置:
zynq 具有多种启动方式:
① NOR,
② NAND,
③ Quad-SPI,
④ SD Card
⑤ JTAG
zynq 如何判断从哪里启动呢?
上电后, zynq 会根据模式管脚的设定选用 boot 的方式。
而这个管脚的设定是通过核心板上的拨码开关实现的。
zc702的拨码开关是sw16。
The ZC702 board supports these configurationoptions:
• PS Configuration: Quad SPI flash memory
• PS Configuration: Processor System Boot from SD Card (J64)
• PL Configuration: USB JTAG configuration port (Digilent module)
• PL Configuration: Platform cable header J2 and flying lead header J58 JTAG configurationports
JTAG启动:
配置界面如下:
设置完之后点击Apply-->Debug即可开始调试,
Run as类似。
通过制作镜像文件在外设控制器中启动,也称之为固化。
固化需要三个文件:
① FSBL.elf
② 该工程的bit文件
③ 该工程的elf文件
由此三个文件制作一个BOOT.bin文件。
那么通过外设启动的过程是怎样的呢?
分为三个阶段,大多数的ARM都是这个启动过程。
阶段0:即传统的 BootROM 过程
zynq 芯片里有个 rom 里面固化了一段不可修改的程序,
只有 zynq 一上电, 这段程序就会执行,
它将初始化CPU和 NAND、 NOR、 SD卡等基本外设。
初始化好,BootROM读取存储器中的程序代码,并将FSBL拷贝到OCM(On-chip memory)里 ,
这个被拷贝到片上 RAM 执行的程序就来自于我们要制作的文件——
BOOT.bin
。
阶段1:第一阶段引导程序(First Stage Boot Loader,FSBL)
BOOT.bin
开始执行:首先继续配置PS,PS初始化好后,
再配置PL,
最后还可以加载阶段2的代码。
阶段2:第二阶段引导程序(Second Stage Boot Loader,SSBL)
开始执行PS端代码
完全在用户的控制之下,是可选的。
BootROM负责:
① 上电复位以后,PS端即开始进行配置。
在不使用JTAG的情况下,ARM将在片上的BootROM中开始执行代码。
BootROM中的代码对NAND、NOR、Quad-SPI、SD与PCAP的基本外设控制器进行初始化,
使得ARM核可以访问、使用这些外设。(而DDR等其他外设将在阶段1或者之后进行初始化。)
② BootROM读取MIO[2..8]的引脚设置来确定启动设备,
将选定设备的头192Kbyte内容,也就是FSBL,复制到OCM中,并将控制权交给FSBL。
FSBL启动时可以使用整块256Kb的OCM,当FSBL开始运行后,器件就正式由由用户控制了。
FSBL负责:
①根据Vivado中的配置,完成PS端的初始化。
②使用比特流文件对PL进行配置
③加载第二阶段引导程序(SSBL)或者裸跑程序(直接在ARM上运行无操作系统程序)到内存空间。
④跳转执行SSBL或者裸跑程序。
关于PS配置:
Ps7_init.c和ps7_init.h,用于初始化CLK,DDR和MIO。
Ps7_init.tcl完成的初始化和ps7_init.c代码完成的初始化是相同的。
由于不是通过JTAG运行,所以没有运行p7_init.tcl,直接在裸机程序开始处调用ps7_init()。
Xilinx为我们写好了一个FSBL程序,没有特殊要求可以直接使用。
制作BOOT.bin文件:
1.Vivado那边完成之后,打开sdk,新建应用工程
工程名设为FSBL
点击next选择自带的FSBL程序,右边是FSBL功能介绍
点击Finish会自动编译,在Debug目录下可以找到FSBL.elf文件
2.点击Xilinx Tools ->Create zynq Boot Image
一般 该添加的文件它都会帮你添加好。
需要添加的文件如下:
在FSBL文件夹下新建一个bootImage文件,点击Browse,将输出指向这里
点击add,先添加FSBL.elf文件,作为bootloader
再添加hw_platform下的.bit文件,这是PL部分的
最后添加裸机程序.elf文件
都添加完如下图:
以上三个文件的添加顺序不可变,点击Create Image,就可以生成BOOT.bin文件了,默认的输出路径在bootImage下。
SD卡启动
① 将生成的BOOT.bin文件拷贝到SD卡中,
② 启动模式设置为SD卡启动,上电,程序就可以运行了。
我这里的现象led闪烁,断电再上电,程序依然在,从SD卡加载的。
Flash启动
1.启动模式设置为QSPI启动,
2.开发板上电,
3.点击Xilinx tool-->Program Flash
4.点击Program
下载好后程序就固化了,断电后重启,程序从QSPI Flash加载。
如果你使用已经存在的bsp文件时出现这种情况:
右键那个bsp工程,点击Board Support Pacage Setting,勾选这两个库
总结:
主流的下载方式就这三种,基本可以满足你的一切需要了。