野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12852|回复: 1

i.MX RT1050上手手册 (外部Flash)

[复制链接]
发表于 2018-6-21 15:28:27 | 显示全部楼层 |阅读模式
本文章转载自"施长浩 恩智浦MCU加油站",

https://mp.weixin.qq.com/s/joc6SoYUQ458xL8AhUuzxA


i.MX RT1050自推出以来,我们陆续收到不少客户咨询外接Flash闪存的事项。针对该产品无闪存的特点(需要外挂片外Flash或其他存储介质),结合客户提到比较多的问题,本文着重介绍常用的FlexSPI NOR器件在i.MX RT1050上的使用。

支持的Flash类型
i.MX RT1050可以支持所有符合JEDEC标准(JESD216),或符合后续JESD216A, JEDSD216B规范的闪存器件。对于不符合上述规范的特殊Flash类型,Flashloader也预留了512字节的配置表,通过特殊配置给予支持。另外,具体支持的Flash清单,请大家参照NXP官网发布的AN12108 (How to Enable Boot from QSPI Flash)AN12107 (How to Enable Bootfrom HyperFlash and SD Card)

什么是BootROM?
i.MX RT系统启动是由片内的BootROM进行引导的,BootROM是芯片在出厂前固化在片内只读存储区(ROM)里的一段Bootloader程序。从芯片参考手册的存储器映像表(Memory map)里可以看出,i.MX RT1050支持的存储类型一共有三种:
  • 96KB的ROM(即BootROM);
  • 片内RAM(OCRAM/DTCM/ITCM);
  • 分配给外部存储器接口控制器(SEMC/QSPI)的2GB区域。

i.MX RT Boot方式主要是借助BootROM,从外部存储器加载应用程序代码到内部SRAM、外部SDRAM或直接从Flash执行(XIP)。

什么是XIP?
XIP全称eXecute In Place, 意思就是通过FlexSPI接口扩展外部Flash,并且支持直接从连接的外部Flash中执行程序指令。具体过程如下:
  • 硬件复位后,硬件复位逻辑(POR)驱动CPU(ARM核)从BootROM开始执行程序;
  • BootROM读取BOOT_MODE寄存器和eFUSEs的值,确定从哪个存储器启动。针对开发需求,用户可以用GPIO输入取代eFUSEs的预设值。
  • i.MX RT的串行或并行NOR闪存接口,都可以支持XIP执行。如果代码存储在其它介质,例如SD卡、并行NAND或EMMC等,则需要把代码拷贝到内部RAM或外接SDRAM里才能运行。

启动代码的结构
要让系统能够正常启动(Boot)起来,则烧写到外部串行SPIFlash里面的完整代码段必须按照BootROM规定的存储格式,如下图二所示,启动代码 包含以下几个部分:
  • Flash Configuration Parameters (FCP) — 闪存的配置参数;
  • Image Vector Table (IVT) — 包含指针序列指向固定的物理地址,ROM通过查找这些入口地址找到程序的各组成部分;
  • Boot data — 包含程序镜像文件的地址,大小及Plugin标志;
  • Device Configuration Data (DCD) — 芯片配置数据,比如SDRAM寄存器的设置;
  • Application — 用户程序及数据;

其中FCP和IVT是存放在固定的地址的。 闪存配置参数一共512 字节,从偏移地址0x0开始。存放IVT的偏移地址由启动设备类型决定,对于XIP存储设备来说,偏移地址是是0x1000(4K字节偏移)开始,非XIP存储设备的IVT是从0x400(1K字节偏移)开始存放。
Boot data, DCD及Application的地址则由IVT指定,无论是直接编译生成或使用MFG工具添加,启动代码的目标文件里只有包含了这几个部分,BootROM才会认可并执行。
图二 应用代码结构
关于每个部分的结构及内容,用户需要对照参考手册和SDK实例学习,SDK2.3.1版本的应用实例都是支持XIP启动的,SDK 2.3.1例程中XIP头文件的内容和EVK上使用的Flash型号(S26KS512SDPBHI02)是一一对应的。
如何生成XIP代码
用户可以用以下两种方式建立一个执行XIP的应用镜像:
第一种方法是直接在程序中增加XIP头文件,这样编译出来的镜像文件符合启动代码的格式,可以直接Boot。
这种方法适用于在官方EVK板上进行程序调试,SDK工程文件里面自带XIP头文件。请注意这里的XIP头文件是针对EVK上用的HyperFlash型号,如果是用户自己的开发板,需要根据所选Flash对XIP头文件进行修改,如果涉及到调试,还需要修改IDE下的Flashloader, 请参照AN12183 (How to Enable Debugging for FLEXSPI NOR Flash)进行XIP头文件及IAR下Flashloader的修改。
第二种方法是在生成的用户镜像文件基础上,运用MFG工具加上XIP的头文件,最后生成可以烧写并最终XIP启动的目标SB文件。
这种方法适用于用户设计的板子(选用不同的Flash)。具体过程是通过宏配置,生成不带任何XIP头文件的目标文件,然后运用MFG工具,选择特定Flash所对应的启动描述(BD)文件来修改其参数和配置生成SB文件,再通过USB OTG1进行烧写,用户可以参照AN12108 (How to Enable Boot from QSPI Flash)AN12107 (How to Enable Boot from HyperFlash and SD Card)所描述的步骤进行操作。
FlexSPI Flash启动
FlexSPI Flash启动时间如图三所示,其中Flash需要3ms左右初始化,步骤如下。
  • POR后ARM核执行Boot ROM程序,判断并决定最终从QSPI Flash启动;
  • ROM 配置FlexSPI的PINMUX,时钟配置为30MHz,单线模式;
  • 读取Flash初始的512字节读取配置参数,并配置IOMUXC,LUT等;
  • 根据读取的参数配置Flash到正常运行模式;
  • 读取IVT并判断是否是XIP;
  • XIP直接执行(非XIP需先拷贝4K Byte到OCRAM,ROM根据内容决定如何执行);

图三 QSPI Boot
整个过程中用户需要注意的事项:
  • 参考SDK例程,选用flex_spi_debug/ flex_spi_release workspace,使用正确的链接文件。
  • 使用MFG工具添加XIP头文件,应针对Flash型号选用正确的BD文件,具体参照以下目录:
    Flashloader_RT1050_1.1\Tools\bd_file\imx10xx;
  • 配置正确的Boot_MOD、Boot_CFG或者eFuse的值,从FlexSPI NOR启动;
  • 如无法判断XIP Boot是否成功,可以连接JLINK调试器,查看PC指针是否指向FlexSPI的映射空间;


综上所述,本文主要介绍了i.MX RT的BootROM和XIP的基本概念,描述了启动代码的各个组成部分,并讨论如何生成ROM能够识别的XIP镜像文件。此外文章还介绍了i.MX RT支持的外部Flash型号及Flash启动的过程和注意事项,通过这一套对外部Flash的支持机制,i.MX RT可以很好的支持全球几乎的所有QSPI Flash,同时也克服了传统MCU片内Flash不方便扩展,价格昂贵的缺点。

回复

使用道具 举报

发表于 2018-6-21 17:10:56 | 显示全部楼层
谢谢分享,学习一个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-26 21:38 , Processed in 0.029513 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表