从Micro SD卡启动NXP i.MX RT1052-EVK开发板
对于Linux系统来说,从micro SD卡启动是一件很常见的事情,如Raspberry Pi。但微控制器并不常见。恩智浦i.MX RT ARM Cortex-M7填补了这两个世界之间的空白。这并不奇怪,它带有ROM引导程序,可以从micro SD卡启动。
i.MX RT1052开发板上的SD卡
从SD卡启动有点酷:将新软件加载到SD卡上,插入并从中启动。在某些应用程序中,这非常有用:在我的配置中,处理器启动ROM引导加载程序,然后将镜像文件从SD卡加载到RAM中,然后运行它。在该配置中,不需要内部或外部FLASH存储器。
软件和工具
在本文中,我使用了以下软件和工具:
● 恩智浦MCUXpresso IDE 10.3.0
● 适用于i.MX RT1052(EVKB)的恩智浦MCUXpresso SDK SDK 2.5.0
● 恩智浦i.MX RT1050-EVKB
● 适用于RT1052的恩智浦Flashloader
新建工程
为了验证加载是否按预期工作,我喜欢创建一个LED闪烁的工程'blinky':这很简单,不需要太多。
因为i.MX RT上的引导加载程序会将应用程序加载到RAM空间,所以我确保我的项目链接到RAM。一种简单的方法是在项目创建/导入期间指定:
链接到ram
RAM设置反映在项目设置中:
在链接器设置中将应用程序链接到ram
在下一步中,我需要更改位于项目设置中的内存映射:
原来的映射图
请注意,这会将应用程序加载到大小为64 KB的ITC RAM中。因此,加载大于此值或超出内存范围的应用程序将失败!
引导加载程序需要ITC SRAM下端的某些部分,所以我必须释放0x2000的大小。
请注意,恩智浦文档使用0xa000作为应用程序向量和起始地址。我无法使用该地址,对我有用的是这个0x2000地址。
我使用原始SRAM_ITC上的“Split”按钮,将Location更改为0x2000并将大小减小了0x2000。最后,我已经移动到底部的低0x0-0x2000 RAM区域(只是我仍然列出它)。最重要的是:将带有0x2000起始地址的SRAM_ITC移动到列表的开头:这样链接器脚本就会将向量表放在那里。目标是将向量表放在该定义的地址处。下面是截图:
改变了的内存映射图
S19文件
接下来是配置MCUXpresso项目以生成S19(S-Record)文件,因为将来需要这样做。
所以将它添加到项目设置和后期构建步骤:
- arm-none-eabi-size "${BuildArtifactFileName}"
- arm-none-eabi-objcopy -v -O srec "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.s19"
复制代码
添加build步骤生成s19文件
构建项目,应生成S19文件:
s19文件
测试调试运行
现在是构建和调试该项目以确保其运行的好时机:使用MCUXpresso IDE并下载应用程序。我正在使用XiP(外部闪存eXecute就地)启动设置:
xip启动配置
然后检查一切是否正常:
在ram中执行
看着LED闪烁,你知道已经实现了闪烁功能。
创建SD卡启动映像
要从SD卡启动应用程序,我必须将.s19转换为特殊格式。有不同的可启动映像,从不安全,已注册到安全启动映像。为了简单起见,我选择了一个“不安全”的。
为此,我需要安装在以下目录中的'Flashloader'实用程序:
- C:\nxp\Flashloader_i.MXRT1050
复制代码 另外,我的'blinky'应用程序位于此文件夹中:
- C:\Users\Erich Styger\Data\GitRepos\McuOnEclipse\Examples\MCUXpresso\i.MX RT1050_EVK\MIMXRT1052_blinky_in_RAM
复制代码
flashloader安装文件夹
首先在编辑器中打开以下文件:
- C:\nxp\Flashloader_i.MXRT1050\Tools\bd_file\imx10xx\imx-itccm-unsigned.bd
复制代码 并检查它是否具有.bd配置文件的以下值/内容
- options {
- flags = 0x00;
- # Note: This is an example address, it can be any non-zero address in ITCM region
- startAddress = 0x1000;
- ivtOffset = 0x400;
- initialLoadSize = 0x2000;
- # Note: This is required if the default entrypoint is not the Reset_Handler
- # Please set the entryPointAddress to Reset_Handler address
- entryPointAddress = 0x00002000;
- }
- sources {
- elfFile = extern(0);
- }
- section (0)
- {
- }
复制代码 请注意,NXP默认和文档将0x8000列为“startAddress”。我需要将其更改为0x1000以使其正常工作!
启动DOS shell并使用'cd'命令进入以下文件夹:
- C:\nxp\Flashloader_i.MXRT1050\Tools\elftosb\win
复制代码
dos shell
接下来,将s19文件复制到该elftosb文件夹:C:\nxp\McuBootUtility\Flashloader_i.MXRT1050_GA\Tools\elftosb\win>
- copy "C:\Users\Erich Styger\Data\GitRepos\McuOnEclipse\Examples\MCUXpresso\i.MX RT1050_EVK\MIMXRT1052_blinky_in_RAM\Debug\evkbimxrt1050_iled_blinky_in_RAM.s19" .
复制代码
复制.s19文件
接下来,从.s19文件构建.bin
生成bin文件
这实际上创建了两个文件。 'padding'从0x0000开始。我们需要的是'nopadding.bin',因为这个从0x2000开始。
在下一步中,使用以下命令生成引导映像文件boot_image.sb:
- elftosb.exe -f kinetis -V -c ../../bd_file/imx10xx/program_sdcard_image.bd -o boot_image.sb application_nopadding.bin
复制代码
创建启动映像
生成启动映像
将boot_image.sb复制到mfgtools的“OS Firmware”文件夹:
- copy boot_image.sb "C:\nxp\Flashloader_i.MXRT1050\Tools\mfgtools-rel\Profiles\MXRT105X\OS Firmware"
复制代码
复制启动映像
验证以下文件的内容:
- C:\nxp\Flashloader_i.MXRT1050\Tools\mfgtools-rel\cfg.ini
复制代码 应该这样:
- [profiles]
- chip = MXRT105X
- [platform]
- board =
- [LIST]
- name = MXRT105X-DevBoot
复制代码 将SW07开关设置为在串行下载模式下启动电路板:
SW07:1-OFF,2-OFF,3-OFF,4-ON
串行下载器模式
我正在使用OpenSDA USB连接器上的USB电缆为电路板供电。所以为此,我必须将跳线放在SW1附近的中间位置:
通过opensda供电板
首先使用调试USB端口(右下方的黑色电缆)为电路板供电,然后插入串行下载器的USB电缆(下方底部的白色/蓝色电缆):
电路板处于串行下载模式
接下来,启动以下工具
- C:\nxp\McuBootUtility\Flashloader_i.MXRT1050_GA\Tools\mfgtools-rel\MgTool2.exe
复制代码 如果连接到Serial Loader,它应该显示如下:
连接mfg tool
按“开始”按钮,它应该将启动图像写入SD卡:
开始
按停止,然后按退出以关闭工具。现在最后一步:
关闭电路板并将SW7更改为从SD卡启动:
SW07:1-ON,2-OFF,3-ON,4-OFF
用于sd卡启动的i.MXRT1050-EVKB上的SW7
现在享受SD卡加载的应用程序:
LED不断闪烁
总结
从SD卡启动i.MX RT开发板是可以实现的。 数据存储在卡上的“RAW块”中,并由ROM引导加载程序加载到RAM中并从那里执行。 应该可以从这里编程闪存,使用SD卡上的文件系统和更多的东西。
作者:阿哲 文章出处:点击
|