0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

i.MX RT1170上串行NOR Flash双程序可交替启动设计

恩智浦MCU加油站 来源:恩智浦MCU加油站 作者:恩智浦MCU加油站 2022-04-28 09:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在前一篇文章 《i.MX RT1060/1010上串行NOR Flash冗余程序启动设计》里,我详细介绍了i.MX RT10xx上的冗余程序启动设计,本质上这就是个双备份程序启动, NORFlash里存两份一样的image,物理地址靠前的image 0启动失效就继续启动后面的image 1,多一层保障。

i.MX RT1170是区别于i.MX RT10xx的第二代架构,性能/功能更加强大,其在继承 i.MX RT10xx冗余程序启动的基础上,新增了双程序可交替启动设计,今天我们就来聊聊这个话题:

一、初识双程序可交替启动

与i.MX RT10xx一样,这里要聊的还是在一片挂载在FlexSPI上的串行NOR Flash里做冗余/双程序设计,就是下图中的image L和image H,不涉及LPSPI接口Flash B里的image 2。

ff746c68-c689-11ec-bce3-dac502259ad0.png

先说跟i.MX RT10xx上一样的冗余程序启动流程,i.MX RT1170上电先启动物理地址靠前的image L,如果image L被破坏了,则继续启动image H。

什么是双程序可交替启动呢?简单说就是物理地址靠前的image L并不总是上电首先启动的image,在i.MX RT1170上新增了如下原型的image version启动头(在固定偏移 0x600 处),芯片上电 BootROM 会尝试判断两个 image L/H 里的 version 头版本,高版本的 image 优先被启动。这种设计方便了 OTA 升级。

  • Note: 当image L/H中均不含有效version启动头时(img_ver 等于 0xFFFFFFFF,或者高低16bit不符合取反关系),双程序可交替启动特性就不生效,此时等效于冗余程序启动,image L 永远被优先启动。

typedefstruct
{
uint16_tversion;//版本值
uint16_tinversion;//version值的取反(~version)
}img_ver_t;

ff93e25a-c689-11ec-bce3-dac502259ad0.png

二、回顾冗余程序启动

在测试双程序可交替启动新特性之前,还是先过一下冗余程序启动。按照文章《i.MX RT1060/1010上串行NOR Flash冗余程序启动设计》第2节里一模一样的方法,在恩智浦官方MIMXRT1170-EVK开发板上做测试,这个板子FlexSPI1上挂了两片Flash,默认连接的16MB QuadSPI Flash,还有一片 64MB OctalFlash(需要做板子改动才能使能)。

在 i.MX RT1170 fuse 里关于冗余程序启动的使能位定义与i.MX RT10xx上差不多,只不过 fuse 地址从 0x6E0 换到了0xC80。还是跟之前测试一样借助MCUBootUtility工具将 FLEXSPI_NOR_SEC_IMAGE_OFFSET 烧录为 0x10,xSPI_FLASH_IMAGE_SIZE 保持默认 0,即第二份 image 偏移地址在 Flash 0x400000(4MB)处,最大 image 长度也是4MB。

ffb71b1c-c689-11ec-bce3-dac502259ad0.png

继续用SDK_2.11.0_MIMXRT1170-EVKoardsevkmimxrt1170demo_appsled_blinkycm7iarflexspi_nor_debug例程生成两个稍微不一样的 image,闪灯间隔时间一个是200ms(image L - iled_blinky_cm7_delay200ms.bin),另一个是 2s(image H - iled_blinky_cm7_delay2s.bin)。在 MCUBootUtility 工具主界面下使用 All-In-One 操作将 image L 下载进 Flash(baseaddress 设为 0x30000400),使用通用编程器界面 Write 操作将 image H 也下载进 Flash(Start 设为0x400400)。

现在Flash 里有了两份 image,当第一份 image 启动失败后,i.MX RT1170 BootROM 不是立刻去执行下一份 image ,还是那个取巧的方法,在一个软复位不置位的寄存器里(SRC_GPR10)标记当前状态,然后调用 NVIC_SystemReset() 重新进入 BootROM 执行。不过此时标记位从 GPR10[30] 换到了 GPR10[27:26],虽然是 2bit 状态,但设值 1/2/3 等效于设值 1,因为对于串行 NOR Flash 最多就是两份 image。这时候如果你想挂 J-Link 改写 SRC_GPR10 去做快速验证恐怕无法如愿,原因请看《i.MX RT1170上用J-Link连接复位后PC总是停在0x223104》

ffd3fb10-c689-11ec-bce3-dac502259ad0.png

所以在i.MX RT1170上只能老老实实做破坏 image 完整性的动作来验证冗余程序启动,经实测其效果与i.MX RT10xx 是完全一致的。

三、实测双程序可交替启动

现在我们开始实测双程序可交替启动,主要的工作量就是为 image L 和 image H 添加 version 启动头,并且将它们分别下载进 Flash。因为我们想验证物理地址靠后的 image H 比 image L 优先启动(冗余程序启动做不到这点),所以需要将 image H 的 version 头版本设高一点。

3.1 为 image 添加version 启动头

还是在SDK_2.11.0_MIMXRT1170-EVKoardsevkmimxrt1170demo_appsled_blinkycm7iarflexspi_nor_debug例程基础上,首先在工程链接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 添加如下语句,指定 .img_ver 段的位置。

define symbol m_boot_img_ver_start = 0x30000600;

place at address mem: m_boot_img_ver_start { section .img_ver };

然后在工程随便一个源文件里添加如下常量 s_bt_img_l_ver 定义,这个 image 闪灯间隔时间是 200ms(image L -iled_blinky_cm7_delay200ms_ver0.bin),版本是 0x0000(注意编译链接工程时为防止 s_bt_img_l_ver 被优化,可以在工程选项 Linker / Input /Keep symbols 里将其添加进去)。

constimg_ver_ts_bt_img_l_ver@".img_ver"={
.version=0x0000,
.inversion=~0x0000,
};

同样的工程,再生成另一个闪灯间隔时间为 2s(image H -iled_blinky_cm7_delay2s_ver1.bin) 的 image 时使用如下常量s_bt_img_h_ver 定义,版本是 0x0001。

constimg_ver_ts_bt_img_h_ver@".img_ver"={
.version=0x0001,
.inversion=~0x0001,
};

当然如果你嫌上述方法繁琐,也可以直接在最终 image binary 文件上做修改(注意 offset 位置一定要找对,i.MX RT1170 SDK XIP binary 文件起始数据对应 Flash 偏移是 0x400,因此文件中 0x200 处才对应 Flash 偏移 0x600):

0005e3f0-c68a-11ec-bce3-dac502259ad0.png

3.2 下载含 version 头的image 进 Flash

现在需要借助 MCUBootUtility 工具的通用编程器功能分别将两个含 version 头的 image L/H 下载进 Flash。这里需要注意的是此时 image L 无法再通过主界面 All-In-One 操作来下载了,因为工具 v3.4 版本及以下没有对 version 启动头做识别处理,因此会丢掉 version 头数据(这个考虑会在 v4.0 之后加入支持)。

0031caba-c68a-11ec-bce3-dac502259ad0.png

005fa5de-c68a-11ec-bce3-dac502259ad0.png

两个 image下载完成,一切工作就结束了,这时候你调整芯片启动模式到 2'b10 - Flash boot,给板卡重新上电,应该可以看到 image H 正在执行。

3.3 BootROM中判断version的逻辑

BootROM中关于 version 启动头是否有效以及版本高低判断逻辑其实是有一点复杂的,这里把具体代码分享给大家,方便大家为 image 设置有效的 version 头以及正确使能这个双程序可交替启动特性。

判断逻辑代码主要意思是仅当 image L 的版本不是 0xFFFFFFFF 且 image H 的版本是有效的(img_ver 高低16bit符合取反关系)情况下,如果 image L 版本无效或者 image L 版本有效但比 image H 版本低,则物理地址靠后的 image H 优先启动。除此以外其余情况,一律是物理地址靠前的 image L 优先启动。

uint32_t image_l_base = FlexSPIx_AMBA_BASE
uint32_t image_h_base = FlexSPIx_AMBA_BASE + FLEXSPI_NOR_SEC_IMAGE_OFFSET

uint32_t get_image_index(void)
{
    uint32_t redundant_boot = ((SRC->GPR[9] & 0x0C000000) >> 26);

    static uint32_t image_index[] = { 0, 0 };
    img_ver_t image_l_version = *(img_ver_t *)(image_l_base + 0x600);
    img_ver_t image_h_version = *(img_ver_t *)(image_h_base + 0x600);
    if ((image_l_version.version != 0xFFFFu || image_l_version.inversion != 0xFFFFu) &&
        ((0xFFFFu & image_h_version.version) == (0xFFFFu ^ image_h_version.inversion)) &&
        ((0xFFFFu & image_l_version.version) != (0xFFFFu ^ image_l_version.inversion) || (image_l_version.version < image_h_version.version)))
    {
        image_index[0] = 1;
    }
    else
    {
        image_index[1] = 1;
    }

    return image_index[redundant_boot];
}

痞子衡在MIMXRT1170-EVK 开发板上对image 版本设置情况也做了比较全面的实测,测试结果如下:

008675f6-c68a-11ec-bce3-dac502259ad0.png

四、一些关于image的注意事项

  1. 虽然文中所有的测试均是针对 XIP image,但这个冗余程序/双程序可交替启动特性对于 Non-XIP image 也同样适用。
  2. 如果是 XIP image,其链接地址不一定要固定在偏移 0x2000 处,因为 IVT 的存在,其是可以链接在偏移 0x2000 之后的任意位置的。
  3. 如果是 Non-XIP image,在 SDK 包里无法直接生成含启动头的 Non-XIP image binary,这时候可以先使用 MCUBootUtility 主界面的 All-In-One 操作下载一次 image,再通过通用编程器界面 Read 操作读回来便是含启动头的 Non-XIP image binary。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 冗余
    +关注

    关注

    1

    文章

    113

    浏览量

    21088
  • 串行
    +关注

    关注

    0

    文章

    256

    浏览量

    35209

原文标题:i.MX RT1170上串行NOR Flash双程序可交替启动设计

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    i.MX RT1180实现EtherCAT+伺服控制的终极实践

    今天继续为大家介绍i.MX RT1180实现EtherCAT+伺服控制的终极实践:双电机控制与Ethercat资源使用。
    的头像 发表于 11-26 08:19 2564次阅读
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1180实现EtherCAT+伺服控制的终极实践

    使用恩智浦i.MX RT700跨界MCU打造智能手表

    智能手表已经成为我们生活中不可或缺的可穿戴设备。随着技术和市场的演进,如今的智能手表功能越来越丰富,而用户对其续航能力的期望也越来越高。应对这一挑战,恩智浦专为可穿戴、消费级医疗、智能家居和HMI设备而设计的i.MX RT700跨界MCU,
    的头像 发表于 10-27 09:33 842次阅读

    RT1180 XMCD的特点和使用注意事项

    之前在 “XMCD – i.MX RT11xx系列简单易用的特定外设配置功能”的文章给大家介绍了XMCD功能的基础知识和用法,不过前面是以RT1170为例介绍的,本文将基于RT1180
    的头像 发表于 10-07 11:06 1205次阅读
    <b class='flag-5'>RT</b>1180 XMCD的特点和使用注意事项

    恩智浦i.MX RT1180跨界MCU助力下一代伺服控制系统

    今天我们将聚焦一项正在重塑工业自动化边界的技术组合 —— 基于NXP的i.MX RT1180微控制器,实现EtherCAT通信与高性能伺服控制的融合方案。
    的头像 发表于 09-28 14:16 4305次阅读
    恩智浦<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1180跨界MCU助力下一代伺服控制系统

    恩智浦i.MX RT1180跨界处理器如何选型

    i.MX RT1180 跨界处理器包含众多的型号,以满足客户对不同性能与价格的需求,今天就先给大家说说如何选型。
    的头像 发表于 09-28 14:01 2064次阅读
    恩智浦<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1180跨界处理器如何选型

    恩智浦MCU方案 单颗i.MX RT1180实现EtherCAT+伺服控制

    介绍基于单颗i.MX RT1180芯片的EtherCAT+伺服电机控制方案-伺服控制板硬件电路资源介绍,即为下图中的Servo Motor Driver Board。
    的头像 发表于 09-11 14:27 5.4w次阅读
    恩智浦MCU方案 单颗<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1180实现EtherCAT+伺服控制

    基于恩智浦i.MX RT芯片内部RAM运行LVGL工程

    随着越来越多用户选择i.MX RT系列芯片制作产品,产品的需求以及芯片的用法也越来越多。本文将介绍在i.MX RT平台中,如何创建LVGL项目并将其运行在内部SRAM而非SDRAM
    的头像 发表于 07-01 09:33 2211次阅读
    基于恩智浦<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>芯片内部RAM运行LVGL工程

    如何实现安卓与恩智浦i.MX RT1170的无线投屏与控制

    Scrcpy是一款免费开源的软件,支持将安卓端屏幕投影到其他设备,并支持被投屏设备对安卓的反向控制。基于ADB工具,安卓端无需安装任何软件,延迟低,稳定性好。现在,安卓也可投屏到恩智浦i.MX RT1170
    的头像 发表于 06-26 09:53 1945次阅读
    如何实现安卓与恩智浦<b class='flag-5'>i.MX</b> <b class='flag-5'>RT1170</b>的无线投屏与控制

    i.MX RT系列中FlexSPI DQS信号引脚配置GPIO方法

    i.MX RT060项目(采用QSPI Flash)的实际应用中,有客户反馈,其在设计阶段并未预留DQS信号引脚,而是将该引脚作为GPIO用于控制关键外设的开关,这导致程序无法正常运
    的头像 发表于 06-16 11:30 1282次阅读
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>系列中FlexSPI DQS信号引脚配置GPIO方法

    为什么无法在MIMXRT1170-EVK上调试XIP NOR闪存?

    Winbond NOR 闪存 (W25Q256JVEIQ) 安装在 RT1170 定制板。 但是,在此状态下,使用 MCU Expresso IDE 24.9.25 进行调试在写入过程中失败
    发表于 04-14 07:32

    如何禁用i.MX RT1170 MCU中的M4内核?

    如何禁用 i.MX RT1170 MCU 中的 M4 内核? 您能否提供具体的可行方法? 或者是否可以将内核的工作时钟频率降低到 0 ?
    发表于 04-09 07:28

    在IMX RT1170的POR期间,PWM引脚变为高电平是怎么回事?

    我使用GPIO_AD_00生成 PWM 信号,并且工作正常。但是当我在 RT1170 中执行 POR作时。然后 PWM 引脚变高,直到电路板启动启动后,它按预期生成 PWM 信号。但我不希望 PWM 引脚在执行 POR 时变为
    发表于 03-31 08:22

    i.MX RT 1176正常运行代码时与使用IAR调试代码时存在一些奇怪的差异,为什么?

    我在 i.MX RT 1176 正常运行代码时的行为与使用 IAR 调试代码时的行为之间存在一些奇怪的差异,并注意到这是由于堆栈指针的初始化方式造成的。 我的重置向量表将其指向 DTC 的顶部
    发表于 03-17 07:26

    i.MX RT处理器使用PXP实现缩放和旋转组合操作

    本文主要探讨如何使用PXP实现缩放和旋转组合操作,PXP是NXP推出的一个2D图形加速器,主要完成对图像的数据格式转换、固定角度旋转(90°,180°,270°),任意比例缩放、混色,移位以及翻转等功能。运行平台为i.MX RT1170/1160/1060/1050/10
    的头像 发表于 02-20 10:53 1577次阅读
    在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>处理器<b class='flag-5'>上</b>使用PXP实现缩放和旋转组合操作

    恩智浦i.MX 91生态合作伙伴最新开发板资源

    恩智浦i.MX 91应用处理器系列能够快速实现基于Linux的经济高效的边缘应用程序i.MX 91处理器在保持实惠价格的同时,融合了高性能处理、安全性和高能效,并且为i.MX 93应
    的头像 发表于 12-20 17:00 2403次阅读