NXP RT1170 的 SBL(Secondary Bootloader)支持 ISP(In-System Programming)在线下载功能,可实现用户 APP 的远程烧录与启动,但带 SDRAM 的复杂 APP(如 GUI、FreeRTOS 工程)直接下载会因SBL 未启用 SDRAM 驱动导致启动失败。本文基于 RT1170-EVK 开发板,详解 SBL 的 SDRAM 使能配置、带 SDRAM APP 的工程适配、镜像签名与 ISP 下载全流程,解决带 SDRAM APP 的启动问题,实现 Vector Freertos 等 GUI 工程的稳定运行。
资料获取:RT1170 SBL ISP下载带SDRAM APP
1. 核心问题与环境准备
1.1 带 SDRAM APP 启动失败的核心原因
- 简单 APP(如 led_blinky、helloworld)仅运行在片内 RAM/Flash,无需 SDRAM,可正常启动;
- 复杂 GUI APP(如 vector_freertos)需占用 SDRAM 存储图像数据、运行时内存,SBL 未初始化 SDRAM 时,APP 运行会因内存访问失败而启动崩溃;
- 解决关键:在 SBL 中启用 SDRAM 配置,让 SBL 在启动 APP 前完成 SDRAM 的初始化,为 APP 提供可用的外部内存空间。
1.2 软硬件环境准备
(1)硬件
(2)软件与源码
- 编译工具:ARM GCC 9-2019-q4-major(SBL 编译专用)、MCUXpresso IDE(APP 工程编译);
- SBL 源码:NXP 官方 SBL 仓库(https://github.com/nxp-mcuxpresso/sbl);
- 烧录工具:MCUBootUtility(实现 SBL ISP 下载);
- 参考文档:NXP SBL/SFW 用户指南(https://www.nxp.com/docs/en/user-guide/MCUOTASBLSFWUG.pdf);
- 测试 APP:RT1170 SDK 中的
evkmimxrt1170_vector_freertos_cm7(带 SDRAM 的 GUI 工程)。
(3)关键工具下载
- ARM GCC 9-2019-q4-major:ARM 官方下载;
- MCUBootUtility:GitHub Release。
2. 步骤 1:SBL 源码配置与编译(核心:启用 SDRAM)
scons工具实现,需完成编译路径指定、SDRAM 使能、单镜像 OTA 配置、加密密钥生成四大核心步骤,最终编译出带 SDRAM 初始化的 SBL 工程。2.1 配置 ARM GCC 编译路径
- 解压 SBL 源码到本地目录(如
D:sbl-master); - 安装 ARM GCC 9-2019-q4-major,默认安装路径为
C:Program Files (x86)GNU Tools Arm Embedded9 2019-q4-majorbin; - 打开 SBL 工程配置文件
sbl-mastertargetevkmimxrt1170sblprofile.py,修改EXEC_PATH为 ARM GCC 的 bin 目录路径:EXEC_PATH = r'C:Program Files (x86)GNU Tools Arm Embedded9 2019-q4-majorbin'
2.2 SBL 核心功能配置(启用 SDRAM + 单镜像 OTA)
- 打开
sbl-mastertargetevkmimxrt1170env.bat,自动打开命令行并加载 SBL 环境; - 输入配置命令,进入图形化配置界面:
scons --menuconfig - 启用单镜像 OTA 功能(ISP 下载基础):
- 选择
MCU SBL core→ 勾选[*]Enable single image function;
- 选择
- 启用SDRAM 支持(解决 APP 启动失败的核心):
- 展开
Platform Drivers Config→ 勾选[*]Enable SDRAM; - 确认
Board flash support选择板载 Flash(ISSI_IS25WPxxxA Flash);
- 展开
- 保存配置:点击
<Save>,默认保存为.config文件,点击<Exit>退出配置界面。
2.3 生成 IAR 工程并验证 SDRAM 配置
- 在 env.bat 命令行中输入指令,生成 IAR 格式的 SBL 工程:
scons --ide=iar - 打开生成的工程
sbl-mastertargetevkmimxrt1170iarsbl.eww; - 验证 SDRAM 配置:工程中已自动加入 SDRAM 的 DCD 初始化代码,宏定义
BOARD_SDRAM已启用,说明 SDRAM 配置生效。
2.4 生成加密密钥并更新 SBL 公钥
- 在 env.bat 命令行中切换到密钥生成脚本目录:
cd ....componentsecuremcubootscripts - 生成 RSA2048 私钥与公钥(替换
xxxx为自定义名称,如rt1170):python imgtool.py keygen -k rt1170_priv.pem -t rsa-2048-sign python imgtool.py getpub -k rt1170_priv.pem -o rt1170_pub.pem -t sign - 替换 SBL 默认公钥:将生成的
rt1170_pub.c中的公钥内容,复制替换sbl-mastercomponentsecuremcubootsign-rsa2048-pub.c的全部内容; - 编译 SBL 工程:在 IAR 中编译
sbl.eww,生成可执行文件,通过调试器下载到 RT1170-EVK 开发板。
3. 步骤 2:带 SDRAM APP 工程配置与镜像签名
evkmimxrt1170_vector_freertos_cm7工程为例,在 MCUXpresso IDE 中完成地址偏移、去除 FCB/DCD 头、编译生成 bin 文件,并通过imgtool.py为镜像添加 SBL 识别的签名头。3.1 MCUXpresso IDE 导入 APP 工程
- 打开 MCUXpresso IDE,通过「Import SDK Examples」导入
evkmimxrt1170_vector_freertos_cm7工程; - 确认工程已启用 SDRAM 相关配置(SDK 默认带 SDRAM 配置,无需额外修改)。
3.2 APP 工程核心配置(地址偏移 + 去除 FCB/DCD)
- 设置地址偏移:将 APP 的运行地址偏移至
0X30100400(SBL 预留 0X30100000-0X301003FF 为镜像头区域);- 打开工程「Properties」→「MCU Linker」→「Managed Linker Script」,修改 RAM 起始地址为
0X30100400;
- 打开工程「Properties」→「MCU Linker」→「Managed Linker Script」,修改 RAM 起始地址为
- 去除 FCB 和 DCD 头:禁止 APP 自行初始化 Flash 和 SDRAM(由 SBL 完成);
- 打开工程「Properties」→「C/C++ Build」→「Settings」→「MCU Compiler」→「Preprocessor」;
- 添加宏定义:
XIP_BOOT_HEADER_ENABLE=0、XIP_BOOT_HEADER_DCD_ENABLE=0;
- 保存配置,编译工程,在工程
debug目录下生成 bin 镜像文件evkmimxrt1170_vector_freertos_cm7.bin。
3.3 APP 镜像签名(添加 SBL 识别头)
imgtool.py为 bin 文件添加签名头和 SDRAM 相关配置,生成 SBL 可识别的镜像:- 将编译好的 APP bin 文件复制到 SBL 的密钥脚本目录:
sbl-mastercomponentsecuremcubootscripts; - 在该目录的命令行中,输入签名命令生成带签名的 APP 镜像
app2.bin:python imgtool.py sign --key rt1170_priv.pem --align 4 --version "1.1" --header-size 0x400 --pad-header --slot-size 0x100000 --max-sectors 32 evkmimxrt1170_vector_freertos_cm7.bin app2.bin命令参数说明:
--key:指定生成的私钥文件;--header-size 0x400:预留 0x400 字节作为镜像头,与地址偏移匹配;--slot-size 0x100000:设置 Flash 分区大小,根据 APP 实际大小调整;app2.bin:生成的带签名、可被 SBL 识别的最终 APP 镜像。
4. 步骤 3:SBL ISP 模式下载带 SDRAM APP
app2.bin下载到 RT1170-EVK,核心是切换 SBL OTA 模式、指定正确下载地址、在 ISP 超时前完成连接。4.1 开发板进入 SBL ISP 模式
- 确保 SBL 已成功下载到开发板,复位开发板;
- SBL 启动后会进入 5 秒的 ISP 等待期(超时后会尝试启动已烧录的 APP),此时开发板处于 SBL ISP 模式,可接受 MCUBootUtility 的连接。
4.2 MCUBootUtility 配置与下载
- 打开 MCUBootUtility 工具,切换模式为 SBL OTA 模式(工具顶部模式选择);
- 点击「Connect to SBL ISP」,在 5 秒超时内完成设备连接(连接失败则重新复位开发板);
- 配置下载参数(核心:指定下载地址):
- 在工具的「3. Image Address」中输入
0X30100000(与 APP 地址偏移的基地址一致); - 在工具的「4. Select Image File」中选择签名后的
app2.bin;
- 在工具的「3. Image Address」中输入
- 开始下载:点击「5. Write Image to Flash」,工具自动完成镜像擦除、烧录与校验;
- 下载完成后,点击「Disconnect」退出工具连接。
4.3 验证 APP 启动与运行
- 复位 RT1170-EVK 开发板,SBL 会先初始化 SDRAM,再验证 APP 镜像签名;
- 签名验证通过后,SBL 会跳转到 APP 运行地址
0X30100400,启动带 SDRAM 的 GUI 工程; - 验证成功标志:
- 开发板 LCD 屏正常显示 Vector Freertos 的 GUI 界面;
- 串口输出启动日志,包含
Jumping to the image; - GUI 界面可正常交互,无程序崩溃、花屏等现象。
5. 常见问题排查与避坑指南
5.1 SBL 配置时无法找到 scons 命令
- 原因:未安装 Python 或 scons 工具,或环境变量未配置;
- 解决:安装 Python 3.7 及以上版本,通过
pip install scons安装 scons 工具,重启电脑让环境变量生效。
5.2 APP 编译后无 bin 文件
- 原因:未启用 bin 文件生成,或编译报错;
- 解决:在 MCUXpresso IDE 中,打开工程「Properties」→「MCU Linker」→「Output」,勾选「Create binary file」;排查编译报错,确保 SDRAM 相关驱动无缺失。
5.3 MCUBootUtility 无法连接 SBL ISP
- 原因 1:连接超时(超过 SBL 的 5 秒 ISP 等待期);
- 原因 2:开发板未正确运行 SBL,或 SBL 未启用 ISP 功能;
- 原因 3:USB 线接触不良,或开发板未切换到正确的启动模式;
- 解决:复位开发板后,立即点击「Connect to SBL ISP」;重新编译并下载 SBL,确认已启用「single image function」;更换优质 USB 线,确保开发板为 Flash 启动模式。
5.4 下载成功但 APP 无法启动,无 LCD 显示
- 原因 1:SBL 未启用 SDRAM,或 SDRAM 配置与开发板不匹配;
- 原因 2:APP 地址偏移错误,或下载地址与配置地址不一致;
- 原因 3:APP 镜像未签名,或签名密钥与 SBL 公钥不匹配;
- 解决:重新配置 SBL 并勾选「Enable SDRAM」;确认 APP 地址偏移为
0X30100400、下载地址为0X30100000;重新生成密钥并签名 APP,确保公钥已替换到 SBL 工程。
5.5 GUI 工程启动后花屏、卡顿
- 原因:SBL 的 SDRAM 时钟、时序配置与 APP 不匹配;
- 解决:在 SBL 的配置界面中,核对 SDRAM 的时钟频率、行 / 列地址数等参数,与开发板硬件手册一致;确保 APP 的 SDRAM 配置与 SBL 完全兼容。
6. 进阶扩展与实用建议
6.1 适配自定义 SDRAM 型号
- 进入 SBL 的
--menuconfig配置界面,展开Platform Drivers Config→SDRAM Config; - 修改 SDRAM 的时钟频率、位宽、容量、行 / 列地址数等参数,与硬件匹配;
- 重新编译 SBL 并下载,确保 SDRAM 初始化正常。
6.2 调整 SBL ISP 等待时间
默认 5 秒的 ISP 等待期过短,可在 SBL 源码中修改超时时间:
- 打开
sbl-mastertargetevkmimxrt1170sbl_config.h; - 修改宏定义
ISP_TIMEOUT_S为自定义时间(如 10 秒):#define ISP_TIMEOUT_S 10; - 重新编译 SBL,复位后 ISP 等待期延长为 10 秒。
6.3 实现量产批量 ISP 下载
- 将 MCUBootUtility 的下载步骤编写为批处理脚本,实现无人值守下载;
- 统一 SBL 配置与 APP 签名密钥,确保所有设备的镜像兼容性;
- 利用 SBL 的加密功能,为 APP 镜像添加加密保护,防止固件篡改。
6.4 适配其他带 SDRAM 的 APP
本方案可直接迁移到其他带 SDRAM 的 RT1170 APP(如 Qt for MCUXpresso、LVGL 工程),仅需:
- 在 MCUXpresso IDE 中为 APP 配置相同的地址偏移
0X30100400; - 去除 FCB/DCD 头,编译生成 bin 文件;
- 用相同的密钥签名 APP,通过 SBL ISP 下载即可。
RT1170 SBL ISP 下载带 SDRAM APP 的核心是让 SBL 接管 SDRAM 初始化,通过 SBL 配置启用 SDRAM 驱动,让 SBL 在启动 APP 前完成外部内存的初始化,同时对 APP 进行地址偏移、去除独立启动头、镜像签名,匹配 SBL 的运行规则。
整个流程的关键节点:SBL 中勾选Enable SDRAM与单镜像 OTA 功能、APP 地址偏移至0X30100400、下载地址指定为0X30100000、APP 镜像使用 SBL 公钥对应的私钥签名。该方案解决了复杂 GUI APP 因 SDRAM 未初始化导致的启动失败问题,同时保留了 SBL ISP 的在线下载优势,适用于研发调试与量产烧录场景。
该配置方法可通用到 RT1170 所有带 SDRAM 的 APP 工程,仅需根据 APP 实际大小调整 Flash 分区大小,是 RT1170 产品开发中实现 SBL ISP 批量下载的标准方案。
266