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

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

3天内不再提示

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

痞子衡嵌入式 来源:痞子衡嵌入式 作者:痞子衡 2022-04-29 15:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计

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

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

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

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

6f018924-c78b-11ec-bce3-dac502259ad0.png

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

什么是双程序可交替启动呢?简单说就是物理地址靠前的 image L 并不总是上电首先启动的 image,在 i.MXRT1170 上新增了如下原型的 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;
6f178b48-c78b-11ec-bce3-dac502259ad0.png

二、回顾冗余程序启动

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

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

6f2ca0dc-c78b-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(base address 设为 0x30000400),使用通用编程器界面 Write 操作将 image H 也下载进 Flash(Start 设为 0x400400)。

现在 Flash 里有了两份 image,当第一份 image 启动失败后,i.MXRT1170 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.MXRT1170上用J-Link连接复位后PC总是停在0x223104》

6f53f858-c78b-11ec-bce3-dac502259ad0.png

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

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

现在我们开始实测双程序可交替启动,主要的工作量就是为 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.MXRT1170 SDK XIP binary 文件起始数据对应 Flash 偏移是 0x400,因此文件中 0x200 处才对应 Flash 偏移 0x600):

6f7b7a86-c78b-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 之后加入支持)。

6f9d9814-c78b-11ec-bce3-dac502259ad0.png6fc14cd2-c78b-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_timage_l_base=FlexSPIx_AMBA_BASE
uint32_timage_h_base=FlexSPIx_AMBA_BASE+FLEXSPI_NOR_SEC_IMAGE_OFFSET

uint32_tget_image_index(void)
{
uint32_tredundant_boot=((SRC->GPR[9]&0x0C000000)>>26);

staticuint32_timage_index[]={0,0};
img_ver_timage_l_version=*(img_ver_t*)(image_l_base+0x600);
img_ver_timage_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;
}

returnimage_index[redundant_boot];
}

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

image L 版本值 image H 版本值 启动结果
0xFFFFFFFF 任意值
(实测了0xFFFFFFFF, 0xFFFFAA55, 0xFFFF0000)
先启动 image L
失败再启动 image H
任意值
(实测了0xFFFFAA55, 0xFFFF0000)
0xFFFFAA55
(或其他无效版本值包括全0xFFs)
先启动 image L
失败再启动 image H
0xFFFFAA55
(或其他非全0xFFs无效版本值)
0xFFFF0000
(或其他任意有效版本值)
先启动 image H
失败再启动 image L
0xFFFF0000 0xFFFE0001
(或其他高于0x0的有效版本值)
先启动 image H
失败再启动 image L
0xFFFE0001 0xFFFE0001或0xFFFF0000 先启动 image L
失败再启动 image H

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

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

至此,i.MXRT1170上串行NOR Flash双程序可交替启动设计痞子衡便介绍完毕了,掌声在哪里~~~

审核编辑 :李倩


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

    关注

    117

    文章

    3836

    浏览量

    84761
  • OTA
    OTA
    +关注

    关注

    7

    文章

    623

    浏览量

    37956
  • NOR flash
    +关注

    关注

    2

    文章

    98

    浏览量

    23840

原文标题:什么是i.MXRT11xx上的串行NOR Flash双程序可交替启动?

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    高性能SPI NOR FLASH芯片ZB25VQ系列推荐

    在嵌入式系统、物联网设备及各类存储应用中,SPI NOR FLASH芯片因其接口简单、功耗低、读写速度快等特点,成为代码存储与数据缓存的常见选择。SPI NOR FLASH是一种基于S
    的头像 发表于 12-01 14:52 176次阅读

    华邦高性能NOR Flash用于学习平板

    华邦电子(Winbond)的NOR Flash以其卓越性能成为学习平板理想的存储解决方案。其芯片内执行(XIP)特性实现系统秒级快速启动,高可靠性确保固件和核心代码安全,低功耗特性则
    的头像 发表于 11-10 09:48 273次阅读
    华邦高性能<b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b>用于学习平板

    恩智浦i.MXRT1180的FlexSPI NOR启动连接方式

    最近属于i.MXRT11xx阵营的第二代旗舰i.MXRT1180正式发布了,今天咱们就来介绍它的FlexSPI NOR启动连接方式,在阅读本文前最好把FlexSPI
    的头像 发表于 11-08 10:20 5676次阅读
    恩智浦<b class='flag-5'>i.MXRT</b>1180的FlexSPI <b class='flag-5'>NOR</b><b class='flag-5'>启动</b>连接方式

    博雅NOR Flash 液晶电视核心存储方案优选​

    博雅BOYA BY25Q32BSSIG是一款32Mbit SPI NOR Flash芯片,支持133MHz高速读取与XIP技术,能显著提升液晶电视的启动速度与系统响应。其工业级温度范围与低功耗特性保障了电视在长期高温环境下的稳定
    的头像 发表于 10-31 09:16 159次阅读
    博雅<b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b> 液晶电视核心存储方案优选​

    MXIC MX25L25645GM2I-08G高速SPI NOR Flash

    MX25L25645GM2I-08G是旺宏电子推出的256Mb大容量SPI NOR Flash存储芯片,工作电压2.7V–3.6V,支持最高133MHz时钟频率与芯片内执行(XIP),具有工业级温度
    的头像 发表于 10-24 09:55 265次阅读
    MXIC MX25L25645GM2<b class='flag-5'>I</b>-08G高速SPI <b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b>

    兆易创新NOR FLASH定义车载导航系统存储新标准​

    兆易创新NOR Flash以其高速读取、车规级可靠性和XIP技术,为车载导航系统提供快速启动、实时数据存储和完整路径规划支持,显著提升系统响应速度和数据安全性。
    的头像 发表于 09-23 09:22 3644次阅读
    兆易创新<b class='flag-5'>NOR</b> <b class='flag-5'>FLASH</b>定义车载导航系统存储新标准​

    博雅NOR FLASH XIP技术实现电力仪表毫秒级快速启动

    博雅128Mbit NOR Flash BY25Q128ESSIG为智能电力仪表提供高可靠存储方案,133MHz读取速度与-40℃~105℃宽温保障数据实时性与稳定性。
    的头像 发表于 09-08 09:55 705次阅读
    博雅<b class='flag-5'>NOR</b> <b class='flag-5'>FLASH</b> XIP技术实现电力仪表毫秒级快速<b class='flag-5'>启动</b>​

    SPI NOR FLASH是什么,与SPI NAND Flash的区别

    SPI NOR FLASH是什么?   SPI NOR FLASH是一种非易失性存储器,它通过串行接口进行数据传输,具有读写速度快、可靠性高
    的头像 发表于 08-21 09:26 1106次阅读

    Nor flash芯片低温无法启动

    关于针对NOR Flash芯片在低温环境下无法启动的问题,详细分析与解决方案如下所述: 1. 低温失效原因分析 1.1 半导体物理特性变化 阈值电压(Vth)漂移:低温下MOSFET阈值电压升高(约
    的头像 发表于 06-30 17:23 594次阅读
    <b class='flag-5'>Nor</b> <b class='flag-5'>flash</b>芯片低温无法<b class='flag-5'>启动</b>

    多个i.MXRT共享一颗Flash启动的方法与实践(下)

    在 《多个i.MXRT共享一颗Flash启动的方法与实践()》 一文里痞子衡给大家从理论介绍一种多
    的头像 发表于 06-05 10:04 1033次阅读
    多个<b class='flag-5'>i.MXRT</b>共享一颗<b class='flag-5'>Flash</b><b class='flag-5'>启动</b>的方法与实践(下)

    多个i.MXRT共享一颗Flash启动的方法与实践()

    有些客户应用会采用多颗 i.MXRT 芯片设计一主多从的硬件架构(目的不一,或仿多核 MCU 系统、或拓展 GPIO 数量),因为 i.MXRT 片内无非易失性存储器,这时候为整个系统配置合适的启动设备保证每个
    的头像 发表于 06-05 10:01 1004次阅读
    多个<b class='flag-5'>i.MXRT</b>共享一颗<b class='flag-5'>Flash</b><b class='flag-5'>启动</b>的方法与实践(<b class='flag-5'>上</b>)

    MCU片Flash

        MCU片Flash是微控制器内部集成的非易失性存储器,主要用于存储程序代码、常量数据及系统配置信息。其核心特性与功能如下: 一、定义与类型‌ 片
    的头像 发表于 05-06 14:26 861次阅读

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

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

    IMXRT1170-EVK如何使用J-Trace探针启用指令跟踪?

    我正在尝试使用 i.MXRT1176 跟踪引脚和 MIMXRT1170-EVK 板的 J-Trace 探针来启用指令跟踪。 我已经安装了电阻器R1881, R1882, R1883, R1884
    发表于 04-07 06:21

    存储技术探秘 NAND Flash vs NOR Flash:藏在芯片里的&quot;门道之争&quot;

    门电路玄机 NOR Flash:Intel 1988 年革命性突破,终结 EPROM/EEPROM 垄断时代 NAND Flash:东芝 1989 年发布,开创 "低成本比特" 存储新纪元 共性特征
    的头像 发表于 03-18 12:06 1051次阅读