小猫爪:i.MX RT1050学习笔记25-NXP-MCUBootUtility的使用(RT1170)

i.MX RT1050学习笔记25-NXP-MCUBootUtility的使用(RT1170)

1 前言

  NXP-MCUBootUtility是NXP一位大佬写的一个针对RT系列的通用型下载工具,前面对它做了一个简单的介绍,该工具的下载地址如下:https://github.com/JayHeng/NXP-MCUBootUtility。下面也有对这个软件的具体说明。

  接下来我们就以NXP-RT1170-EVK板子来做一个使用示范,虽然不能涵盖所有的应用,尽量在其中穿插着一些使用的注意点。

  文中涉及到的几个镜像文件大家可以再这里下载:https://download.csdn.net/download/Oushuwen/20269270。

2 XIP启动

2.1 准备镜像

  MCUBootUtility支持的可执行文件的类型有很多,具体如下图所示:
在这里插入图片描述
  其中.out可执行文件肯定是最方便的了,因为编译器一般默认生成都是这种文件,里面不仅涵盖了原本的软件信息,还包括了调试相关等信息,至于s19,HEX以及bin则比较纯粹了。

  下面用同一个工程在编译出的.out以及bin文件做个示范。我们先以NXP的MCUXPresso为例。

  因为为了RT能够成功启动,镜像文件中不仅需要原始的APP信息,还需要FDCB,IVT,boot data, DCD等额外头信息(关于镜像的分解可参考另一篇文章:i.MX RT1050学习笔记9-镜像文件分解),而MCUBootUtility会重新对镜像附加这些额外头信息,所有我们需要对NXP的SDK工程进行一些配置,来使得编译出的可执行文件只有APP的信息。

  (附加:在MCUBootUtility的高版本中,增加了一个小功能,就是可以选择保留FDCB,意思就是可以保留原始镜像上的FDCB,所以理论上不去除额外头信息的完整的RT镜像文件也是可以的,但是不能太过绝对,这里面会存在一些小问题,原因不详,如果使用完整镜像的话,会有很大的概率导致最后下载进flash的镜像是有问题的。)

  怎么去除这些额外信息呢,其实非常简单,对于MCUXPresso的工程需要在预宏定义中改变这个值:
在这里插入图片描述
修改XIP_BOOT_HEADER_ENABLE为0,这样就OK了。

对于其他的编译器也是一样的,对于KEIL修改位置如下图:
在这里插入图片描述
IAR则如下图:
在这里插入图片描述

  之后就是编译,将编译好的可执行文件以及bin文件拿出来。接下来就是下载了。

2.2 下载

  将MCUBootUtility与板子建立连接后,先选择好上面编译出的可执行文件,按照下图配置好相应信息,点击下载:
在这里插入图片描述
  下载完成后,我们查看相关信息可以看到下载到flash中的信息已经包含了额外头信息以及原始APP数据。
在这里插入图片描述
在这里插入图片描述
  再对比一下APP信息是否一样:
在这里插入图片描述
在这里插入图片描述
  可以看到都是一样的,接下来就是启动开发板,看是否正常可以运行。

  接下来再试一下下载bin文件,对于bin文件,我们则是需要添加一个参数,程序链接起始地址,我的APP链接起始地址为0x30002000,所以如下:
在这里插入图片描述
  这个信息可以在链接文件中得到,也可以在map文件中得到,也就是中断向量表的起始地址:
在这里插入图片描述

  再次查看相关信息,运行板子,结果和上面一模一样。

3 non-XIP启动

  对于链接到RAM的工程(即non-XIP启动),除了不需要额外头信息外(对于IAR和keil的RAM版本工程默认就不带额外头信息,所以不需要配置预宏定义参数:XIP_BOOT_HEADER_ENABLE),还有一点非常重要,就是APP的起始链接地址一定不要是存储器的起始地址,最好有个0x2000的偏移,举个例子,RT1170的SDRAM起始地址为0x80000000,程序的链接起始地址就不能为0x80000000,而需要为0x80000000+0x2000,至于原因则是因为RT的non-XIP启动需要拷贝整个镜像,除了APP部分外,还需要拷贝前面的额外头信息,而这多出来的偏移则是为了容纳除了APP部分的额外头信息。所以对于链接到非flash存储器的工程,则是需要修改链接文件。

3.1 准备镜像

  接下来我们还是以MCUXPresso为例,还是以之前的工程为例,之前的工程是XIP启动,即在flash中运行,所以先得将这个工程链接到RAM中,将其变成一个non-XIP启动的工程。

  就以在SDRAM中运行为例,首先还是如上面介绍的将预宏定义XIP_BOOT_HEADER_ENABLE修改成0,还需要在配置中将SDRAM的优先级提高,并且把位置以及大小修改一下(这样做就是为了前面的0x2000大小的偏移),如下图:
在这里插入图片描述

  随后再修改一下链接配置,如下图:
在这里插入图片描述
  之后就是编译,我们查看一下map文件可以看到果然程序被链接到地址0x80002000处:
在这里插入图片描述
  程序镜像准备好了,接下来还需要一个东西,因为程序是在SDRAM中运行,所以还需要DCD数据来初始化SDRAM相关的外设和引脚,可以通过MCUXpresso的config tools生成dcd.bin,在MCUXpresso中点击Device configuration,如下图:
在这里插入图片描述
  然后按照下图设置生成dcd.bin文件:
在这里插入图片描述

  等dcd.bin文件也生成之后,准备工作就完成了,下面就是进行下载。

  而对于KEIL和IAR来说,只需要修改相应的链接文件就好,将程序的起始链接地址即中断向量表的链接地址加上一个偏移,最好是0x2000,因为0x2000可以涵盖非常多的情况,这里就不做解释了。修改也是非常的简单。

对于KEIL的scf文件如下:
在这里插入图片描述
对于IAR的icf文件如下:
在这里插入图片描述

3.2 下载

  将MCUBootUtility与板子建立连接后,先选择好上面编译出的可执行文件,按照下图配置好相应信息,点击下载:

在这里插入图片描述

  下载完成后,我们查看相关信息可以看到下载到flash中的信息已经包含了额外头信息以及原始APP数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  可以看到在IVT信息中,程序入口地址已经变成了0x800024E1,这个地址正处于SDRAM中,而APP中的堆栈地址也变成了0x83000000。

  可以看到都是一样的,接下来就是启动开发板,看是否正常可以运行。结果是正常的。

  接下来再试一下下载bin文件,对于bin文件,我们则是需要添加一个参数,程序链接起始地址,我的APP链接起始地址为0x80002000,所以如下:
在这里插入图片描述
  这个信息可以在链接文件中得到,也可以在map文件中得到,也就是中断向量表的起始地址:
在这里插入图片描述

  再次查看相关信息,运行板子,结果和上面一模一样。说到这里,关于MCUBootUtility的使用就介绍到这里了。如果有问题欢迎留言。

END

猜你喜欢

转载自blog.csdn.net/Oushuwen/article/details/118722425