你们好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给你们分享的是自识别特性(Auto Probe)可让i.MXRT1060无需FDCB也能从NOR Flash启动。html
接着上篇文章 《了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点》 继续聊。对于i.MXRT1050为表明的第一代型号,Flash里必需要放置用户FDCB配置块,存储在这颗Flash里的App才能被正常启动。这个设计在i.MXRT1060为表明的第二代型号里有了改良,BootROM中增长了一个新特性,叫Auto Probe(自动识别),这个特性能够在不放置用户FDCB配置块的状况下App也能被正常启动。今天痞子衡就跟你们好好聊聊这个特性:git
- 备注:本文主角是i.MXRT1060,内容也基本适用i.MXRT1170,仅细节微小差异。
先从总体FlexSPI NOR启动初始化流程图上来看,自动识别(步骤X)被插入了初始化流程中,安排在FlexSPI外设第一次初始化以后,BootROM此时会尽力尝试去识别外接的Flash信息,若是识别成功则会获得一个自识别FDCB配置块,而后直接跳到FlexSPI NOR第二次初始化流程。若是识别失败,则继续按原来方式尝试读取用户FDCB配置块来获取外接Flash信息。github
有了Flash自动识别功能,BootROM能够没必要再强制客户在Flash里放置FDCB块,不少时候客户未必特别了解Flash以及这个FDCB块结构,不用提供FDCB能够为客户省去不少耗费在Flash上的研发时间,客户仅须要全心关注App功能设计。数组
Flash自动识别功能开启位在fuse_0x450[0](或者BT_CFG[0]引脚),默认是不使能的。想要开启这个功能须要拉高相关CFG引脚或者烧写相应Fuse位。微信
fuse 0x450[0] - FLASH_AUTO_PROBE_EN,Flash自动识别功能开启
虽然说是Flash自动识别,但其实仍是依赖Fuse里一些配置的,一共有以下四处配置,BootROM会根据这四处配置去进入Flash自动识别程序从而获得一个匹配的FDCB配置块,因此其实这个功能更准确的说法应该是FDCB自动生成。app
fuse 0x450[10:8] - FLASH_TYPE,决定当前链接的Flash类型 fuse 0x450[3:2] - FLASH_PROBE_TYPE,当FLASH_TYPE=0/1/7时,取代FLASH_TYPE来决定当前链接的Flash类型 fuse 0x6e0[3:1] - xSPI_FLASH_BOOT_FREQUENCY,决定FlexSPI工做频率 fuse 0x6e0[11:8] - xSPI_FLASH_DUMMY_CYCLE,配置Flash读访问时序前须要的Dummy周期
关于FDCB自动生成,其实就是利用了BootROM里那一套经典的FlexSPI NOR驱动(详见痞子衡以前的文章 《利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP》 里的2.2和2.3节),自动识别就是根据配置值组合出一个匹配的 serial_nor_config_option_t option参数,经由flexSpiNorDriver->get_config()函数运行后即可获得完整的flexspi_nor_config_t config结构体(即FDCB)。函数
serial_nor_config_option_t option参数组合规则以下表所示:工具
FLASH TYPE | FLASH PROBE TYPE | option值 | 备注 |
---|---|---|---|
3'b000 3'b111 |
2'b00 | 0xc0000001 | 可进一步dummy cycle设置 |
2'b01 | 0xc0603001 | ||
2'b10 | 0xc0403001 | ||
2'b11 | 0xc0803001 | ||
3'b001 | 2'b00 | 0xc0100001 | 可进一步dummy cycle设置 |
2'b01 | 0xc0700001 | ||
2'b10 | 0xc0503001 | ||
2'b11 | 0xc0903001 | ||
3'b010 | N/A | 0xc0233001 | |
3'b011 | N/A | 0xc0333001 | |
3'b100 | N/A | 0xc0433001 | |
3'b101 | N/A | 0xc0633001 | |
3'b110 | N/A | 未定义 |
了解了这个自动识别功能细节以后,让咱们在MIMXRT1060-EVK上测试一下,首先须要将BT_CFG[0]引脚拉高(R325电阻焊上去,默认DNP),这就开启了自动识别功能。测试
MIMXRT1060-EVK上默认链接的是IS25WP064AJBLE,这是一颗经典的133MHz QuadSPI NOR Flash,Fuse里的初始自动识别配置(FLASH_TYPE = 000 - Device supports 3B read,FLASH BOOT FREQ = 0 - 100MHz)适合这颗Flash,所以无需再烧录任何Fuse或拉高其余BT_CFG[x]引脚。flex
随便选一个例程 \SDK\boards\evkmimxrt1060\demo_apps\led_blinky 。编译这个 led_blinky 工程(能够选择 flexspi_nor_debug build,工程选项里XIP_BOOT_HEADER_ENABLE=1如今能够去掉了),使用 NXP-MCUBootUtility 工具将其一键下载进Flash中,下载完成后注意擦除掉Flash前1KB的数据(即没有FDCB),切换启动模式后复位板子,能够看到LED正常闪烁,说明自动识别功能生效了。
若是咱们将MIMXRT1060-EVK上的Flash改成S26KS512SDPBHI02,这是一颗典型的1.8V HyperFlash,那么还须要将BT_CFG2[2:0]设为 3'b010 - HyperFlash 1V8才能正常自识别。
至此,自识别特性(Auto Probe)可让i.MXRT1060无需FDCB也能从NOR Flash启动痞子衡便介绍完毕了,掌声在哪里~~~
文章会同时发布到个人 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就能够在手机上第一时间看了哦。