在 i.MX RT 的系统调试过程中,意外将 SWD 的 IO 配置成了其他功能,导致无法通过 SWD 下载代码,怎么办? 这时候,我们可以通过串行方式下载代码,借以恢复 SWD 的功能。
串行下载代码(Serial Downloader)顾名思义就是通过串行总线的方式把固件下载到 MCU 里面去。i.MX RT 的串行下载路径有:USB 和 UART。串行下载方式需要 MCU 内部有个引导程序。i.MX RT 内部 ROM 没有固化这部分代码,需要用户自己制作引导程序,也叫 Bootable Application 。NXP 官网上提供了 flashloader 开发包,里面包含制作 Bootable Application 的一系列开发工具,包括:BD File、blhost.exe、elftosb.exe、MfgTool2.exe、sdphost.exe 等。下面是这些工具的联合使用流程:
1. 通过 IDE 生成 .srec 文件;
2. srec 文件通过 elftsob.exe 及配置文件(bd file)生成 bin 文件;
3. bin 文件通过 elftsob.exe 和 bd 文件生成 sb 文件;
4. 将 sb 文件命名为 boot_image.sb 并拷贝到 OS Firmware 目录下;
5. 使用 MfgTool2.exe 工具下载代码。
看到这里你是不是越看越蒙?不知你的心里会不会嘀咕:我只是想用串行方式下载个代码,为什么还要整一大堆的工具?起码我一开始的想法就是这样的。于是我去网上搜罗有没有更好的办法。原来 NXP 的工程师们早已经意识到了我们的痛点,并且使用 Python 开发了一套工具:NXP-MCUBootUtility。
与 NXP 官方的标准安全加密配套工具集(OpenSSL, CST, sdphost, blhost, elftosb, BD, MfgTool2)相比,NXP-MCUBootUtility 是一个真正的一站式工具,一个工具包含 NXP 官方所有加密配套工具的功能,并且是全图形用户界面操作。借助于 NXP-MCUBootUtility,我们可以轻松上手 NXP MCU 安全加密启动。在 Github 上就能下载到这个工具,下载地址是:http://github.com/JayHeng/NXP-MCUBootUtility。话不多说,赶紧来看看怎么使用这个工具下载代码吧。
- 准备工作
NXP-MCUBootUtility 是一个是纯绿色免安装的工具,下载了源代码包之后,直接双击 \NXP-MCUBootUtility\bin\NXP-MCUBootUtility.exe 即可使用。使用 NXP-MCUBootUtility 没有任何软件依赖,不需要额外安装任何软件。
在使用 NXP-MCUBootUtility 工具前还需要有两个准备工作:
① 准备好 i.MXRT 硬件板以及串行下载连接线(USB/UART)
通过 BOOT_Mode[1:0] = 01b 使 MCU 进入串行下载方式。
串行接口有两个:UART1 和 USB OTG1
UART1 对应的 GPIO :
USB OTG1 对应的 GPIO:
② 准备好用于下载进 Flash 的源 image 文件(包括 elf/axf/srec/hex/bin)。源 image 既可以包含 i.MXRT 加载启动头(IVT, BootData 等),也可以不包含这些 i.MXRT 加载启动头。如果源 image 中不包含这些启动头,NXP-MCUBootUtility 会自动添加文件头。
默认情况下,ram 工程和 flexspi_nor 工程生成的 image 文件是无法直接为 NXP-MCUBootUtility 所用的,需要做一些小小的改变。
ram 工程需要修改 linker 文件如下:(推荐从 0x3000 开始链接中断向量表,中断向量表前面预留一段内存用于放置 i.MXRT 加载启动所需的文件头)。
define symbol m_interrupts_start = 0x00003000; // 0x00000000
define symbol m_interrupts_end = 0x000033FF; // 0x000003FF
define symbol m_text_start = 0x00003400; // 0x00000400
define symbol m_text_end = 0x0001FFFF;
define symbol m_data_start = 0x20000000;
define symbol m_data_end = 0x2001FFFF;
define symbol m_data2_start = 0x20200000;
define symbol m_data2_end = 0x202BFFFF;
flexspi_nor 工程需要修改工程配置选项里的 Defined symbols 如下:将 XIP_BOOT_HEADER_ENABLE 设为 0,即不需要生成包含 i.MXRT 加载启动文件头的 image ; 如果保持 XIP_BOOT_HEADER_ENABLE 为 1 不变,那么生成的可执行 image 文件会包含 i.MXRT 加载启动文件头。
- 界面
下图为 NXP-MCUBootUtility 的主界面,界面主要由 6 个部分组成,各部分功能如下:
【菜单栏】:功能菜单栏,提供软件通用设置。
【存储设备设置】:目标设备和存储设备设置栏,提供 MCU Device 和 Boot Device 配置选项。
点击这个区域中的“Boot Device Configuration”按钮,可以选择列表中的存储设备,也可以自己配置 FDCB 来适应自己板子上的设备:
【接口设置】:串行接口设置栏,选择用于连接 MCU Device 的接口。在下载代码之前需要先点击“Connect to ROM”按钮连接 MCU 。
【设备状态显示】:目标设备状态信息栏,当连接上目标设备之后,用于显示目标设备的状态。
目标设备连接成功后可以在目标设备状态信息栏看到一些有用的设备状态信息,比如 MCU 芯片的 UUID 值、HAB 状态、与启动相关的重要 Fuse 值,Boot Device 的 Page/Sector/Block 大小等。
【Log 信息区】:操作日志栏,记录软件操作日志。
【操作区】:安全加密启动主界面,提供对目标设备做安全加密启动的所有操作。包括如下四页标签:
① Image Generation Sequence:image 生成窗口,用于对源 image 进行加密安全处理,生成可放在 Boot Device 中的 bootable image。
② Image Loading Sequence:image 下载窗口,用于将生成的 bootable image 下载进 Boot Device 中,并且在 MCU 中烧录相应的 Fuse 值(各种 Key,HAB 设置等)。
③ eFuse Operation Utility:eFuse 回读与烧录窗口,用户可烧录自定义值进 Fuse Region。
④ Boot Device Memory:image 回读与标注显示窗口,用于从 Boot Device 回读已下载的 Bootable image 数据,并对数据组成各部分进行标注。
在操作区中 Secure Boot Type 选项用于安全加密模式的选择,选择想要的安全模式包括:不使能安全(DEV Unsigned Image Boot)、HAB 单签名(HAB Signed Image Boot)、HAB 签名加密(HAB Encrypted Image Boot)、BEE 加密(BEE Encrypted Image Boot)。这里我就简单介绍常用的不使能安全加密的使用方法:
①【Secure Boot Type】选择“DEV Unsigned Image Boot”,
② 点击【Browse】按钮选择一个原始 image 文件(使用 IDE 生成的裸 image 文件即可,不需要包含任何 i.MXRT 启动所需的额外文件头),
③ 点击【All-In-One Action】按钮即可完成 bootable image 生成与下载所有操作。
就是这么简单~~
今天介绍了 i.MX RT 串行下载的一个简单方法,希望对有这方面了解需求的你有些帮助。如果要获得更详尽的信息,可以参考 NXP 社区网站。如果您还有更多的疑问,欢迎在下面评论区评论。
在后续的博文中,我会继续写一些关于 i.MX RT 的笔记,请多多来大大通关注我哦。
参考资料
- i.MX RT1060 Processor Reference Manual - https://www.nxp.com.cn/products/processors-and-microcontrollers/arm-microcontrollers/i-mx-rt-crossover-mcus/i-mx-rt1060-crossover-mcu-with-arm-cortex-m7-core:i.MX-RT1060?tab=Documentation_Tab
- i.MXRT开发小助手NXP-MCUBootUtility用户指南 -恩智浦技术社区 https://www.nxpic.org.cn/module/forum/thread-617748-1-1.html
评论