大家好,我是痞子衡,是正經搞技術的痞子,今天痞子衡給大家分享的是自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動,
接著上篇文章 《了解i.MXRT1060系列ROM中串行NOR Flash啟動初始化流程優化點》 繼續聊,對于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功能設計,

二、開啟自動識別功能
Flash自動識別功能開啟位在fuse_0x450[0](或者BT_CFG[0]引腳),默認是不使能的,想要開啟這個功能需要拉高相關CFG引腳或者燒寫相應Fuse位,
fuse 0x450[0] - FLASH_AUTO_PROBE_EN,Flash自動識別功能開啟

三、自動識別依賴的配置
雖說是Flash自動識別,但其實還是依賴Fuse里一些配置的,一共有如下四處配置,BootROM會根據這四處配置去進入Flash自動識別程式從而得到一個匹配的FDCB配置塊,所以其實這個功能更準確的說法應該是FDCB自動生成,
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]引腳,
隨便選一個例程 \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主頁、知乎主頁、微信公眾號 平臺上,
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/263615.html
標籤:嵌入式

