痞子衡嵌入式:测一测i.MXRT1170 Raw NAND启动时间(从POR到进App的Reset_Handler)



  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦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启动时间痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

原文地址:https://www.cnblogs.com/henjay724/p/12591382.html

时间: 2024-10-11 03:51:39

痞子衡嵌入式:测一测i.MXRT1170 Raw NAND启动时间(从POR到进App的Reset_Handler)的相关文章

痞子衡嵌入式:史上最强i.MX RT学习资源汇总(持续更新中...)

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MX RT学习资源. 类别 资源 简介 官方汇总 i.MXRT产品主页 恩智浦官方i.MXRT产品主页,最权威的资料都在这里,参考手册/数据手册,官方EVK板设计文件,各种应用笔记,各种参考设计方案.培训视频.软件SDK开发包,官方IDE/CFG工具,第三方软件支持等应有尽有,如果这上面文档你都能全部仔细看一遍,软件都能下载用起来,不用怀疑,你就是资深专家了. 其中痞子衡特别推荐你把所有应用笔记都看一遍,这些笔记凝结了所有恩智浦

《痞子衡嵌入式半月刊》 第 2 期

痞子衡嵌入式半月刊: 第 2 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期. 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿. 上期回顾 :<痞子衡嵌入式半月刊: 第 1 期> 唠两句 如果你第一时间阅读本期,此时应正是立春与雨水交节之时(2020年02月19日 12:56:53).雨水节气标示着降雨开始.雨量渐增,俗话说"

痞子衡嵌入式:飞思卡尔i.MX RT系列微控制器启动篇(4)- Flashloader初体验(blhost)

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Flashloader. 在上一篇文章 飞思卡尔i.MX RT系列微控制器启动篇(3)- Serial Downloader模式(sdphost, mfgtool) 里痞子衡为大家介绍了i.MXRT Boot的Serial Downloader模式,这种模式主要是用来引导启动Flashloader,那么Flashloader到底具有哪些功能?这是本篇文章痞子衡要为大家解惑的主题. 痞子衡在前面提过F

痞子衡嵌入式:飞思卡尔i.MX RT系列微控制器启动篇(6)- Bootable image格式与加载(elftosb/.bd/.bin)

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Bootable image格式与加载过程. 在i.MXRT启动系列第三篇文章 飞思卡尔i.MX RT系列微控制器启动篇(3)- Serial Downloader模式(sdphost, mfgtool) 里痞子衡在介绍使用sdphost引导启动Flashloader时使用过一个名叫ivt_flashloader.bin的image文件,其实这个image文件就是Bootable image的一种,

痞子衡嵌入式:并行接口NAND标准(ONFI)及SLC Raw NAND简介

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ONFI标准及SLC Raw NAND. NAND Flash是嵌入式世界里常见的存储器,对于嵌入式开发而言,NAND主要分为两大类:Serial NAND.Raw NAND,这两类NAND的差异是很大的(软件驱动开发角度而言),即使你掌握其中一种,也不代表你能了解另一种. Raw NAND是相对于Serial NAND而言的,Serial NAND即串行接口的NAND Flash,而Raw NAND是并行接口的NAND FLASH

痞子衡嵌入式:通用NOR接口标准(CFI-JESD68)及SLC Parallel NOR简介

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是CFI标准及SLC Parallel NOR. NOR Flash是嵌入式世界里最常见的存储器,常常内嵌在微控制器里(Parallel型)或外置作为内存扩展(Serial型),作为代码存储器.对于嵌入式开发而言,NOR主要分为两大类:Serial NOR.Parallel NOR,最早出现的NOR是Parallel NOR,后来为了简化引脚数,逐渐发展出了Serial NOR,目前的格局是Serial NOR主要占据低容量NOR市场

痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术或工具的介绍,前段时间因为要做一个跟恩智浦MCU启动相关的上位机工具 NXP-MCUBootUtility,网上搜索对比了几个Python下的GUI框架,最终选择了wxPython这个成熟稳定的GUI库,从而接触到wxFormBuilder这个配套wxPython使用的GUI构建工具.苦于网上关于该

痞子衡嵌入式:嵌入式从业者应知应会知识点 - 索引

大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是嵌入式从业者应知应会知识点. 本系列文章会逐一介绍嵌入式开发者应该懂的那些知识点: 计算机原理篇(持续更新中...1/2) 不可不知的计算机原理知识(1)- 整数表示(原码,反码,补码) 不可不知的计算机原理知识(2)- 浮点数表示 数据差错控制篇(持续更新中...3/6) 常用的数据差错控制技术(1)- 重复校验(Repetition Code) 常用的数据差错控制技术(2)- 奇偶校验(Parity Check) 常用的数据差

痞子衡嵌入式:极精简的Git命令教程(2)- 连接(remote/clone)

今天是Git系列课程第二课,上一课我们已经学会在本地创建一个空repo,痞子衡今天要讲的是如何将本地仓库与远程建立联系. 1.将本地仓库挂上远程git remote 本地建好了仓库,我们希望能够挂到远程服务器上,方便与其他人共享.目前最流行的远程git服务器当然是github,此时你需要在github上注册账户并在线创建一个仓库,此处我们输入仓库名为gittest 点击"Create repository"之后便弹出如下画面,最重要的是我们可以得到一个远程repo的地址:[email