加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

测一测i.MXRT1170 Raw NAND启动时

2020/03/30
395
阅读需 15 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦 i.MX RT1170 Raw NAND 启动时间。

关于 i.MXRT1170 这颗划时代的 MCU,痞子衡去年 10 月在其刚发布的时候,专门写过一篇文章介绍过其特点(详见 《终于可以放开聊一聊 i.MXRT1170 这颗划时代 MCU 了》),眼看着其上市日期越来越近了,恩智浦软硬件技术支持团队也正在紧锣密鼓地开发 SDK 以及参考设计。因为官方首次在 i.MXRT1170 EVK 板上(Rev.B)放了一片旺宏的 Raw NAND 芯片,而 i.MXRT 当然是支持从 Raw NAND 启动的,因此痞子衡打算为大家测一测 Raw NAND 的启动时间(这里指在 ITCM 执行,暂不考虑在 SDRAM 执行)。

一、准备工作

1.1 知识储备

在开始测试之前,你需要认真读一下痞子衡的旧文 《恩智浦 i.MX RT1xxx 系列 MCU 启动那些事(8)- 从 Raw NAND 启动》,对 i.MXRT 从 Raw NAND 启动的原理有一个充分认识。

Raw NAND 启动不同于你最熟悉的 Serial NOR 启动,由于 NAND 访问的特殊性(仅能按 Page 读,且允许坏块),因此其仅支持 Non-XIP Application(即需要把 Application image 从 NAND 中全部拷贝出来,放到 RAM 中执行),无法原地执行。这个拷贝工作就由芯片内部的 BootROM 来完成,为了让 BootROM 顺利完成拷贝工作,我们需要在 NAND 中放一些特殊数据(即下面的 FCB, DBBT, IVT)。

FCB 永远放在 NAND 的第一个 block 里的固定位置,BootROM 首先从 NAND 中读取 FCB(此时是利用 eFuse 0x940 和 0xC80 里的简化时序配置选项),FCB 中含有三类信息:用户设置的完整时序配置数据(可选的)、DBBT 位置,IVT 位置。BootROM 首先会检查是否存在完整时序配置数据,如果有,则使用这个数据重新配置 NAND 访问时序。然后 BootROM 会继续获取 DBBT 数据,获知当前 NAND 的坏块信息,接下来便是根据 IVT 信息获取 Application 数据完成拷贝(拷贝过程中需要避开坏块)。

1.2 时间界定

说到启动时间的界定,其实无非是找到时间起点以及时间终点。

时间起点很好办,根据 i.MXRT1170 芯片 POR 信号变化即可(下图中的 RST_TGTMCU_B 的上升沿),也就是芯片开始上电为起点。

 

时间终点稍微有点难办,如果监测 Raw NAND 信号(比如 CE#最后一个上沿)有点难抓,也不够精准,毕竟 BootROM 拷贝完所有 Application image 数据后是否还会做一些校验工作才会跳转不得而知,所以还是以执行到 Application 为准。到了 Application 的执行就简单了,在 Application 里加个 GPIO 翻转(比如点灯)即可,我们只需抓取这个 GPIO 的信号变化(抓下图中 R1855 的上升沿)。

 

1.3 制作应用程序

现在我们开始制作测试用的 Non-XIP Application,以 \SDK_xxx_MIMXRT1170-

EVK\boards\evkmimxrt1170\demo_apps\led_blinky\cm7\ 下的工程为基础,但需要做一些修改。

痞子衡以 IAR 工程示例,首先需要选中 debug build(release 也行),这个 build 即是在 ITCM 中执行的 Non-XIP 版本,而且其链接文件里的 m_interrupts_start 也需要从 0x00000000 修改为 0x00002000(这里如果不明白的话,继续回去看痞子衡写的 Raw NAND 启动文章)。

 

这个工程里的 led_blinky.c 里已经有 GPIO 翻转代码了,但是位置在 main()函数里,为了得到尽量准确的启动时间,我们应该把 GPIO 翻转的代码提前,下面是程序 Reset_Handler 代码,原则上我们应该要在这里加汇编,但是为了简单起见,我们也可以在 SystemInit()函数里加 C 代码(痞子衡认为在 data/bss 段初始化之前就可以了)。

        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
        CPSID   I               ; Mask interrupts
        LDR     R0, =0xE000ED08
        LDR     R1, =__vector_table
        STR     R1, [R0]
        LDR     R2, [R1]
        MSR     MSP, R2
        LDR     R0, =SystemInit
        BLX     R0
        CPSIE   I               ; Unmask interrupts
        LDR     R0, =__iar_program_start
        BX      R0

编译后可以得到一个 17732 bytes 的 Application(可以生成 .srec 格式,方便后面下载),但是我们知道 Raw NAND 启动时间跟 Application 长度是成正比的(主要耗时就是在拷贝上),所以我们还需要再制作一个稍微大一些的 Application,可以直接在代码里加上如下 const 数组定义,并且在 IAR 的 Option/Linker/Input 里的 Keep symbols 里加上 s_dummyBuffer,防止这个数组被优化掉。

const uint8_t s_dummyBuffer[1024*230] = {0};

 

1.4 下载应用程序

应用程序的下载需借助痞子衡开发的 NXP-MCUBootUtility 工具(v2.2 版本及以上),将 i.MXRT 启动模式设到 SDP 模式(EVK 上 SW1 拨码开关设为 4'b0001),然后给板子上电。软件的使用不予赘述,NAND 具体配置如下即可,后面的测试我们只需要更改 ONFI Timing Mode 这一个参数。

Note: 这个工具会自动生成 FCB(包含完整 NAND 时序配置), DBBT, IVT 并将其和 Application 一起下载进 Raw NAND 中

程序下载完成后,将 i.MXRT 启动模式设到 Internal Boot 模式(EVK 上 SW1 拨码开关设为 4'b0010),并且将启动设备设为 Raw NAND(EVK 上 SW2 拨码开关设为 10'b0000010000),断电重启你应该就可以看到 LED 灯会亮,这代表 Raw NAND 启动成功了。

1.5 示波器抓取信号

一切准备就绪,可以用示波器抓 Raw NAND 启动时间了。除了通道一监测 POR 信号,通道三监测 LED GPIO 信号,为了更直观地看启动过程,痞子衡特地加了通道二来监测 NAND_CE#信号,这样可以看到 Application 拷贝过程。

 

二、开始测试

2.1 影响因素

2.1.1 App 长度

App 的长度是影响启动时间的第一因素。痞子衡在前面 1.3 节 制作应用程序里,已经制作了两个不同长度的 App 用于测试。

2.1.2 NAND 访问模式

NAND 访问模式是影响启动时间的第二因素。SEMC 支持的 NAND 访问模式一共两种,分别是 IPG CMD 模式和 AXI CMD 模式,前者是应用程序手动发命令去一次读取 4byte 数据到 SEMC 数据寄存器,然后再从寄存器中取数据;后者是应用程序访问指定的 AXI 空间(假定也是取 4byte),由 SEMC 自动发命令读取 4byte 并放到对应 AXI 映射空间里。

NXP-MCUBootUtility 工具里所依赖的 flashloader 固定使用 IPG CMD 模式,因此想切换到 AXI CMD 模式,需要从 SDK/middleware/mcu-boot 中获取 flashloader 源码,修改源码(在 semc_nand_mem_config()函数中做如下修改)后重新编译使用。

使用修改后的 flashloader 程序下载完成 Application 之后,需要在回读的 image 数据中偏移 0x109 的地址查看数据(0x01 代表 AXI,0x00 代表 IPG)。

痞子衡继续使用示波器抓取 NAND_RE#信号如下:

这是 IPG CMD 模式下的时序(ONFI timing mode5):

这是 AXI CMD 模式下的时序(ONFI timing mode5):

从上述时序上看,AXI CMD 模式读取数据明显比 IPG CMD 模式更高效,每 4byte 访问之后的间隔时间大大缩短。

2.1.3 ONFI Timing Mode

ONFI Timing Mode 是影响启动时间的第三因素。NXP-MCUBootUtility 工具中支持更改 ONFI Timing Mode(主要是将设置写进 FCB),痞子衡查了下 EVK 板上这颗 NAND 芯片,能支持 mode0 - mode5 一共 6 种模式,我们就先来看看最慢的 mode0 和最快的 mode5 是否设置生效。在程序下载完成之后,需要在回读的 image 数据中偏移 0x153 的地址查看数据(0x01 代表 mode0,0x06 代表 mode5)。

Raw NAND 访问是通过 SEMC 模块实现的,SEMC 一次会从 NAND 读取 4byte 放到内部 32bit 数据寄存器中,痞子衡使用示波器抓取 NAND_RE#信号如下:

这是 ONFI Timing Mode0 下的时序:

这是 ONFI Timing Mode5 下的时序:

从上述时序上看,ONFI Timing Mode 设置是生效的,mode5 耗时确实比 mode0 短一些,与 ONFI 1.0 手册里规定的数值基本是吻合的。

2.2 测试结果

前面分析完了影响因素,现在到了公布结果的时候了,痞子衡基于前面的影响因子组合一共做了 8 个测试,结果如下表所示。总之一句话,想要最快的启动时间,设为 AXI 访问模式以及 ONFI Timing Mode5 即可,另外如果对启动时间敏感(比如 Auto 应用),不妨做两级启动(Boot+App),Boot 尽量小,App 可以很大,Boot 起来之后去做一些启动任务(响应 CAN,点亮 LCD 屏),然后由 Boot 再去慢慢加载 App。

NAND 访问模式 ONFI 时序模式 Application 长度 启动时间
IPG CMD mode 0 - 10MHz 17732 bytes 40.58ms
IPG CMD mode 5 - 50MHz 17732 bytes 38.90ms
IPG CMD mode 0 - 10MHz 253252 bytes 172.3ms
IPG CMD mode 5 - 50MHz 253252 bytes 164.3ms
AXI CMD mode 0 - 10MHz 17732 bytes 32.8ms
AXI CMD mode 5 - 50MHz 17732 bytes 32.6ms
AXI CMD mode 0 - 10MHz 253252 bytes 104.9ms
AXI CMD mode 5 - 50MHz 253252 bytes 78.86ms

测试结果波形图较多,痞子衡且放一张(AXI, mode0, 17732bytes)给大家看看吧。

至此,恩智浦 i.MX RT1170 Raw NAND 启动时间痞子衡便介绍完毕了,掌声在哪里~~~

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
NRM6045T220MMRRV 1 TAIYO YUDEN General Purpose Inductor,
$0.56 查看
0039000040 1 Molex Wire Terminal, LOW HALOGEN, ROHS AND REACH COMPLIANT
$0.2 查看
50079-8100 1 Molex Wire Terminal, LEAD FREE

ECAD模型

下载ECAD模型
$0.17 查看
恩智浦

恩智浦

恩智浦半导体创立于2006年,其前身为荷兰飞利浦公司于1953年成立的半导体事业部,总部位于荷兰埃因霍温。恩智浦2010年在美国纳斯达克上市。恩智浦2010年在美国纳斯达克上市。恩智浦半导体致力于打造全球化解决方案,实现智慧生活,安全连结。

恩智浦半导体创立于2006年,其前身为荷兰飞利浦公司于1953年成立的半导体事业部,总部位于荷兰埃因霍温。恩智浦2010年在美国纳斯达克上市。恩智浦2010年在美国纳斯达克上市。恩智浦半导体致力于打造全球化解决方案,实现智慧生活,安全连结。收起

查看更多

相关推荐

电子产业图谱

硕士毕业于苏州大学电子信息学院,目前就职于恩智浦(NXP)半导体MCU系统部门,担任嵌入式系统应用工程师。痞子衡会定期分享嵌入式相关文章