扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

RT1170 SBL ISP下载带SDRAM APP实操:解决 GUI 工程启动失败问题

7小时前
266
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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 启动失败的核心原因

RT1170 的 SBL 默认配置仅支持基础的 Flash 读写与简单 APP 启动,未启用 SDRAM 相关驱动与配置:
  • 简单 APP(如 led_blinky、helloworld)仅运行在片内 RAM/Flash,无需 SDRAM,可正常启动;
  • 复杂 GUI APP(如 vector_freertos)需占用 SDRAM 存储图像数据、运行时内存,SBL 未初始化 SDRAM 时,APP 运行会因内存访问失败而启动崩溃;
  • 解决关键:在 SBL 中启用 SDRAM 配置,让 SBL 在启动 APP 前完成 SDRAM 的初始化,为 APP 提供可用的外部内存空间。

1.2 软硬件环境准备

(1)硬件

  • 主控板:MIMXRT1170-EVK 开发板;
  • 调试器:JLink/ST-Link(用于下载 SBL 工程);
  • 烧录工具:USB 线(用于 MCUBootUtility 的 ISP 下载)。

(2)软件与源码

(3)关键工具下载

2. 步骤 1:SBL 源码配置与编译(核心:启用 SDRAM)

SBL 的配置通过scons工具实现,需完成编译路径指定、SDRAM 使能、单镜像 OTA 配置、加密密钥生成四大核心步骤,最终编译出带 SDRAM 初始化的 SBL 工程。

2.1 配置 ARM GCC 编译路径

  1. 解压 SBL 源码到本地目录(如D:sbl-master);
  2. 安装 ARM GCC 9-2019-q4-major,默认安装路径为C:Program Files (x86)GNU Tools Arm Embedded9 2019-q4-majorbin
  3. 打开 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)

  1. 打开sbl-mastertargetevkmimxrt1170env.bat,自动打开命令行并加载 SBL 环境;
  2. 输入配置命令,进入图形化配置界面:
    scons --menuconfig
    
  3. 启用单镜像 OTA 功能(ISP 下载基础):
    • 选择MCU SBL core → 勾选[*]Enable single image function
  4. 启用SDRAM 支持(解决 APP 启动失败的核心):
    • 展开Platform Drivers Config → 勾选[*]Enable SDRAM
    • 确认Board flash support选择板载 Flash(ISSI_IS25WPxxxA Flash);
  5. 保存配置:点击<Save>,默认保存为.config文件,点击<Exit>退出配置界面。

2.3 生成 IAR 工程并验证 SDRAM 配置

  1. 在 env.bat 命令行中输入指令,生成 IAR 格式的 SBL 工程:
    scons --ide=iar
    
  2. 打开生成的工程sbl-mastertargetevkmimxrt1170iarsbl.eww
  3. 验证 SDRAM 配置:工程中已自动加入 SDRAM 的 DCD 初始化代码,宏定义BOARD_SDRAM已启用,说明 SDRAM 配置生效。

2.4 生成加密密钥并更新 SBL 公钥

SBL 要求 APP 镜像必须经过签名验证,需生成 RSA2048 密钥对,并将公钥写入 SBL 工程:
  1. 在 env.bat 命令行中切换到密钥生成脚本目录:
    cd ....componentsecuremcubootscripts
    
  2. 生成 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
    
  3. 替换 SBL 默认公钥:将生成的rt1170_pub.c中的公钥内容,复制替换sbl-mastercomponentsecuremcubootsign-rsa2048-pub.c的全部内容;
  4. 编译 SBL 工程:在 IAR 中编译sbl.eww,生成可执行文件,通过调试器下载到 RT1170-EVK 开发板。

3. 步骤 2:带 SDRAM APP 工程配置与镜像签名

以 RT1170 SDK 的evkmimxrt1170_vector_freertos_cm7工程为例,在 MCUXpresso IDE 中完成地址偏移、去除 FCB/DCD 头、编译生成 bin 文件,并通过imgtool.py为镜像添加 SBL 识别的签名头。

3.1 MCUXpresso IDE 导入 APP 工程

  1. 打开 MCUXpresso IDE,通过「Import SDK Examples」导入evkmimxrt1170_vector_freertos_cm7工程;
  2. 确认工程已启用 SDRAM 相关配置(SDK 默认带 SDRAM 配置,无需额外修改)。

3.2 APP 工程核心配置(地址偏移 + 去除 FCB/DCD)

SBL 会接管系统初始化,APP 需移除独立的启动头,并指定 SBL 分配的运行地址:
  1. 设置地址偏移:将 APP 的运行地址偏移至0X30100400(SBL 预留 0X30100000-0X301003FF 为镜像头区域);
    • 打开工程「Properties」→「MCU Linker」→「Managed Linker Script」,修改 RAM 起始地址为0X30100400
  2. 去除 FCB 和 DCD 头:禁止 APP 自行初始化 Flash 和 SDRAM(由 SBL 完成);
    • 打开工程「Properties」→「C/C++ Build」→「Settings」→「MCU Compiler」→「Preprocessor」;
    • 添加宏定义:XIP_BOOT_HEADER_ENABLE=0XIP_BOOT_HEADER_DCD_ENABLE=0
  3. 保存配置,编译工程,在工程debug目录下生成 bin 镜像文件evkmimxrt1170_vector_freertos_cm7.bin

3.3 APP 镜像签名(添加 SBL 识别头)

未签名的 APP 镜像会被 SBL 拒绝启动,需通过imgtool.py为 bin 文件添加签名头和 SDRAM 相关配置,生成 SBL 可识别的镜像:
  1. 将编译好的 APP bin 文件复制到 SBL 的密钥脚本目录:sbl-mastercomponentsecuremcubootscripts
  2. 在该目录的命令行中,输入签名命令生成带签名的 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

使用 MCUBootUtility 工具,在 SBL 的 ISP 模式下将签名后的app2.bin下载到 RT1170-EVK,核心是切换 SBL OTA 模式、指定正确下载地址、在 ISP 超时前完成连接

4.1 开发板进入 SBL ISP 模式

  1. 确保 SBL 已成功下载到开发板,复位开发板;
  2. SBL 启动后会进入 5 秒的 ISP 等待期(超时后会尝试启动已烧录的 APP),此时开发板处于 SBL ISP 模式,可接受 MCUBootUtility 的连接。

4.2 MCUBootUtility 配置与下载

  1. 打开 MCUBootUtility 工具,切换模式为 SBL OTA 模式(工具顶部模式选择);
  2. 点击「Connect to SBL ISP」,在 5 秒超时内完成设备连接(连接失败则重新复位开发板);
  3. 配置下载参数(核心:指定下载地址):
    • 在工具的「3. Image Address」中输入0X30100000(与 APP 地址偏移的基地址一致);
    • 在工具的「4. Select Image File」中选择签名后的app2.bin
  4. 开始下载:点击「5. Write Image to Flash」,工具自动完成镜像擦除、烧录与校验;
  5. 下载完成后,点击「Disconnect」退出工具连接。

4.3 验证 APP 启动与运行

  1. 复位 RT1170-EVK 开发板,SBL 会先初始化 SDRAM,再验证 APP 镜像签名;
  2. 签名验证通过后,SBL 会跳转到 APP 运行地址0X30100400,启动带 SDRAM 的 GUI 工程;
  3. 验证成功标志:
    • 开发板 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 型号

若使用非 RT1170-EVK 板载的 SDRAM 型号,需在 SBL 中修改 SDRAM 配置参数:
  1. 进入 SBL 的--menuconfig配置界面,展开Platform Drivers ConfigSDRAM Config
  2. 修改 SDRAM 的时钟频率、位宽、容量、行 / 列地址数等参数,与硬件匹配;
  3. 重新编译 SBL 并下载,确保 SDRAM 初始化正常。

6.2 调整 SBL ISP 等待时间

默认 5 秒的 ISP 等待期过短,可在 SBL 源码中修改超时时间:

  1. 打开sbl-mastertargetevkmimxrt1170sbl_config.h
  2. 修改宏定义ISP_TIMEOUT_S为自定义时间(如 10 秒):#define ISP_TIMEOUT_S 10
  3. 重新编译 SBL,复位后 ISP 等待期延长为 10 秒。

6.3 实现量产批量 ISP 下载

  1. 将 MCUBootUtility 的下载步骤编写为批处理脚本,实现无人值守下载;
  2. 统一 SBL 配置与 APP 签名密钥,确保所有设备的镜像兼容性;
  3. 利用 SBL 的加密功能,为 APP 镜像添加加密保护,防止固件篡改。

6.4 适配其他带 SDRAM 的 APP

本方案可直接迁移到其他带 SDRAM 的 RT1170 APP(如 Qt for MCUXpresso、LVGL 工程),仅需:

  1. 在 MCUXpresso IDE 中为 APP 配置相同的地址偏移0X30100400
  2. 去除 FCB/DCD 头,编译生成 bin 文件;
  3. 用相同的密钥签名 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 批量下载的标准方案。

相关推荐