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

本文章转载自"施长浩 恩智浦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不方便扩展,价格昂贵的缺点。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值