1. 程式人生 > >痞子衡嵌入式:自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動

痞子衡嵌入式:自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是**自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動**。   接著上篇文章 [《瞭解i.MXRT1060系列ROM中序列NOR Flash啟動初始化流程優化點》](https://www.cnblogs.com/henjay724/p/14103419.html) 繼續聊。對於i.MXRT1050為代表的第一代型號,Flash裡必須要放置使用者FDCB配置塊,儲存在這顆Flash裡的App才能被正常啟動。這個設計在i.MXRT1060為代表的第二代型號裡有了改良,BootROM中增加了一個新特性,叫Auto Probe(自動識別),這個特性可以在不放置使用者FDCB配置塊的情況下App也能被正常啟動。今天痞子衡就跟大家好好聊聊這個特性: > * 備註:本文主角是i.MXRT1060,內容也基本適用i.MXRT1170,僅細節微小差別。 ### 一、自動識別功能意義   先從整體FlexSPI NOR啟動初始化流程圖上來看,自動識別(步驟X)被插入了初始化流程中,安排在FlexSPI外設第一次初始化之後,BootROM此時會盡力嘗試去識別外接的Flash資訊,如果識別成功則會得到一個自識別FDCB配置塊,然後直接跳到FlexSPI NOR第二次初始化流程。如果識別失敗,則繼續按原來方式嘗試讀取使用者FDCB配置塊來獲取外接Flash資訊。   有了Flash自動識別功能,BootROM可以不必再強制客戶在Flash裡放置FDCB塊,很多時候客戶未必特別瞭解Flash以及這個FDCB塊結構,不用提供FDCB可以為客戶省去很多耗費在Flash上的研發時間,客戶僅需要全心關注App功能設計。 ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_InitFlexSPI_overall_v2.PNG) ### 二、開啟自動識別功能   Flash自動識別功能開啟位在fuse_0x450[0](或者BT_CFG[0]引腳),預設是不使能的。想要開啟這個功能需要拉高相關CFG引腳或者燒寫相應Fuse位。 ```text fuse 0x450[0] - FLASH_AUTO_PROBE_EN,Flash自動識別功能開啟 ``` ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_AutoProbe_fusemap_autoprobe_en.PNG) ### 三、自動識別依賴的配置   雖說是Flash自動識別,但其實還是依賴Fuse裡一些配置的,一共有如下四處配置,BootROM會根據這四處配置去進入Flash自動識別程式從而得到一個匹配的FDCB配置塊,所以其實這個功能更準確的說法應該是FDCB自動生成。 ```text 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週期 ``` ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_AutoProbe_fusemap_autoprobe_type.PNG) - ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_AutoProbe_fusemap_autoprobe_freq.PNG)   關於FDCB自動生成,其實就是利用了BootROM裡那一套經典的FlexSPI NOR驅動(詳見痞子衡之前的文章 [《利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可輕鬆IAP》](https://www.cnblogs.com/henjay724/p/13202824.html) 裡的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),這就開啟了自動識別功能。 ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_AutoProbe_bt_cfg0.PNG)   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]引腳。   隨便選一個例程 \SDK\boards\evkmimxrt1060\demo_apps\led_blinky 。編譯這個 led_blinky 工程(可以選擇 flexspi_nor_debug build,工程選項裡XIP_BOOT_HEADER_ENABLE=1現在可以去掉了),使用 [NXP-MCUBootUtility](https://github.com/JayHeng/NXP-MCUBootUtility) 工具將其一鍵下載進Flash中,下載完成後注意擦除掉Flash前1KB的資料(即沒有FDCB),切換啟動模式後復位板子,可以看到LED正常閃爍,說明自動識別功能生效了。 ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_AutoProbe_no_FDCB.PNG)   如果我們將MIMXRT1060-EVK上的Flash改為S26KS512SDPBHI02,這是一顆典型的1.8V HyperFlash,那麼還需要將BT_CFG2[2:0]設為 3'b010 - HyperFlash 1V8才能正常自識別。   至此,自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動痞子衡便介紹完畢了,掌聲在哪裡~~~ ### 歡迎訂閱 文章會同時釋出到我的 [部落格園主頁](https://www.cnblogs.com/henjay724/)、[CSDN主頁](https://blog.csdn.net/henjay724)、[知乎主頁](https://www.zhihu.com/people/henjay724)、[微信公眾號](http://weixin.sogou.com/weixin?type=1&query=痞子衡嵌入式) 平臺上。 微信搜尋"__痞子衡嵌入式__"或者掃描下面二維碼,就可以在手機上第一時間看了哦。 ![](http://henjay724.com/image/github/pzhMcu_qrcode_258x