继续我的上一个项目,该项目涉及如何为带有 TE0701 基板的 TE0711 SoM 编写嵌入式 C 应用程序,最后一步是将应用程序编程为存在于 TE0711 的非易失性存储器中。
TE0711 配备了一个 32MByte 的 Cypress S25FL256S 外部闪存芯片,供其 Artix FPGA 使用。这是板上唯一用于存储应用程序和用户数据的非易失性存储器,它将在板的电源循环之间保留。
与 FPGA/Vivado 领域中的几乎所有东西一样,通常有几种不同的方法可以对外部闪存芯片进行编程。通常我使用 Vitis 的闪存芯片,但使用 TE0711 的特定电路板布局和 Cypress(又名 Spansion)芯片,我发现在 Vivado 中生成 MCS 并使用硬件管理器对闪存进行编程是我能得到它的唯一方法工作。
首先,将来自 Vitis 的所需目标应用程序的 ELF 文件添加为 Vivado 中的设计源(Flow Navigator > Add Sources > Add or create design sources )。我喜欢使用它在 Vitis 工作区中的相对路径,因此当我在 Vitis 中重建应用程序时,我不必手动将 Vivado 看到的 ELF 文件替换为在 Vitis 中编译的新文件。
将 ELF 文件添加到 Vivado 项目后,需要将其与模块设计相关联,以便 Vivado 在生成下一个比特流时知道使用它。右键单击 Sources 选项卡中的块设计并选择Associate ELF Files...选项。
默认情况下,Vivado 中关联的 ELF 文件是为实际设计和仿真自动生成的 MicroBlaze 引导循环。通过将设计源中的关联 ELF 从 Vitis 切换到目标应用程序,生成的比特流将导致 FPGA 在启动时执行应用程序。
在 Vivado 综合和实现中添加并关联目标应用的 ELF 文件后,需要重新运行,并且需要生成新的比特流。
旁注:每次在 Vivado 中添加和关联 ELF 文件后在 Vitis 中构建应用程序时,一旦运行初始的新综合和实现,就会导致比特流过时。
一旦生成了新的比特流,就需要生成实际存在于外部存储器中的 MCS 文件。这就是成功生成比特流后出现的对话框中的Generate Memory Configuration File选项。也可以随时从 Vivado 中的“工具”菜单选项访问它。
TE0711 通过 Cypress S25FL256S 芯片配备了 32MBytes 的外部闪存。根据部件号 S25FL256S,在 Vivado 和 Vitis 中有两个支持的选项:s25fl256sxxxxxx0-spi-x1_x2_x4和s25fl256sxxxxxx1-spi-x1_x2_x4 。
根据TE0711 的 TRM,连接到 Cypress S25FL256S 芯片的所有四条 SPI 数据线都已连接,因此支持所有不同的总线宽度进行闪存。但是,我找不到任何解释xxxxxx0和xxxxxx1 之间区别的文档。记录 Vivado 编程和调试的 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 的部件号对闪存进行编程。
在选择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]
最后,由于比特流现在包含所需应用程序的 ELF 文件,因此它是唯一需要存在于闪存中的文件。选中Load bitstream files复选框,将Start address保留在 00000000 并指向位于
将 TE0711 + TE0701 连接到主机 PC 并在 Vivado 中启动硬件管理器。选择自动连接选项以建立与 TE0711 的连接。
右键单击硬件窗口中 localhost 下的 xc7a35t_0 部分,然后选择添加配置内存设备...选项。使用过滤器导航到列表中的 s25fl256sxxxxxx0-spi-x1_x2_x4 部件并从中选择。
添加闪存芯片并被硬件管理器识别后,在“硬件”窗口中右键单击它并选择“程序配置存储设备...”选项。
对于Configuration file ,指向前面步骤中生成的 MCS,位于Write Memory Configuration File对话框窗口的 Filename 框中指定的目录路径。在该步骤中还生成了一个 PROM 文件,并以相同的文件名保存在指定位置,指向该文件以获取PRM 文件。
至少,检查Erase 、Program和Verify选项,然后单击Apply和OK以最终对 TE0711 进行编程。
编程可能需要几分钟。
出现指示闪存已成功编程的对话框后,关闭 Vivado 中的硬件管理器并重启 TE0711 + TE0701。
重新启动后,使用您选择的终端应用程序连接到电路板(我只是在 Vitis 中使用串行终端,因为我通常已经打开了 Vitis)。
我选择在应用程序的循环中添加“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条评论
快来发表一下你的评论吧 !