【JokerのKintex7325】SDK程序从QSPI启动。

软件环境:vivado 2018.1        硬件平台:XC7K325 


大年初一,祝大家新年快乐。抗击病毒形势这么严峻,哪里都去不了,窝家里写写笔记吧。继续之前的博客内容,把在SDK下的程序通过QSPI启动这个话题再延伸延伸,说说在K7的软核microblaze下面怎么搞,跟Z7下面的方式还是有区别的。

虽说只摆个microblaze软核,建个最小工程就能验证QSPI的烧写,但这里还是使用的是带网络功能的block design,搞的其实复杂了,至于为什么这么搞,后面会说。       

QSPI设置如下,这里需要注意一点,如果QSPI-FLASH挂在FPGA的专用管脚,则就要使能STARTUPE2原语,使用普通IO则不用使能。

编译生成bit stream完毕后,导入SDK,先建立lwip echo应用。

 修改创建的应用程序运行空间,让其运行在DDR内。

 

 最好在烧写入QSPI之前实际debug一下应用程序,确保是能正常运行且与预期要求是一致的。

 接下来做fsbl,创建新应用,选择自带的SREC SPI Bootloader。

但直接生成的并不能拿来直接使用,有些BSP的参数要改,第一个地方,BSP设置里面,serial_flash_family,我用的micron的片子,所以改成5,这个根据实际使用的QSPI片子型号自己修改。

 第二个要改的地方,fsbl应用上右键---generate linker script。

 改程序运行空间到bram里面,至于为什么不跟之前的lwip一样,放在DDR里,要改的地方改完,后面会说。

 接下来,先program FPGA。

 将Vivado中生成的bit文件和fsbl编译过的fsbl.elf文件合一起,生成download.bit。

 Program以后,左侧system_wrapper_hw_platform_0中可以看到生成的download.bit

 右键,查看download.bit文件大小,可以看到生成的启动文件 5266445 = 0x505C0D byte

 知道启动bit的大小以后,在fsbl中将blconfig.h中,修改FLASH_IMAGE_BASEADDR参数,这个参数是烧写到QSPI-FLASH里的应用APP相对于基地址的偏移量,那基地址到FLASH_IMAGE_BASEADDR放什么,当然是刚才生成的fsbl和bit stream合成的download.bit,所以才会将download.bit大小转16进制计算,就是为了算这个偏移量,但是这里写的0x00800000是为了两程序段之间留一定余量。

 将所有程序全部编译一遍以后,烧写QSPI前的准备工作基本也就做完了,烧写前切记记得如果还有在debug的程序,断掉debug,并disconnect连接。烧FLASH点击Program FPGA旁边的Program Flash按钮即可。

 首先烧写lwip应用程序,注意应用的elf文件路径、偏移量、Flash型号选对,将第一个选框ELF转换为SREC文件选中,因为我们fsbl的应用程序本身能识别的启动文件类型,就是srec文件,所以第一个框务必勾选。

 看到console框里的flash operation successful,应用程序就烧写完毕了。

接下来就是烧写启动文件download.bit了,注意,偏移量写0x00烧写到0地址。

 经过了8分钟的漫长等待时间,终于烧写完毕了。

 启动看看。

 经过漫长的等待,和无数的打印,终于启动了,花了6分钟,终于启动了,你敢信?我他吗人傻了啊,大过年的。启动个lwip空壳应用程序就花了6分钟,再加点收发的数据处理,那还得了?吓的我看了一眼lwip应用程序的大小。

 261 k,还好呀,再看看烧写时候转换成的srec文件。

也没变大多少啊,按理说qspi速度应该很快的,200多k怎么算都不至于需要6分钟啊。不过庆幸的是,功能倒是正常的没问题。


最后,说点前面留下的问题:

1. 当前网络上大多数关于microblaze的例程,都是简单的搭个microblaze的最小系统,SDK这边烧个简单的hello world,这只能验证个最基本的操作方法,真到实际项目中microblaze软核稍微承担点任务量,需要烧QSPI-Flash上电自启动,然后光是启动,就要等上个大几分钟,这谁受得了?客户早就操了。所以这也是我为什么这里用的lwip的程序来验证QSPI烧写启动的原因,因为这样才能看出来问题。

2.为什么fsbl的程序放bram里,这里需要先说明一下,网上的大多数例程没有挂bram,直接将fsbl的程序放在片上的ocm里,我这样尝试没有成功,但是使用挂bram然后fsbl程序放bram里启动却尝试成功了,有可能是我哪些设置没设置对,也有可能是网上例程有问题,还有可能是当挂bram时候,bram中程序搬运的优先级高于片上ocm,这个我不清楚,也就不评价了,只是指出这里有差异而已。

3.理论上开机时候打印的那么多调试信息,也很浪费启动时间,这个可以通过屏蔽FSBL工程中bootloader.c文件中的

//#define VERBOSE

 来让调试信息不打印出来,但是尝试过了以后,启动时间几乎没有任何的缩短,所以也侧面说明了,影响启动时间过长的原因中,基本不包括启动时的调试信息打印。

4.我所理解的整个的一个启动方式,大概是系统上电以后,先从qspi的0地址找到download.bit用其中的bit stream例化FPGA,然后将fsbl搬到bram中运行,紧接着在fsbl程序头文件设定的偏移地址处找到srec格式的应用程序文件,将其搬到DDR中(一般应用程序大小大于bram的大小,所以只能放DDR中运行)直到搬完然后运行,fsbl任务完成,程序启动。

  • 5
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值