没有合适的资源?快使用搜索试试~ 我知道了~
首页I.MXRT105x从外部SPI Flash启动v1.2.1
资源详情
资源评论
资源推荐

I.MXRT105 从外部 SPI Flash 启动 v1.2.1
1
I.MXRT105x 从外部 SPI Nor Flash 启动 v1.2.1
作者
Ji Cheng
日期
2018 年 1 月 北京
说明
本手册介绍了 NXP 最新 ARM Cortex-M7 处理器 I.MXRT105x 从外部 SPI Nor Flash 启
动的原理,流程和注意事项,并结合实际例子给出了在 IAR 和 Keil 下的配置方法和
相应的 Flash 烧写算法。
当前版本
v1.2.1
版本历史
V1.0(2018.01)
初始版本,描述了 RT105x 从外部 SPI Nor Flash 启动的流程和基于官方 EVK 板载自
带的 Hyper Flash 和 QSPI Flash 的 IAR 工程配置方法,最后给出了一种常用实例即
代码跑在 SPI Flash 里,数据跑在 SDRAM 里;
V1.1(2018.02)
加入 Keil 下对常用的 GD 和 Winbond QSPI 的 Flash 算法支持和工程配置;
V1.2(2018.03)
修正了 1.0 版本 QSPI 只能单线或者双线启动问题,最新的配置文件支持 QSPI 4 线制
启动和 XIP 执行,另外新更新了 IAR 的 Flashloader 和 Keil 的 Flash 算法,可以同
时支持 ISSI QSPI 和 GD/Winbond QSPI Flash 下载和调试;
V1.2.1(2018.04)
修正了使用板载 CMSIS-DAP 调试器在 IAR IDE 下 debug 时不能正常断点的问题.
2018 新年伊始,I.MXRT105x 已经推向市场有一段儿时间了,以其极高的性价比引起了不少
工业和消费领域客户的兴趣,毕竟相比于目前市场上已有的多数“高价低配”的高端 ARM
Cortex-M7 产品,RT105x 最高 600MHz 主频、极丰富的外设和 3 美金起步的定位着实算是业界良
心了(还有马上要面世的 LQFP 封装 I.MXRT1020 更是让人期待),只是当然这种“低价高配”
是有代价的,其内部不自带 Flash 需要外挂串行 SPI Nand/Nor Flash 或者并行的 Nand/Nor
Flash(貌似一下子给不少心动的人泼了凉水,呵呵),不过这一消息倒是有人欢喜有人忧,对
欢喜的客户来说,他们的应用代码本身内部 Flash 就装不下需要外扩,这一下反倒好了,省的
内心纠结了再也不用担心老板整天催自己优化代码精简应用看看能不能只用内部 Flash 搞定
了,哈哈,而且动则几 Mb 或者几十 Mb 的外部 SPI Flash 价格便宜以后升级也是绰绰有余,而
对忧的客户来说,外部 Flash 启动方式带来的启动配置复杂、代码安全性问题和对系统性能的
影响等都是潜在的棘手问题。
关于外部 Flash 的代码安全问题和代码在外部执行对整个系统性能的影响,RT105x 的加密
启动(HAB)功能和 32KB 的 L1 ICache/DCache 是可以解决的,只是本文先从 RT105x 的启动配
置问题着手,毕竟系统如果都 Boot 不起来,其他的问题都是空谈了,呵呵。另外,如上面所
说,RT105x 支持的启动方式有不少,不过个人觉着外部串行 SPI Flash 启动会是大多数人的折
中选择。由于 RT105x 的官方 EVK 板上是带有两块串行 SPI Nor Flash(一个是 Cypress 高性能
8 线高速的 Hyper Flash S26KS512SDPBHI02,一个是 ISSI 物美价廉的 4 线 QSPI Flash

I.MXRT105 从外部 SPI Flash 启动 v1.2.1
2
IS25WP064AJBLE),所以咱就手上有啥来啥,以板载的 Hyper Flash 和 QSPI Flash 为例详细说
明下串行 SPI Nor Flash 的启动流程和具体使用方法。
1. 串行 SPI Nor Flash 启动流程
当 RT105x EVK 板载的 Boot 模式选择开关 SW7 设定为如下 Table1-1 所示的前两者时(其他
BOOT_CFG 管脚默认被下拉到地,即 OFF 状态),系统会通过片上的 FlexSPI 接口执行外部串行
SPI Nor Flash 的启动,其启动地址为 Table1-2 所示的 0x6000_0000(如果是从并行的 Nor
Flash 启动则启动地址为 0x8000_0000),关于其他 Boot pin 对启动模式的配置影响,见
RT105x 的 RM 手册 8.6 章节,这里就不细说了。
Table1-1 典型的启动模式设定
SW7-1
SW7-2
SW7-3
SW7-4
启动模式
OFF
ON
ON
OFF
Hyper Flash 启动
OFF
OFF
ON
OFF
QSPI Flash 启动
ON
OFF
ON
OFF
SD 卡启动
Table1-2 启动相关地址
Start Address
End Address
Size
Description
0x80000000
0xDFFFFFFF
1.5GB
SEMC 外部存储器接
口 (SDRAM, 并行
NOR Flash, PSRAM,
并行 NAND Flash)
0x60000000
0x7F7FFFFF
504MB
FlexSPI
0x20200000
0x2027FFFF
512KB
OCRAM
0x20000000
0x2007FFFF
512KB
DTCM
0x00000000
0x0007FFFF
512KB
ITCM
如图 1 所示为完整的 SPI Nor Flash 启动流程图,当 RT105x 的片上 ROM 在检测到启动模式
为 FlexSPI 接口后,会根据 Boot Pin 的配置信息配置该模式下需要使用的 FlexSPI 接口管脚的
复用模式并将 FlexSPI 的时钟配置成默认的低速 30MHz,然后会以 0x6000_0000 为首地址读取
前 512 个字节作为外部 Flash 的配置信息(即 Flash Configuration Parameters,包括几线制
的 SPI Flash,SPI 的时钟频率,LUT 查找表,DDR/SDR 模式以及片选 CS 管脚的 Hold/Setup
Time 等信息,见 RM8.6.3 章节)并以此来配置 FlexSPI 模块以满足外部 Flash 的特性,待配置
完毕后,RT105x CPU 以后即会以 AHB 总线读取数据和指令的方式(虽然从外部来看仍然是
FlexSPI 接口,但是由于 LUT 查找表读取数据的指令已经配置好,CPU 只是通过 AHB 总线发送读
取指令即可触发 LUT 以操作外部 Flash,也就是说在内部对 CPU 来讲已经屏蔽掉了 FlexSPI 的
底层)来读取接下来的跟用户 Image 相关的几个关键信息,即 IVT(Image Vector Table),
Boot Data 和 DCD(Device configuration data)如图 2,其中 IVT 需要放在外部 Flash 的固
定偏移地址(如图 3,对 Nor Flash 来说其需要存储在基地址 + 4KB 的偏移地址,比如
0x60000000+4*1024)供 ROM 读取以便让系统知道用户 Image 的第一条可执行指令放在了哪里以

I.MXRT105 从外部 SPI Flash 启动 v1.2.1
3
及 BootData 和 DCD 的存放地址,BootData 则保存了完整 Image 的首地址和整个 image 所占的
空间大小,而 DCD 则包含了一些配置命令以便在跳到用户程序入口之前供 ROM 调用配置内部外
设以更好的匹配外部 IC,一般如果系统外挂了 SDRAM 的情况则需要配置好 DCD(因为有时需要
主程序在跑起来之前,外部 SDRAM 就得处在 ready 状态,以供 CPU 把 data 或者 code copy 到
SDRAM 里时不会出错)。
图 1 SPI Nor Flash 启动流程
图 2 完整 Image 组成元素
图 3 IVT 针对不同存储介质的存放地址

I.MXRT105 从外部 SPI Flash 启动 v1.2.1
4
综上所述,我们实际上就可以得出结论来,如果要让系统能正常 Boot 起来,则烧写到外部
串行 SPI Flash 里面的完整 image 必须要包括五个重要元素,即 Flash Configuration
Parameters,IVT,Boot Data,DCD 和用户 image,而其中 Flash Configuration Parameters
和 IVT 是存放在固定的地址的,而后三者则由 IVT 的内容来决定,无论是直接编译生成或者通
过辅助工具手动添加,只要我们最后形成的 image 里面包含了这几个元素,CPU 就会认可这个
image 并执行(先不谈安全加密的事)。所以我们只要搞清楚这个基本原理了,无论是什么方
法,最后都是殊途同归,下面就可以放心大胆地去解决 RT105x 的 FlesSPI 启动问题了。
2. SPI Nor Flash 启动配置方法
前面提到如果想要 RT105x 能正常从外部串行 SPI Nor Flash 启动的话,待烧写的 image 是
必须要集成五个元素的(Flash Configuration Parameters, IVT, Boot Data, DCD and User
Image, 重要事情要多说几遍 呵呵),那具体的实现方法我目前想到的无非两种,一种是在编
译链接过程中直接把这几个元素和应用代码链接到一块,并将这几个元素指定好链接地址,最
后通过 IDE 的 Flashloader 下载到 SPI Flash 里,第二种则是通过辅助工具在编译链接好的裸
应用代码前面手动的添加一个信息头(头里面包含这几个元素),然后通过单独的下载工具或
者 MCU 内部的 ROM Bootloader ISP 下载进去。这两种各有优劣势,前者比较适合在前期调试的
时候使用,这样在 IDE 里面编辑修改应用代码后做印证测试的时候可以直接在线 download 和
debug(比如单步,断点,查看寄存器和 Memory 等等),我相信这也是目前大家比较迫切需要
的,但是缺点的话则是前期配置过程稍微复杂些且需要对 Boot 过程和外部 SPI Flash 的 Spec
有一定了解(当然这些配置是一劳永逸的,配置一次即可),而后者则是客户不需要关心其他
几个元素的配置只专注用户应用的开发,待开发完毕后通过辅助工具生成最终的 Image 用于小
批测试或者量产,缺点是前期调试的话会比较麻烦,每次修改完重新编译生成用户 image 还需
要用辅助工具手动添加信息头然后再通过 Bootloader 下载进去验证(我想想都有点累的
慌。。。这种情况 workaround 只能是前期先在 RAM 里调试,待成熟了之后再走这个流程)。
第二种使用辅助工具的方法,官方已经提供了一整套工具链(可以从 RT105x 官方主页
的”Flashloader i.MX-RT1050”软件包里找到)且有了相应的 AN 应用笔记介绍其具体操作步
骤,这里就不再赘述了。本次我们重点介绍第一种方法,即在 IDE 环境里通过对工程的配置达
到生成并下载调试完整 image 的目的,说到这里我再啰嗦几句,实际上这种方法做下来不只方
便了在线 download 和 debug,好处也不少,一是所有的这几个元素配置信息都以 C 语言的常量
形式体现在应用工程文件里面,会加深我们对 Boot 的理解程度不说,这样的话如果更换外部
SPI Flash 也可以很方便的更改适配信息,第二呢则是这种方式形成的 image 文件会是通用的
image 格式(比如.bin, .hex 和.S19),也会兼容市面上大多数可以直接烧写 SPI Flash 的量
产工具的批量烧写。好了,不再多说了,再说就有点话痨了,呵呵,因为板载有 Hyper Flash
和 QSPI Flash 两种,下面就分别详细说明下这两种 Flash 在 IDE 环境下的配置方法(我使用的
IAR,Keil 的可以参考第四章节自行配置,需要添加的几个文件是 IAR,Keil 和 GCC 三个环境
兼容的)。
开发测试环境:

I.MXRT105 从外部 SPI Flash 启动 v1.2.1
5
Hardware Platform: MIMRT1050-EVK (SCH-29538 REV A1)
Software Package: SDK_2.3.0_EVK-MIMXRT1050(mcuxpresso.nxp.com)
IDE: IAR_v8.20.1
Debugger: On-Board CMSIS-DAP
2.1 Cypress 1.8v Hyper Flash 启动
RT105x 的 EVK 板子默认是使用 Hyper Flash 启动的,所以硬件不需要改动,只需要将 SW7
启动模式修改成 Table1-1 第一行配置使能 Hyper Flash 启动即可,如下图 4,然后我们以
SDK2.3 中的 hello world 为例介绍具体配置方法。实际上在最新的 SDK2.3 里面 Keil 和
MCUXpresso 版本已经有针对 Hyper Flash 启动的 hello_world_xip 的样例了,只是 IAR 反倒是
没有,不过这下正好我们来走一遍完整的配置过程,这样也可以为下一小节的 QSPI 启动打下基
础(官方例程里是没有 QSPI XIP 例程的),毕竟大多数客户估计还是会倾向于选择 QSPI 的。
图 4 Hyper Flash 启动模式
(1)打开 SDK2.3 的 hello world 例程\boards\evkmimxrt1050\demo_apps\hello_world\iar,
在 Workspace 下可以看到默认是有 8 种配置的,包括在 SDRAM 调试,OCRAM 调试和 spi nor
Flash 调试,原始的 flexspi_nor_debug 配置是没有其他几种元素的,所以这种配置下当把代
码下进去外部 Hyper Flash 上的时候可以在线 debug 但是当重新上电或者外部复位后系统是
Boot 不起来的,因为没有其他元素信息 RT1050 启动的时候识别不了它的。接下来我们在此配
置基础上新建一个配置出来然后在新的工程配置上添加文件和修改配置,点击 IAR 菜单栏
Project->Edit Configurations,然后在打开的窗口下选择 New,在新的工程配置下起一个新
的名字“HyperFlash_bootok”,Base on Configuration 则选择原有的 flexspi_nor_debug 以
最大限度的保留原有的配置,改好之后点击 Ok 即当前工程会进入新添加的 HyperFlash_bootok
配置状态;
剩余20页未读,继续阅读




安全验证
文档复制为VIP权益,开通VIP直接复制

评论0