×

TE0711 SoM从外部闪存启动

消耗积分:0 | 格式:zip | 大小:1.64 MB | 2022-11-16

1123127317

分享资料个

描述

继续我的上一个项目,该项目涉及如何为带有 TE0701 基板的 TE0711 SoM 编写嵌入式 C 应用程序,最后一步是将应用程序编程为存在于 TE0711 的非易失性存储器中。

TE0711 配备了一个 32MByte 的 Cypress S25FL256S 外部闪存芯片,供其 Artix FPGA 使用。这是板上唯一用于存储应用程序和用户数据的非易失性存储器,它将在板的电源循环之间保留。

与 FPGA/Vivado 领域中的几乎所有东西一样,通常有几种不同的方法可以对外部闪存芯片进行编程。通常我使用 Vitis 的闪存芯片,但使用 TE0711 的特定电路板布局和 Cypress(又名 Spansion)芯片,我发现在 Vivado 中生成 MCS 并使用硬件管理器对闪存进行编程是我能得到它的唯一方法工作。

在 Vivado 中关联 ELF

首先,将来自 Vitis 的所需目标应用程序的 ELF 文件添加为 Vivado 中的设计源(Flow Navigator > Add Sources > Add or create design sources )。我喜欢使用它在 Vitis 工作区中的相对路径,因此当我在 Vitis 中重建应用程序时,我不必手动将 Vivado 看到的 ELF 文件替换为在 Vitis 中编译的新文件。

将 ELF 文件添加到 Vivado 项目后,需要将其与模块设计相关联,以便 Vivado 在生成下一个比特流时知道使用它。右键单击 Sources 选项卡中的块设计并选择Associate ELF Files...选项。

 
poYBAGNy4FqASHUMAAAt56463j8470.png
 
1 / 3从目标 Vitis 应用程序添加 ELF 文件。
 

默认情况下,Vivado 中关联的 ELF 文件是为实际设计和仿真自动生成的 MicroBlaze 引导循环。通过将设计源中的关联 ELF 从 Vitis 切换到目标应用程序,生成的比特流将导致 FPGA 在启动时执行应用程序。

生成具有关联 ELF 的新比特流

在 Vivado 综合和实现中添加并关联目标应用的 ELF 文件后,需要重新运行,并且需要生成新的比特流。

旁注:每次在 Vivado 中添加和关联 ELF 文件后在 Vitis 中构建应用程序时,一旦运行初始的新综合和实现,就会导致比特流过时。

pYYBAGNy4F2AHSY4AAAbx5v9qZ4465.png
比特流生成后,选择生成内存配置文件的选项。
 

一旦生成了新的比特流,就需要生成实际存在于外部存储器中的 MCS 文件。这就是成功生成比特流后出现的对话框中的Generate Memory Configuration File选项。也可以随时从 Vivado 中的“工具”菜单选项访问它。

在 Vivado 中确定闪存的部件号

TE0711 通过 Cypress S25FL256S 芯片配备了 32MBytes 的外部闪存。根据部件号 S25FL256S,在 Vivado 和 Vitis 中有两个支持的选项:s25fl256sxxxxxx0-spi-x1_x2_x4s25fl256sxxxxxx1-spi-x1_x2_x4

pYYBAGNy4F-AZGVfAAAzEBo255s711.png
 

根据TE0711 的 TRM,连接到 Cypress S25FL256S 芯片的所有四条 SPI 数据线都已连接,因此支持所有不同的总线宽度进行闪存。但是,我找不到任何解释xxxxxx0xxxxxx1 之间区别的文档。记录 Vivado 编程和调试的 UG908 识别了这两个选项,但仍然没有说明区别,如下面附录 E 的屏幕截图所示:

pYYBAGNy4GGAGLeqAACw8D8X3LI116.png
UG908 附录 E 概述了支持的内存配置。
 

在浏览了 Trenz 的支持论坛后,我发现了一篇关于 TE0710 SoM 的帖子,其中 Trenz 工程师确认在 Vitis 中选择的适当闪存类型是s25fl256sxxxxxx0-spi-x1_x2_x4。

然后我花了一些时间检查 TE0710 的原理图并将其与 TE0711 的原理图进行比较。这表明 TE0710 和 TE0711 使用相同的部件号赛普拉斯 S25FL256S 芯片 (S25FL256SAGBHI20) 和相同的电路配置,并证实了我的怀疑s25fl256sxxxxxx0-spi-x1_x2_x4也是 Vivado 和 Vitis 中用于 TE0711 的部件号对闪存进行编程。

poYBAGNy4GWAKNw0AAEvhaAFidE072.png
Cypress S25FL256S 芯片电路来自 TE0711 原理图。
 

生成内存配置文件

在选择Generate Memory Configuration File选项后出现的对话框中,将输出文件的格式设置为 MCS,因为 TE0711 上的 Cypress S25FL256S 芯片需要将比特流转换为 .MCS 文件类型进行存储。在文件名框中为生成的 MCS 文件指定所需的文件名和目录路径。会生成。

鉴于 Vivado 支持 Cypress S25FL256S 芯片,选择Memory Part选项,单击 Memory Part空白框右侧的三个点,然后从列表中选择s25fl256sxxxxxx0-spi-x1_x2_x4

正如我之前提到的,连接到赛普拉斯 S25FL256S 芯片的所有四条 SPI 数据线都已连接,因此支持所有不同的总线宽度进行闪存。TE0711 的约束文件将总线宽度具体指定为 4,因此需要将Interface选项设置为SPIx4

set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
pYYBAGNy4GeALV40AABEYcMsOkA229.png
选择 Cypress 芯片部分,然后指定 4 位宽 SPI 接口和比特流文件。
 

最后,由于比特流现在包含所需应用程序的 ELF 文件,因此它是唯一需要存在于闪存中的文件。选中Load bitstream files复选框,将Start address保留在 00000000 并指向位于/impl_1/中的 bitstream 文件在从 Vivado 像这样对闪存进行编程时,使用这个特定的比特流文件非常重要,因为它是 Vivado 输出的实际比特流,以及我们在前面步骤中所做的与它相关联的所需 ELF 文件。

添加配置存储设备

将 TE0711 + TE0701 连接到主机 PC 并在 Vivado 中启动硬件管理器。选择自动连接选项以建立与 TE0711 的连接。

poYBAGNy4GmAUi3SAAA9z6KZ91o458.png
使用 Vivado 中的硬件管理器连接到 TE0711。
 

右键单击硬件窗口中 localhost 下的 xc7a35t_0 部分,然后选择添加配置内存设备...选项。使用过滤器导航到列表中的 s25fl256sxxxxxx0-spi-x1_x2_x4 部件并从中选择。

 
 
 
pYYBAGNy4F-AZGVfAAAzEBo255s711.png
 
1 / 3从列表中选择 s25fl256sxxxxxx0-spi-x1_x2_x4 部件。
 

程序配置存储设备

添加闪存芯片并被硬件管理器识别后,在“硬件”窗口中右键单击它并选择“程序配置存储设备...”选项。

对于Configuration file ,指向前面步骤中生成的 MCS,位于Write Memory Configuration File对话框窗口的 F​​ilename 框中指定的目录路径。在该步骤中还生成了一个 PROM 文件,并以相同的文件名保存在指定位置,指向该文件以获取PRM 文件

至少,检查Erase ProgramVerify选项,然后单击ApplyOK以最终对 TE0711 进行编程。

 
 
 
poYBAGNy4HCAZrVGAACekwDYeSc233.png
 
1 / 4右击并选择Program Configuration Memory Device... 选项。
 

编程可能需要几分钟。

重启和测试

出现指示闪存已成功编程的对话框后,关闭 Vivado 中的硬件管理器并重启 TE0711 + TE0701。

重新启动后,使用您选择的终端应用程序连接到电路板(我只是在 Vitis 中使用串行终端,因为我通常已经打开了 Vitis)。

 
 
 
poYBAGNy4HOAXwUpAABJ3lSEYzA441.png
 
1 / 2
 

我选择在应用程序的循环中添加“Hello TE0711”的打印输出,这样控制台中就会立即看到一些东西,同时仍然保持 UART 上的字符回显功能:

/*
 * Just sits in this loop of echoing characters back to the terminal until
 * ESC key is pressed.
 */
while(RecvChar != EscChar){
    ReceivedCount = XUartLite_Recv(&UartLite, RecvChar, 1);
    if (ReceivedCount != 0){
        XUartLite_Send(&UartLite, RecvChar, 1);
    } else {
        xil_printf("Hello TE0711\n\r");
        for(int i=0;i<3000000;i++){};
    }
}

就是这样!TE0711 已编程并准备就绪。如上面的屏幕截图所示,周期性的“Hello TE0711”正在打印到控制台,并回显它接收到的字符。此应用程序的 UART 中的缓冲区仍设置为默认的较小大小,因此一次可以回显的字符长度存在限制。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !