1. 为什么你的ZYNQ开发板一断电程序就“失忆”?
很多刚开始玩ZYNQ的朋友都遇到过这个头疼的问题:在Vitis里调试得好好的程序,一旦给开发板断电再上电,程序就没了,一切又回到了“出厂设置”。这感觉就像辛辛苦苦写的日记,第二天醒来发现本子一片空白,非常打击积极性。
其实,这背后涉及到一个嵌入式开发,尤其是像ZYNQ这种“处理器(PS)+可编程逻辑(PL)”异构系统的核心概念:程序固化。我们平时在Vitis里点击“Run”或者“Debug”,程序其实是下载到了开发板上的DDR内存里。DDR是一种易失性存储器,它的特点就是“有电就有记忆,没电就失忆”。所以断电后,程序自然就消失了。
那么,怎么让程序“记住”自己,实现上电自启动呢?答案就是把程序存放到一种“有电没电都记得住”的存储器里,也就是非易失性存储器。这就像你把重要的文件从电脑内存(一关机就丢)保存到了硬盘里(关机了还在)。对于ZYNQ开发板来说,常见的非易失性存储器有板载的QSPI Flash芯片或者SD/TF卡。我们的目标,就是把编译好的程序文件,正确地“烧录”到这些存储器里,让ZYNQ芯片一上电,就能自动找到并运行它们。
这个过程,单靠Vivado或者Vitis任何一个工具都无法独立完成,它需要两者协同工作。Vivado负责“硬件舞台”的搭建(生成比特流文件定义PL逻辑),而Vitis则负责“软件演员”的编排和“启动剧本”的撰写(编译应用代码并生成引导文件)。两者配合,才能导出一出完整的、可以独立上电运行的大戏。接下来,我就带你一步步走通这个流程,让你彻底告别程序“失忆”的烦恼。
2. 幕后英雄:深入理解ZYNQ的启动“接力赛”
在动手操作之前,我们有必要花点时间弄清楚ZYNQ到底是怎么启动的。理解了这场精密的“接力赛”,后面每一步操作你都会知道“为什么这么做”,而不是机械地照搬步骤,这样即使出了问题,你也能自己排查。
2.1 第一棒:固若金汤的BootROM
当你给ZYNQ开发板通电或按下复位键的瞬间,第一棒起跑的不是你写的任何代码,而是芯片内部固化好的一段只读程序——BootROM。这段代码在芯片出厂时就已经刻在硅片里了,你无法修改。它的任务非常明确,就是执行最最基础的硬件初始化,然后根据你预先设定的“启动模式”(比如拨码开关设置是QSPI启动还是SD卡启动),去指定的非易失性存储器的固定位置,寻找下一棒选手:FSBL。
你可以把BootROM想象成一个极度可靠、但功能单一的机器人。它只会做几件规定好的事:检查身体基本状况(时钟、基础外设)、看一眼手里的“任务卡”(启动模式引脚),然后径直走向任务卡指定的保险箱(Flash/SD卡),取出里面的第一份指令文件。
2.2 第二棒:承上启下的FSBL
BootROM找到并加载的,就是我们开发者需要创建的第一个关键文件:First Stage Boot Loader,简称FSBL。FSBL是一个运行在PS(处理器系统)上的轻量级程序,它的核心任务有两个,这也是我们固化程序的关键所在。
第一,初始化更复杂的硬件环境。 BootROM只做了最基础的初始化,像DDR内存控制器、更复杂的外设等,都需要FSBL来配置。只有正确初始化了DDR,后续的程序才有地方“安家”和运行。
第二,加载并配置PL(可编程逻辑)。 这是ZYNQ区别于普通ARM芯片的核心一步。FSBL会从存储器中读取由Vivado生成的 .bit文件(比特流文件),并将这个文件“烧写”到PL部分的配置存储器中,从而让FPGA逻辑电路按照你的设计呈现出来。没有这一步,PL就是一堆没有功能的晶体管。
第三,加载并跳转到最终应用程序。 完成硬件和PL的初始化后,FSBL会去加载真正的“主角”——你的应用程序(比如一个Hello World程序,或者跑操作系统的U-Boot),并把CPU的执行权交给它。至此,启动接力赛完成,你的系统开始正常运行。
所以,要实现固化,我们最终要生成一个包含FSBL、硬件比特流(.bit)和应用程序的“打包文件”,并把它放到启动存储器里。Boot


1万+

被折叠的 条评论
为什么被折叠?



