首页 > 自考资讯 > 自考知识

痞子衡嵌入式:揭秘i.mxrt1060/1010上串行nor+flash冗余程序启动怎么办,嵌入式单片机stm32原理及应用

头条共创 2024-06-27

工业产品设计常常需要设计冗余/备份程序,因为设备不能轻易崩溃,并且必须始终如一地运行。然而,在现实环境中,各种事故频繁发生。一种常见的事故是设备主控MCU程序被破坏。减少意外程序损坏影响的常见方法是增加MCU 程序的副本数量,并在第一个副本损坏时启动第二个副本,以利用增加的程序数量。降低启动失败率。这属于概率平均值的范畴。

NXP i.MXRT系列MCU没有内置非易失性存储器,必须使用外部存储器。内存有多种类型,例如NOR 闪存、NAND 闪存、eMMC 和SD 卡。其中,对于NAND型存储器来说,需要进行冗余设计,因为NAND本身存在坏块,因此需要进行冗余编程。尽管NOR 存储器不需要冗余设计,但串行NOR 闪存是i.MXRT 最常用的合作伙伴。请不要担心。今天皮子恒给大家介绍一下i.MXRT1010/1060的串行NOR flash冗余编程设计。恩智浦已经在考虑这一点。

注意:以前的i.MXRT1050/1020/1015 型号不支持本文中包含的串行NOR 闪存冗余编程。 1.首先介绍冗余程序启动

有两种外设可以在i.MXRT上挂载串行NOR flash并启动程序,如下图所示。即FlexSPI和LPSPI。其中,连接到FlexSPI的Flash A属于主启动设备,连接到LPPSI的Flash B属于备份启动设备(有关启动备份设备的更多信息,请参阅皮子恒的旧文章《从Serial(1-bit SPI) EEPROM/NOR恢复启动》)。 )。

Note: 并非所有i.MXRT 型号都支持LPSPI 外设安装内存进行启动。86ec1c51d72546a4950b2804ef479844~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720067402&x-signature=k4rMeUl%2BZcIBU9H9uThAxqgHjaw%3D 使用两个NOR flash进行冗余编程是可以的,但是也会增加硬件成本。今天在这篇文章中我们将讨论这种冗余编程。这里我要说的是FlexSPI上的串行NOR flash(图中的图像0和图像1)存在冗余编程。

启动冗余程序的过程实际上非常简单。当您加电时,具有第一个物理地址的映像0 始终首先启动。如果映像0 损坏,则将启动映像1。原则上图像0和图像1应该是一模一样的(而且链接地址也应该是一样的,这样两幅图像之间就不需要移动图像数据了。这是通过芯片内的黑科技实现的。学习更多内容将在后面描述)。总而言之,这是一个多余的设计,但如果您坚持拥有两个不完全相同的图像,那也没关系。

2. 启动测量冗余程序

冗余程序启动设计是在BootROM代码内完成的,因为我们知道i.MXRT芯片上电时,总是先执行厂家修复的BootROM。在皮子恒的旧文章《了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点》中,我们简单讨论了主要依赖于芯片系统的FlexSPI地址重映射(Remap)特性的冗余编程。该功能是在NXP i 后期引入的。适用于MXRT1060/1010 等型号。这也是上面提到的黑科技。关于这个黑科技,皮子恒还有一篇旧文章《利用i.MXRT1060,1010上新增的FlexSPI地址重映射(Remap)功能可安全OTA》。

FlexSPI Remap Black 技术的存在允许将相同的映像二进制文件放置在闪存中的两个不同位置,而无需执行擦除编程操作来交换它们的位置以实现各自的引导执行。如果没有这个黑科技,数据就只能老老实实地移动,增加擦除次数,影响Flash的使用寿命。

原理很清楚。现在我们在板上测试一下这个功能,看看如何正确地将两个镜像放入闪存中,以及在什么情况下镜像0 无法启动而镜像1 可以启动。以NXP官方MIMXRT1060-EVK开发板为例。该板FlexSPI1 有两个闪存:默认连接的8MB QuadSPI 闪存和64MB HyperFlash(需要修改板才能启用)。

2.1 启用冗余程序启动

启用冗余程序启动功能非常简单,只需将熔丝0x6E0[23:16] - FLEXSPI_NOR_SEC_IMAGE_OFFSET 烧录为非零值即可。 Flash 中的第二个图像偏移地址可设置为0x3FC0000 (63.75MB),定义如下: 在:

Remap 功能的ADDR_START 寄存器固定为Flash 映射起始地址。

Fuse0x6e0[15:13] - 应用程序的最大长度xSPI_FLASH_IMAGE_SIZE,标识第一个应用程序的结束地址。该值被添加到ADDR_START 并在Remap 函数的ADDR_END 寄存器中设置。

Fuse0x6e0[23:16] - FLEXSPI_NOR_SEC_IMAGE_OFFSET,标识第二个应用程序的起始地址(闪存偏移位置)。这是在Remap 函数的ADDR_OFFSET 寄存器中设置的值。

dd37d0d49cc24a0093844bda5e320faa~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720067402&x-signature=ojaGq2kNGXLb6hjZ5VUyfvCZS3E%3D 对于此测试,请将FLEXSPI_NOR_SEC_IMAGE_OFFSET 写入0x10,并将xSPI_FLASH_IMAGE_SIZE 保留为默认值0。这意味着第二个镜像的偏移地址是flash0x400000(4MB),最大镜像长度也是4MB。您可以使用MCUBootUtility工具完成Fuse记录的写入。

09ea8666c2f646228312ffc57c405ec1~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720067402&x-signature=N0R9p46sd1yg2fNQEAym22xCemc%3D2.2 将两个未签名的图像下载到Flash

我们将直接使用简单直观的\SDK_2.10.1_EVK-MIMXRT1060\boards\evkmimxrt1060\demo_apps\led_blinky 例程来准备图像。生成两个略有不同的图像,以便更容易用肉眼区分效果。一个的闪光间隔为200 毫秒(图片0 - iled_blinky_lay200ms.bin),另一个的闪光间隔为2 秒(图片1 - iled_blinky_lay2s.bin)。

8adfb6f2c64142408db8d7b62e810789~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720067402&x-signature=l%2B3a3p7KhA7HIzuLyNGWvQBL6XE%3D 接下来,使用MCUBootUtility 工具首先使用一体化操作将映像0 下载到闪存。由于这是一个bin 文件,因此它应该具有正确的链接起始地址(i.MXRT1060 为0x60000000;i.MXRT1010 为0x60000400;有关详细信息,请检查项目的链接文件)。此外,使用完整的可启动映像文件(包括所有必需的启动标头)。也可以直接从软件的通用编程器界面下载。

79ea39183313407fa2e460b9122b1b5f~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720067402&x-signature=lPvK492oFKBb2iEYFw%2BCoISEGZ4%3Dimage 0 下载到Flash 后继续下载图像1。此时只能通过软件的通用编程器接口进行操作。这里重要的是设置下载起始地址。启用冗余程序启动时为Fuse 设置的偏移地址为0x400000,因此此时的下载起始地址必须为0x400000(i.MXRT1060 为0x400000,i 为0x400000)。MXRT1060 应为0x400000,i.MXRT1010 应为0x400400)。至此,两张图片已经下载完毕。

6c76784b4509429aa4752207ba8545dd~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720067402&x-signature=bDpYgtxaZ8fbnSk8mj4knecmdw0%3D2.3 快速验证两个图像是否正确

由于Flash中有两个镜像,我们快速检查一下这两个镜像是否满足冗余程序启动的要求。关于图0,没什么可说的。如果将芯片的启动模式设置为2'b10 并在断电后重置它,您应该看到映像0 正在运行。最重要的是检查图像1 是否合法。

这就开始涉及到核心的芯片冗余程序的启动过程了。如果image 0无法启动,芯片BootROM不会立即运行image 1。这使用了一种在寄存器(SRC_GPR10)中设置软复位的棘手方法。状态被标记,NVIC_SystemReset() 被调用,BootROM 再次开始执行。直到第二个BootROM 运行后,映像1 才会启动。

611affa745974ecc99d17e0f4f532b32~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720067402&x-signature=HcAIeteop8Vuow3l6qb8E2QS374%3D这还允许您快速验证映像1 是否正在运行。将J-Link仿真器挂在板上,打开J-Link Commander直接将SRC_GPR10寄存器重写为0x40000000,然后执行复位并运行。运行命令后,您将看到映像1 正在运行。

12c4416efeb045bf8bbe35e16c6208a1~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720067402&x-signature=MmchFRPYx6j09QLPTbNJKq%2B6Ezk%3D2.4 没有签名图像的测试0 损坏状态

皮子恒之前在文章《i.MXRT Bootable image格式》 中介绍了可启动映像的组成部分。最简单的无签名镜像必须至少包含四个部分:FDCB、IVT、BD、App。芯片的BootROM也依次读取这四个部分的数据。完成计划将开始。

c80c5caf53334048a73edb39bcbd9516~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720067402&x-signature=4dJpdPqsXcGkwTKP8iHJMMba1H8%3D 现在单独丢弃这些组件,看看BootROM 识别出映像0 的损坏程度并允许映像1 启动。以下是测试结果:从测试结果来看,无法检测到Image 0 - Apps的损坏,但BootROM可以识别Image 0中其他启动头的损坏。

测试项目

损坏程度

检测结果

状态

图片0 FDCB

由于缺少或缺少关键配置而无法访问Flash

无法启动未签名的映像0

未签名镜像1启动成功

如果启用自动探测功能,则FDCB 不相关

图片0 - IVT、BD

由于关键配置丢失或丢失而找不到应用程序信息

无法启动未签名的映像0

未签名镜像1启动成功

不适用

图片0-应用程序

对应用程序区域的任何破坏

未签名镜像0已启动,但执行取决于损坏程度

未签名图像1 未启动

不适用

2.5 Image 0 如何检测应用程序损坏

如果无法检测到图像应用程序部分的损坏,则此冗余程序启动功能就没用了。毕竟app部分的数据才是整个镜像的核心。如果您想为应用程序添加损坏检测,则必须启用i.MXRT 签名启动。使用MCUBootUtility工具将两个签名图像下载到Flash的过程与2.2节基本相同。下载签名镜像0没什么好说的,只是需要选择“HAB Signed Image Boot”。一体操作完成,可以读取签名图像1数据。在通用编程器接口中读取所有已签名的图像0 数据。是的,我不会详细解释这个特定的操作。

与未签名的映像0 相比,签名的映像0 包含更多的HAB 数据(cf、cert、signature)数据段。 BootROM 在跳转到镜像之前,只是根据HAB 数据验证镜像签名。签名验证通过后创建。

d4d21353dde54352944267f63340ce06~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720067402&x-signature=7Zsejkw1ZL0n%2FYL829p1QoF1jJM%3D 此时,另一个破坏性实验的结果如下。只有这样你才会看到冗余程序启动设计能够发挥出最大的作用。

测试项目

损坏程度

检测结果

状态

图片0 FDCB

由于缺少或缺少关键配置而无法访问Flash

无法启动签名图像0

签名图1启动成功

如果启用自动探测功能,则FDCB 不相关

图片0 - IVT、BD

由于缺少或缺少关键配置,无法找到应用程序信息。

无法启动签名图像0

签名图1启动成功

不适用

图片0 - 应用程序、HAB 数据

任意破坏应用程序和HAB数据区域

无法启动签名图像0

签名图1启动成功

不适用

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢