【正点原子FPGA连载】第七章程序固化实验摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
第七章程序固化实验
在前面的几个实验中,我们都是通过JTAG接口将FPGA配置文件和应用程序下载到MPSOC器件中。接下来我们将尝试把程序存储在非易失性存储器中,在上电或者复位时让程序自动运行,这个过程需要启动引导程序(Boot Loader)的参与。Boot Loader会加载FPGA配置文件,以及运行在ARM中的软件应用。
本章包括以下几个部分:
77.1简介
7.2实验任务
7.3硬件设计
7.4软件设计
7.5下载验证
7.1简介
MPSOC的系统启动过程由平台管理单元(PMU)和配置安全单元(CSU)管理和执行。启动过程包括三个功能阶段:预配置阶段、配置阶段和后配置阶段。
预配置阶段由平台管理单元控制。平台管理单元运行PMU ROM代码以设置系统。PMU处理所有复位和唤醒过程。
在配置阶段,BootROM(CSU ROM代码的一部分)解释引导头以配置系统,并在安全或非安全引导模式下将处理系统(PS)的第一阶段引导加载程序(FSBL)代码加载到片上RAM(OCM)中。引导头定义了许多引导参数,包括安全模式和执行FSBL的处理器MPCore。在引导期间,CSU还将PMU用户固件(PMU FW)加载到PMU RAM中,以与PMU ROM一起提供平台管理服务。对于基于Xilinx的FSBL和系统软件,PMU FW必须存在于大多数系统中。
FSBL执行开始后,CSU ROM代码进入后配置阶段,该阶段负责系统干预响应。CSU硬件提供持续的硬件支持,以验证文件,通过PCAP配置PL,存储和管理安全密钥,解密文件。
启动流程(Boot Flow)
PMU执行许多强制性和可选的安全操作,包括:
1、可选功能:将低功耗域(LPD)寄存器归零。当LPD_SC eFUSEs编程时,PMU将LPD中所有寄存器归零。
2、可选功能:将全功率域(FPD)寄存器归零。当FPD_SC eFUSEs编程时,PMU将FPD中所有寄存器归零。
3、将PMU RAM归零:PMU RAM中写零并读回以确认写成功。
4、将PMU处理器的TLB内存归零。
5、电压检查:PMU检查LPD、AUX和专用IO的电源电压,以确认电压在规格范围内。
6、将内存归零:PMU将位于LPD、FPD和CSU中的内存归零。
一旦这些安全操作完成,PMU通过SHA-3/384引擎发送CSU不可变ROM代码,并将计算出的加密校验和与存储在设备中的黄金拷贝(golden copy)进行比较,如果校验和匹配,则验证CSU ROM完整性并释放对CSU的复位。
PMU负责处理主要的预引导任务和PS的管理,以确保系统资源的可靠通电断电。启动PMU的上电复位(POR)操作,直接或间接的释放了预期上电模块的复位。在这种情况下,PMU需要ROM代码来保持初始化上电顺序。即使在启动过程之后,PMU仍在运行,并且负责处理各种系统复位。在更改系统电源状态时也会使用它(例如上电、睡眠和唤醒)。
在初始化启动期间,POR将PMU从复位中释放,然后执行PMU ROM。下面描述了PMU处理器在POR复位后,通过运行PMU ROM预启动代码完成的操作序列:
1、初始化PS SYSMON和引导单元所需的PLL。
2、清除PMU RAM和CSU RAM(仅外部POR)。
3、验证PLL锁。
4、通过PS SYSMON单元验证LPD、AUX和IO电源范围。
5、清除低功耗和全功耗域。
6、如果前面的步骤没有错,PMU将释放CSU复位并进入PMU服务模式。如果有错,将产生一个启动错误标志。
当CSU 复位被释放,CSU将按照下面序列运行:
1、初始化OCM。
2、通过读取引导模式寄存器来确定启动模式。
3、CSU继续在OCM中加载FSBL,以供RPU或APU执行。然后,CSU将PMU用户固件加载到PMU RAM中,以供PMU固件执行。
启动模式(Boot Modes)
BootROM可以通过Quad-SPI,SD,eMMC,USB2.0控制器0或NAND等外部设备启动系统。
MPSOC使用多个模式引脚来决定配置器件的类型,软件的存储位置以及其他的系统设置,这些引脚共享PS端的MIO引脚。总共有7个模式引脚,分别为MIO[8:2]。其中,前四个引脚定义启动模式,第五个引脚定义是否使用PLL,第六个和第七个引脚定义上电过程中MIO bank0和bank1的bank电压。如下图所示:
图 7.1.1 启动模式引脚
整个系统的启动过程如下图所示:
图 7.1.2 MPSOC系统启动过程
7.2实验任务
本章的实验任务是在“AXI GPIO按键控制LED实验”的基础上创建FSBL,实现程序上电自启动,包括从SD卡启动,QSPI Flash和eMMC启动三种方式。
7.3硬件设计
本次实验在“AXI GPIO按键控制LED实验”的基础上进行。打开《AXI GPIO按键控制LED》实验的Vivado工程,另存为本次实验工程,工程名为axi_gpio_fsbl,具体过程参考前面的实验。
接下来对系统的硬件设计进行修改。在Vivado界面左侧选择Open Block Design,然后在右侧的Diagram界面中双击Zynq UltraScale+ MPSOC模块修改其配置。
首先使能QSPI外设。在左侧的导航栏中选择I/O Configuration,在打开的右侧页面中,依次展开Low Speed > Memory Interfaces,然后勾选QSPI并在后面的下拉菜单中选择Single,QSPI Data Mode选择x4,QSPI IO默认为MIO0…5,勾选Feedback Clk并选择MIO6,如下图所示。
图 7.3.1 使能QSPI Flash控制器
然后打开SD卡外设。在上一步的页面中,展开SD外设,勾选SD1,在后面的菜单栏中选择MIO46…51,Slot Type选择SD2.0,Data Transfer Mode选择4Bit,勾选CD用于检测SD卡插入并选择MIO45,如下图所示:
图 7.3.2 使能SD卡控制器
最后打开eMMC外设。在同样的页面中,勾选SD0并选择MIO13…22,Slot Type设置成eMMC,Data Transfer Mode选择8bit,勾选Reset并选择MIO23,如下图所示:
图7.3.3 使能eMMC控制器
上面两幅图中具体每个外设所连接的MIO引脚可以通过查看开发板原理图得知,设置完成后点击“OK”。然后在Diagram窗口空白处右击,然后选择“Validate Design”验证设计。验证完成后弹出对话框提示“Validation Successful”表明设计无误,点击“OK”确认。最后按快捷键“Ctrl + S”保存设计。
接下来在Source窗口中右键点击Block Design设计文件“design_1.bd”,执行“Generate Output Products”。最后在左侧Flow Navigator导航栏中找到PROGRAM AND DEBUG,点击该选项中的“Generate Bitstream”,对设计进行综合、实现、并生成Bitstream文件。
在菜单栏中选择 File > Export > Export hardware导出硬件,并在弹出的对话框中,勾选“Include bitstream”。
新建vitis文件夹,将生成的xsa文件放入其中。
然后在菜单栏选择Tools > Launch Vitis,启动Vitis开发环境。在弹出的对话框中,将路径指定到新建的vitis文件夹下,点击Launch启动Vitis。
到这里我们的硬件设计部分已经结束,接下来的软件设计部分需要在Vitis软件中进行。
7.4软件设计
新建工程。参考前面实验的步骤,新建一个名为axi_gpio_fsbl的应用工程,如下图所示:
图 7.4.1 新建应用工程
新建源文件。在axi_gpio_fsbl/src目录上右击,新建一个名为main.c的源文件,然后把《AXI GPIO按键控制LED》实验中main.c的代码拷贝到本实验的main.c中,如图7.4.2所示,按“Ctrl+S”保存,然后编译工程。
图7.4.2 将代码拷贝到main.c中
创建启动镜像。选中应用工程,右键选择Create Boot Image,如图7.4.3所示。接下来,在弹出的界面中添加生成boot.bin所需的文件,然后点击“Create Image”,如图7.4.4所示。
图7.4.3 选择Create Boot Image
图7.4.4 添加文件生成Boot.bin
从上图中可以看到,软件已经给我们自动添加所需的文件。首先是Bootloader启动文件,也就是序号4处的fsbl.elf。其次是FPGA的配置文件design_1_wrapper.bit,在上图中序号5处。最后是应用程序axi_gpio_fsbl.elf文件,上图中序号6处。注意这三个文件的顺序不能错。
图7.4.4中,序号2处的bif文件是生成BOOT的配置文件,序号3处的BOOT.bin就是我们需要的启动文件,可以烧录到QSPI Flash或eMMC中,也可以放到SD中来启动ZYNQ MOPSOC。
创建完成后,在指定的路径下可以看到生成的两个文件,如下图所示:
图7.4.5 生成的BOOT.bin文件
到这里,我们创建启动镜像文件的过程就结束了。
7.5下载验证
我们首先来验证如何从SD卡中启动程序。将Micro SD卡插入读卡器,然后在电脑上将其格式化为FAT32格式,如下图所示:
图 7.5.1 格式化SD卡
然后将生成的BOOT.bin文件拷贝到SD卡根目录下,最后将SD卡从读卡器中取出,并插入开发板背面的Micro SD卡的卡槽中。
接下来将开发板上的启动模式开关设置为ON _OFF_ON_OFF,即设置为从SD卡启动(也就是开发板上丝印标注的0101 SD1)。不同的启动方式与四个拨码开关的状态对应关系如下图所示,其中0代表ON,1代表OFF。
图 7.5.2 启动模式设置
最后连接开发板的电源线,给开发板上电。
上电后,开发板上PL配置完成的绿色指示灯点亮。然后每次按下PL_KEY1,可以改变PS_LED1灯的显示状态,说明程序能够实现从SD卡中自启动。开发板实物如下图所示:
图 7.5.3 SD卡启动
SD卡启动验证完成后拔下Micro SD卡。接下来我们来介绍如何将程序固化到QSPI Flash中。
将程序固化到QSPI Flash需要使用JTAG下载器。首先我们将下载器与开发板上的JTAG接口连接,下载器另外一端与电脑连接。接下来将开发板上的启动模式开关设置为ON_ON_ON_ON,即设置为JTAG模式(也就是开发板上丝印标注的0000 JTAG)。最后连接开发板的电源,给开发板上电。
在Vitis软件的菜单栏中点击“Xilinx->Program Flash”,如下图所示:
图 7.5.4 打开Program Flash
在弹出的对话框中指定前面所生成的镜像文件BOOT.bin以及FSBL.elf文件,如下图中1和2处所示。Flash Type选择qspi-x4-single,并勾选Verify after flash,如下图中3和4处所示。
图 7.5.5 Program Flash 界面
在图 7.5.5中点击“Program”,开始对Flash进行编程,这个过程需要花费一段时间。
FLASH编程结束后,控制台提示信息如下图所示:
图 7.5.6 QSPI Flash下载成功
接下来断开开发板电源,然后将开发板上的启动模式开关设置为ON_ON_OFF_ON,即设置为32bit QSPI Flash启动(也就是开发板上丝印标注的0010 SPI_32),然后再次连接电源。
连接电源后,开发板上PL配置完成的指示灯点亮。然后每次按下开发板上PL_KEY0,可以改变PS_LED1的显示状态,说明程序能够实现从QSPI Flash中自启动。实物图如下所示:
图 7.5.7 QSPI Flash启动
最后我们来介绍如何将程序固化到eMMC中。
将程序固化到eMMC需要使用JTAG下载器。首先我们将下载器与开发板上的JTAG接口连接,下载器另外一端与电脑连接。接下来将开发板上的启动模式开关设置为ON_ON_ON_ON(也就是开发板上丝印标注的0000 JTAG),即设置为JTAG模式。最后连接开发板的电源,给开发板上电。
在Vitis软件的菜单栏中点击“Xilinx->Program Flash”,这一步和固化到Flash是一样的。
在弹出的对话框中指定前面所生成的镜像文件BOOT.bin以及FSBL.elf文件。Flash Type选择emmc,并勾选Verify after flash,然后点击Program,如下图所示。
图7.5.8 编程eMMC界面
eMMC编程结束后,控制台提示信息如下图所示:
图7.5.9 eMMC下载成功
接下来断开开发板电源,然后将开发板上的启动模式开关设置为ON_OFF_OFF_ON,即设置为eMMC启动(也就是开发板上丝印标注的0110 eMMC),然后再次连接电源。
连接电源后,开发板上PL配置完成的指示灯点亮。然后每次按下开发板上PL_KEY0,可以改变PS_LED1的显示状态,说明程序能够实现从eMMC中自启动。实物图如下所示:
图7.5.10 eMMC启动
相关文章:

【正点原子FPGA连载】第七章程序固化实验摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
第七章程序固化实验 在前面的几个实验中,我们都是通过JTAG接口将FPGA配置文件和应用程序下载到MPSOC器件中。接下来我们将尝试把程序存储在非易失性存储器中,在上电或者复位时让程序自动运行,这个过程需要启动引导程序(Boot Load…...
LeetCode-2335. 装满杯子需要的最短总时长【贪心,数学】
LeetCode-2335. 装满杯子需要的最短总时长【贪心,数学】题目描述:解题思路一:其实像一道数学题目。假设三个杯子x<y<z先分两种情况。第一种:xy<z,答案直接是最大的z。第二种:xy>z。先将x与y互相…...
基于 oss 框架的音频驱动
基于 oss 框架完成系统平台音频驱动的适配。 oss 框架可被多个平台应用,因此 oss 提供 OS 目录来存放平台文件(比如:linux.c),该文件主要提供平台对 oss 框架封装后的相关接口。 以 Linux 为例,入口接口为…...
【golang】如何定制化zap日志库以及如何使用
Zap 日志 前言 本文主要介绍Go语言日志库如何简易定制化,以及如何在开发中使用。 为什么需要日志? 一个产品的诞生一定是因为有需求!新技术大部分都是为了更加便利和实用而诞生的,日志也不例外。日志顾名思义就是对整个项目的事件进行记…...
如何将 Ubuntu 升级到 22.04 LTS Jammy Jellyfish
在本教程中,我们将详细介绍如何将你的 Ubuntu 系统升级到版本 22.04 Jammy Jellyfish,这是最新的长期支持版本。 Ubuntu 22.04 LTS Jammy Jellyfish 将于 2022 年 4 月 21 日发布。它是下个两年一次的长期支持(LTS)版本,因此值得注意,而且现在 Ubuntu 21.10 的用户可以升…...

ubuntu20.04安装docker与docker-compose
安装docker 查看系统发行版本 cat /proc/version1、更新apt包 sudo apt-get update2、安装必备的软件包以允许apt通过 HTTPS 使用存储库(repository): sudo apt-get install ca-certificates curl gnupg lsb-release3、添加Docker官方版本…...
笔试题-2023-加特兰-数字IC设计【纯净题目版】
回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.07.27应聘岗位:数字电路设计工程师(SoC) - 2023届笔试时长:90min笔试平台:nowcoder牛客网题目类型:问答题(11道)主观评价 难易…...

动态内存管理
目录1.为什么要动态内存分配2.动态内存函数malloc](https://cplusplus.com/reference/cstdlib/malloc/?kwmalloc)和[freecallocrealloc3.使用动态内存要注意的几点对NULL的解引用对同一块动态内存多次释放free非动态开辟的内存使用free释放一块动态开辟内存的一部分一个函数中…...

Unsupervised Question Answering 简单综述
Unsupervised Question Answering by Cloze Translation, ACL 2019 随机从文本中抽取noun phrases或者named entity作为答案将答案部分mask掉,生成cloze question利用无监督翻译,将cloze question转化为natural question 缺点: 直接利用原句…...

智慧物流管理系统
智慧物流运用物联网、大数据、云计算、人工智能等技术优化物流决策过程。智慧物流获取、分析物流信息并做出决策,从商品源开始实时跟踪与管理,保证信息流快于商品流,实现信息与物质快速、高效、流畅地运转,集自动化、数字化、网络…...
单表查询--实例
#素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 >CREATE TABLE worker ( >部门号 int(11) NOT NULL, >职工号 int(11) NOT NULL, >工作时间 date NOT NULL, >工资 float(8,2) NOT NULL, >政治…...

c语言递归 累和 ,累乘积,斐波那契数列,字符串长度
目录 递归使用场景 1:使用递归的方式计算 Sn123..100 2:计算 n!n*(n-1)*(n-2)*......*1; 3:计算输出斐波那契数列前20项,并按每行4个数的格式输出(2019年) 4: 用递归和非递归两种方式编写函数strlength()。该函数…...

数据与C(ASCII码,char)
目录 一.ASCII码讲解 二.非打印字符(转义字符) 三.扩展小知识 一.ASCII码讲解 char类型用于存储字符,从技术层面看,char时整数类型,因为char类型实际上存储的是整数而不是字符。计算机使用数字编码来处理字符&…...

第一个C语言代码(visual studin创建调试以及项目文件功能讲解)
这里我主要使用visual Studio进行编程 目录 一.创建项目 二.编写代码 1.代码编写 2.代码分析 3.main() 4.注释符 5.{} 花括号 6.声明 7.赋值 8.printf()函数 9.return 0; 一.创建项目 这里大家可能会比较疑惑,为啥都是C,没看见C的项目&…...

VIF原理
文章目录一、VIF公式和原理对于R方一般回归模型皮尔逊相关系数中的方差VIF原理:一、VIF公式和原理 所谓VIF方法,计算难度并不高。在线性回归方法里,应用最广泛的就是最小二乘法(OLS),只不过我们对每个因子…...

nginx相关反爬策略总结笔记
引言 互联网站点的流量一部分由人类正常访问行为产生,而高达30%-60%的流量则是由网络爬虫产生的,其中一部分包含友好网络爬虫,如搜索引擎的爬虫、广告程序、第三方合作伙伴程序、Robots协议友好程序等;而并非所有的网络爬虫都是友好的&#x…...

【Vue3】电商网站吸顶功能
头部分类导航-吸顶功能 电商网站的首页内容会比较多,页面比较长,为了能让用户在滚动浏览内容的过程中都能够快速的切换到其它分类。需要分类导航一直可见,所以需要一个吸顶导航的效果。 目标:完成头部组件吸顶效果的实现 交互要求 滚动距离大…...

HOMER docker版本安装详细流程
概述 HOMER是一款100%开源的针对SIP/VOIP/RTC的抓包工具和监控工具。 HOMER是一款强大的、运营商级、可扩展的数据包和事件捕获系统,是基于HEP/EEP协议的VoIP/RTC监控应用程序,并可以使用即时搜索、处理和存储大量的信令、RTC事件、日志和统计信息。 …...

【数据结构】单向链表的练习题
目录 前言 1、删除链表中等于给定值val的所有节点。 【题目描述】 【代码示例】 【 画图理解】 2、反转一个点链表 【题目描述】 【 代码思路】 【代码示例】 【画图理解】 3、给定一个带有头节点head的非空单链表,返回链表的中间节点,如果有两个…...

我的企业需要一个网站吗?答案是肯定的 10 个理由
如果您的企业在没有网站的情况下走到了这一步,您可能会想:我的企业需要一个网站吗?如果我的企业没有一个就已经成功了,那又有什么意义呢?简短的回答是,现在是为您的企业投资网站的最佳或更重要的时机。网站…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...