【正点原子FPGA连载】第七章程序固化实验摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

news2025/5/29 4:01:12

第七章程序固化实验

在前面的几个实验中,我们都是通过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启动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32笔记】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作的问题)

【STM32笔记】HAL库UART串口配置及重定向&#xff08;解决接收中断与scanf不能同时工作的问题&#xff09; 首先 要使用printf和scanf 必不可少的就是 #include <stdio.h>这里需要做的就是配置单片机的UART 并且使其能够被printf和scanf调用 打开异步工作模式 并且选择…

openGauss单机版升级示例(2.0.1—>3.1.1)

文章目录前言一、升级前的准备工作二、升级主要步骤1、查看当前数据库版本2、创建临时目录用于存放安装文件3、下载最新需要升级的版本并解压4、执行前置脚本 openGauss的 gs_preinstall5、执行升级操作6、升级检查7、提交升级&#xff1a;三、附本期小知识前言 数据库版本升级…

你的自动化框架如何设计的?为什么感觉面试官总是不满意,到底问题出在哪?

前言去面试自动化测试岗位&#xff0c;尤其是接口自动化岗位&#xff0c;面试官总会问&#xff1a;说下你的自动化框架如何设计的&#xff1f;为什么回答后&#xff0c;面试官对你的框架设计总是感觉不满意&#xff1f;自动化测试实现的几种方式对于不同的公司来说&#xff0c;…

iOS16灵动岛横屏视频播放适配(ZFPlayer)

项目场景&#xff1a; 手机为iphone14Pro 版本iOS16.0.3 Xcode版本14.2 视频播放第三方库ZFPlayer 问题描述 使用视频时&#xff0c;视频播放自动横屏控制层的返回按钮和暂停按钮都点不到&#xff0c;上图错误、下图正确&#xff08;控制按钮距离屏幕左右减小50、视频全屏不做…

Maven:基础知识

Maven概念图生命周期目录工程创建测试常用命令COMPILATION ERROR : 不再支持目标选项 5。请使用 7 或更高版本。问题解决pom.xml文件properties配置示例scope配置详解概念图 依赖管理构建项目Maven 的底层核心实现项目的构建和管理必须通过插件完成&#xff0c;但插件本身并不包…

VC++打开或关闭目标进程的声音(扬声器)(附源码)

VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…

一刷代码随想录——单调栈

每日温度739题目描述&#xff1a;给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来…

spring security 核心类 和请求登陆过程

核心类图2. 执行登陆 首先请求被拦截器 UsernamePasswordAuthenticationFilter 拦截 看源代码可以看出默认拦截的是 /login 请求地址 当然这个地址是可以被配置的 private static final AntPathRequestMatcher DEFAULT_ANT_PATH_REQUEST_MATCHER new AntPathRequestMatche…

DFS深度优先算法 —— AcWing 842. 排列数字AcWing 843. n-皇后问题

一、了解dfs1、DFS&#xff08;Depth First Search&#xff09;DFS在我看来就是一条路走到黑&#xff0c;直到无路可走的情况下&#xff0c;才会选择回头&#xff0c;然后重新选择一条路&#xff08;官方说法即“优先考虑深度”&#xff09;整个进程反复进行直到所有节点都被访…

Allegro如何添加ICT操作指导

Allegro如何添加ICT操作指导 当PCB板需要做飞针测试的时候,通常需要在PCB设计的时候给需要测试的网络添加上ICT。 如图: Allegro支持给网络添加ICT,具体操作如下 首先在库中创建一个阻焊开窗的过孔,比如via10-ict一般阻焊开窗的尺寸比盘单边大2mil 在PCB中选择Manufacture…

Linux基础命令1(常见的系统进程、状态命令)

目录 Linux命令格式 Linux快捷按键 常用系统命令 man 查看命令的帮助信息 echo 输出信息&#xff08;将信息输出到屏幕上面&#xff09; date 查看系统的日期、时间 timedatectl 设置系统时间&#xff0c;主要是时区&…

程序环境--翻译+执行

ANSI C标准下&#xff0c;有两种程序环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 翻译环境包括&#xff1a;预处理&#xff08;预编译&#xff09;编译汇编链接。四个步骤。 第2种是执行/运行环境&#xff0c;它用于实际执行代码。 链接…

UPC-2023新生个人训练赛第18场-Rank1

问题 B: 2的N次方 题目描述 输入n行&#xff0c;每行一个整数x&#xff0c;输出2的x次方的个位是多少&#xff1f;2的3次方表示3个2相乘&#xff0c;结果是8 输入 输入n行&#xff0c;每行一个整数x 输出 输出n行&#xff0c;每行一个整数&#xff0c;2的x次方的个位。 …

Flink CEP 在抖音电商的业务实践

摘要&#xff1a;本文整理自抖音电商实时数仓研发工程师张健&#xff0c;在 FFA 实时风控专场的分享。本篇内容主要分为四个部分&#xff1a;Flink CEP 简介业务场景与挑战解决方案实践未来展望Tips&#xff1a;点击「阅读原文」查看原文视频&演讲 ppt01Flink CEP 简介Flin…

论文投稿指南——中文核心期刊推荐(冶金工业 2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

23种设计模式之策略模式

一、概念 就是将一系列算法封装起来&#xff0c;并使它们之间相互替换。被封装起来的算法具有独立性外部不可改变其特性。 策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开来&#xff0c;并委派给不同的对象对这些算…

BCN点击试剂diSulfo-Cy5-PEG3-BCN,二磺酸三聚乙二醇环丙烷环辛炔,纯度 95%+

【中文名称】二磺酸-三聚乙二醇-环丙烷环辛炔【英文名称】 diSulfo-Cy5-PEG3-BCN&#xff0c;BCN-PEG-Sulfo Cy5【CAS号】N/A【分子式】C51H68N4O12S2【分子量】993.24【基团】BCN基团【纯度】95%【规格标准】1g&#xff0c;5g&#xff0c;10g&#xff0c;包装灵活&#xff0c;…

2-ChatGPT插件到Google浏览器,并进行ChatGPT工作。

ChatGPT插件到Google浏览器&#xff0c;并进行ChatGPT工作。1&#xff0c;首先&#xff0c;在装插件ChatGPT forGoogle插件时&#xff0c;我没安装成功&#xff0c;问题是我没有区分Google浏览器和双核浏览器的差别。2&#xff0c;如何使用ChatGPT在浏览器上进行工作。1&#x…

[future 2022] 基于特征选择的DDoS攻击流分类方法

https://www.sciencedirect.com/science/article/pii/S0167739X22000474highlights•我们设计了一种特征选择方法来选择独立和相关的特征。•我们设计了一种方法来识别物联网和复杂的 DDoS 攻击流。•该体系结构在有效性和效率方面优于比较方法。摘要分布式拒绝服务 (DDoS) 攻击…

CentOS8基础篇3:使用vim编辑文档

一、vim编辑器 vim 编辑器共有三种工作模式&#xff0c;分别是命令模式、输入模式和末行模式。 〖例2.24〗使用vim编辑器创建并编辑文件hello.c。 二、查看文件内容命令 1. more/less 浏览文件全部内容 当文件内容过多时&#xff0c;可以用more或less命令来查看。 命令格式…