前言
在前面的章节中,我们编写的程序都是存在片上RAM中的。也就意味着,当开发板掉电后,程序就被抹除了。
在本章节中,将会介绍3种程序固化思路,以及实践荔枝糖Hex能够方便使用的两种思路。
本章所用工程搭建教程:https://blog.csdn.net/qq_36229876/article/details/108237478
经过漫长的折腾,以及请教学长,这个NAND FLASH在硬件级上有问题,所以看到这篇博客的大家,直接跳过NAND FLASH程序固化,直接采用将程序固化在TF卡上,避免浪费时间
程序固化
一般对面FPGA,我们采用的是将程序固化到SPI FLASH种,然后FPGA上电后自动运行SPI FLASH种的程序。(比如我之前用的cyclone iv)
不过 对于ZYNQ来说,我们有了更加多样的程序固化方式:
- 将程序固化在SPI FLASH中
- 将程序固化在 NAND FLASH中
- 将程序固化在TF卡中
对于荔枝糖HEX来说,我们使用2和3两种方式进行程序固化。
首先,我们先从比较简单的将程序固化在TF卡中进行说明。
生成需要固化的.bin文件(PS:由于需要使能不同的管脚,所以即便PL端逻辑相同,但是固化在NAND FLASH中或者TF卡中的.bit文件是不同的,具体见下文)
首先创建一个FSBL文件,通过右侧对这个FSBL工程的介绍,我们提取到大概信息。这个ZYNQ FSBL工程主要是将PL侧的.bits文件和PS侧的.elf文件打包下载到NAND/SPI/NOR FLASH中。当然如果我们使用TF卡的话,就不存在下载的说法了,就直接把.bin文件拖入sd卡根目录就行啦。
然后我们注意到这里有一行报错
This application requires xilffs library in the Board Support Package. You can go back to the previous pages to select a different platform and domain or create a new one with suitable hardware and software.
如何解决这个报错呢?
这个报错的大概意思是 BSP(Board Support Packet,板级支持包) 里面少了个xilffs library。我们只用
在BSP里面添加上这个包就行了。具体操作见博客:https://blog.csdn.net/qq_36229876/article/details/108238233
然后把需要固化的工程生成.bin文件,点击Create Boot Image
然后准备好三个文件,分别是 ps端.elf,pl端.bit,还有FSBL.elf
点击Create Image,完成生成
引导模式选择
将生成的BOOT.bin复制进TF卡
把TF卡插入板子上,程序应该是不会运行的。
因为我们注意到,原理图上,default的boot mode是走NAND FLASH
要想走TF卡,得把SDIO_SDDET脚拉低
再次观察原理图,我们发现其实设计了全自动电路
我们把上述的几个原理图连起来分析后,我们可以发现一个事情,说就是当TF卡插入时,会自动进入从TF卡引导程序。当TF卡拔出时,则进入用NAND FLASH引导程序。下面测试的结果也验证了这个原理。(不得不说,设计得挺不错的)
插上TF卡时
拔出TF卡时
固化到NAND FLASH
打开VIDADO 之前的ZYNQ IP Core,为了把程序固化到NAND FLASH中,我们需要把相关引脚给ENABLE了
然后重新综合工程,得到.bits FOR NAND FLASH。然后按照上文章节生成需要固化的.bin文件进行BOOT.bin文件的生成。
然后
然后
还有一个容易出错的地方是,软件自动导入的FSBL文件路径不对,应该设置成工程下面的FSBL文件的fsbl.elf文件(如果DEBUG目录下没有这个文件的话,就Build下FSBL工程)
出现如下错误:
Problem in running uboot
Flash programming initialization failed.
ERROR: Flash Operation Failed
然后查翻了下,需要将FSBL项目下的main.c里面的BootModeRegister = JTAG_MODE
结果还是不行,一直报那个错误,等明天再试试吧。先去睡觉了QAQ。昨晚和女朋友4点钟才去睡觉,今早八点多就起来了,顶不住了QAQ
昨天捣鼓了半天,发现用NAND FLASH固化程序的比较少,于是去xilinx的官网看了看,官网还是比较好的,有一个关于NAND FLASH的问题集合在里面链接如下(https://www.xilinx.com/support/answers/59311.html)
里面有个问题,大概就是需要根据所使用的NAND FLASH芯片来选择合适的时钟周期
于是我看了下,我的默认设置(太离谱了叭):
又看了下,板子上NAND FLASH的数据手册
发现差异还是挺大的。
需要改一下。
修改后的设置如下:
然后再重新生成bit文件,重新打包.bin文件
然后又折腾了一个多小时,还是不行。后面问了下学长,这个板子上的NAND FLASH存在硬件级的问题,就直接跳过吧。
将程序固化在TF卡中
通过观察原理图,找到TF卡在MIO对应的管脚
然后ENABLE这几个管脚
然后重新生成bit文件,重新打包BOOT.bin文件,再把BOOT.bin放到TF卡根目录,即可。
最后就收工了