上一篇说明了《RT1052学习笔记(三) 官方MCUXpresso 搭配Jlink调试下载》
本篇将介绍RT1052的启动流程和编译后文件的bin文件构造(bin文件的生成请移步上一篇)。
以下内容针对使用外部FlexSpi NOR Flash的情况,其他形式未仔细研究,可能存在细节差异。
研究意义
这块花了我不少时间去研究,之前用其他单片机很少关注这一块,那为什么要学习这部分呢?
因为一般产品都要求有程序升级功能,而RT1052没有找到相应的参考,官方例程里面的bootloader下有3个工程,分别是flashloader(向对应的存储介质载入代码)和两个LED闪烁应用程序(运行在外部Flash和内部ram中),而且文件结构啥的也跟现有MCUXpressoIDE创建的工程不一致,估计是很早之前的版本,没有同步好,对做升级的参考意义不是很大。
所以要做升级必须要了解它的启动细节。
启动方式
RT1052的启动方式多种多样,感觉是能存代码的地方它都支持启动,比如SD卡、各类的Flash,可以分两种:
1、直接从外部存储设备原地XIP执行,针对的是FlexSpi NOR 。
2、从外部存储设备加载代码到指定RAM中执行,比如各类nand falsh,emmc,当然NOR Flash也是可以的。
从下图可以看到所支持的启动设备种类:
既然支持这么多种设备的启动方式,那一定需要在启动前设置好,告诉芯片内部的boot ROM从哪加载,
是的,我们可以通过内部的熔断丝位(eFUSE)去配置启动方式,但是熔断丝是一次性的,设置完后无法再更改,
显然这是针对量产时的操作,在我们开发时可以通过外部相关引脚的电平去配置启动方式。
具体的配置方法各个教程厂家都有详细说明,大家可以自己搜索,这里不再整理。
文件构成
在这里特别要感谢网友 痞子衡,他的一系列博客给了我很大帮助,这里放一下他的博客地址:https://www.cnblogs.com/henjay724/
大家一定要去看下,很系统也很详细,这里把我的理解归纳整理下。
这个文件(.bin)就是下载进去外部Flash的原始数据文件,据说也叫Bootable image。
它的构成如下:
我这里只对使用外部FlexSpi NOR Flash为例说明,我使用的型号是W25Q128。
1、FDCB:Flash Device Configuration Block
地址:0x00-0x1000
这里也可以叫FCFB(FlexSPI Configuration block)地址:0x00-0x200。
这段的作用是告诉芯片该如何初始化 外设FlexSpi和Flash的。
你可能要问了,当MCU能读到这些数据时不是证明外设驱动是好用的吗?为啥还要Flash的驱动数据?
没错,不知你有没有想过RT1052支持这么多种存储设备,那上电后怎么知道需要初始化的芯片是哪种型号呢?
是这样的,芯片启动后先使用内部寄存器的默认值去配置外设,但这些驱动都不是最优的,只是保证能从芯片读出数据,
往往速率很低,这里是30M,然后再根据读回来的驱动数据重新初始化Flash,就达到最优的性能了。
具体对应的结构体见上篇中 第2节 存储设备驱动配置文件。详细意义可参考用户手册:
2、IVT: Image Vector Table
地址:0x1000-0x1020
这是一个地址向量表,里面记录了各个配置块和APP的地址信息。
每个参数都占4Byte,具体意义如下图:
对应结构体在工程XIP文件夹中fsl_flexspi_nor_boot.c文件,如下:
3、BD: Boot data structure
地址:0x1020-0x1030
存储要加载到的目的地址和要加载的长度,这个很重要,可以实现程序链接到哪个位置。
后面章节我还会继续介绍。
对应的结构体在工程XIP文件夹中fsl_flexspi_nor_boot.c文件,如下:
4、DCD: Device Configuration Data
地址:0x1030-0x2000
配置SEMC、外部SDRAM等。
对应的配置在工程XIP文件夹中evkbimxrt1050_sdram_ini_dcd.c文件,
详细没有研究过,需要请看手册:
5、APP
地址:0x2000 -
这个没啥可说的,就是你的应用程序。
补充说明下, bin文件存放地址是从Flash 0x00开始的,映射到芯片是地址0x60000000,
你要问如果不从Flash地址0x00开始存可不可以,我的理解是不可以,因为芯片启动是需要从0x00地址加载引导数据的,
但是你可以把application放到任意位置,对应修改IVT的结构体就行,很不幸MCUXpresso默认生成的是一个整文件,
包含引导数据和APP,也可以单独生成不带引导信息的app文件,这个后面再说。
启动流程
下图是从用户手册中截出,对理解启动非常重要,建议仔细的研究。
这里借用痞子衡 的介绍,如下:
暂时不再整理,因为我还有些东西没搞清楚,上电后内部启动ROOM一次加载多大的数据到内部RAM?
针对我使用的Flash数据大小是不是8K?加载哪些部分? 在手册中找到
痞子衡介绍 需要4KB用加载initial non-XIP image(0x20208000 - 0x20208FFF),
启动后我从地址0x20208000 读出数据,并没有发现启动块内容,是中间过程给覆盖掉了吗?
这些后续有时间再仔细研究。
反正我目前的这些了解,可以做到APP程序链接到任意RAM区域启动,然后通过设置PC,SP指针跳转到任意地址启动,实现IAP。
这些将在后续篇章进行介绍。
看了您的博客,真是佩服。不知道这些信息您都是从哪得到的,我每次出问题,除了百度,什么都不会。希望您能不吝赐教,稍稍指导一下如何解决问题的方向,不胜感激。
惭愧,这个系列基本烂尾了,在忙别的事情,看看之后再找时间整理下吧。我也都是在网上到处看,逐渐摸索,整理的。