無論是什麼晶片裡的BootROM,其最核心的功能無非兩個:一、從存放Application的存儲器中加載執行;二、通過支援的通信接口接收來自Host的Application資料完成更新,是以Boot配置也主要圍繞這兩個核心功能。今天痞子衡就來重點聊一聊i.MXRT1xxx Boot方式具體由哪些配置決定的。
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1xxx系列MCU的Boot配置。
在上一篇文章 Boot簡介 裡痞子衡為大家介紹了Boot基本原理以及i.MXRT1xxx Boot方式簡介。今天痞子衡就來重點聊一聊i.MXRT1xxx Boot方式具體由哪些配置決定的。
無論是什麼晶片裡的BootROM,其最核心的功能無非兩個:一、從存放Application的存儲器中加載執行;二、通過支援的通信接口接收來自Host的Application資料完成更新,是以Boot配置也主要圍繞這兩個核心功能。
一、Boot行為模式選擇
BOOT_MODE[1:0] pin是決定i.MXRT1xxx Boot行為的最頂層配置,但是與上一篇文章裡介紹的Kinetis/LPC/STM32 Boot Mode配置不同的是,i.MXRT1xxx上電永遠是從ROM裡開始啟動,此處的BOOT_MODE[1:0]決定的僅是BootROM程式的不同行為模式(執行代碼分支),而Kinetis/LPC/STM32 Boot Mode側重的是決定CPU從ROM還是FLASH裡啟動。
1.1 BOOT_MODE[1:0] Pinout
下表是BOOT_MODE相關pinout資訊,可在參考手冊的External Signals and Pin Multiplexing章節中找到。
i.MXRT117x pinout:

i.MXRT105x / i.MXRT106x / i.MXRT1064 pinout:

i.MXRT102x / i.MXRT1015 pinout:

i.MXRT1011 pinout:

1.2 BMOD[1:0]三種模式
BOOT_MODE[1:0] pin狀态是在POR_B pin上沿時被自動采樣存儲在晶片内部的寄存器SRC->SBMR2[25:24]中的,這兩個bit也叫BMOD[1:0],BootROM其實是根據BMOD[1:0]的值來決定Boot行為的。(注意:如果改變了BOOT_MODE[1:0] pins的輸入狀态而使用ONOFF pin(RESET_B)去軟複位,Boot行為并不會改變,因為BMOD[1:0]值并未改變)。
從上述Boot MODE pin settings表中我們可以知道,除了BMOD[1:0]=2'b11這種情況是reserved之外,其餘三種情況對應三種Boot行為,痞子衡為大家逐一分析,先從最簡單的行為模式(Serial Downloader)說起。
1.2.1 Serial Downloader模式(UART/USB-HID)
Serial Downloader模式顧名思義即串行下載下傳模式,在這種模式下,BootROM通過指定的USB或者UART口來接收來自Host(恩智浦提供了上位機工具sdphost.exe或者mfgtool或者MCUBootUtility)的Application資料,并将資料存儲在SRAM中執行,這種模式其實就是從SRAM啟動,但是如果用這種模式去Boot Application缺點很明顯,每次上電都需要将Application重新下載下傳進SRAM,無法做到脫機自動Boot,是以顯然這種模式的主要目的并不是從SRAM啟動Application,那它到底有什麼用?
其實Serial Downloader模式主要是用來從SRAM中啟動Flashloader,恩智浦官方提供了Flashloader程式,Flashloader程式可以用來将你的Application下載下傳進i.MXRT1xxx支援的所有外部非易失性存儲器中,為後續從外部存儲器啟動做準備。除此以外Serial Downloader模式還可以用來檢視Fuse值。
關于Serial Downloader模式以及Flashloader具體如何應用,痞子衡會在下一篇文章裡進一步介紹。
1.2.2 Boot From Fuses模式
Boot From Fuses模式從名字來看其實會讓人誤解,這個模式并不是從Fuse裡加載Application啟動的意思,而是根據Fuse裡的一些Boot配置值來決定從哪個外部存儲器Boot。Fuse是i.MXRT1xxx裡一塊特殊的存儲區域,用于存放全部晶片配置資訊,其中有一部配置設定置資訊和Boot相關。
在參考手冊Fusemap這一章節,可以看到完整的Fuse Map表,其中偏移0x460處的32bit配置資料的bit4是BT_FUSE_SEL,這個bit至關重要,決定了Boot From Fuses模式的主要行為,具體表現如下:
- BT_FUSE_SEL=0:表明所有外部存儲器中均沒有Application,此時Boot From Fuses模式等同于Serial Downloader模式。
- BT_FUSE_SEL=1:表明有外部存儲器中存在有效Application,此時BootROM會根據Fuse中其他Boot配置資訊進一步選擇指定的外部存儲器(Boot Device)去Boot。
關于Fuse中其他Boot配置資訊,文章後面痞子衡會繼續講。
1.2.3 Internal Boot模式(Serial NOR/NAND、Parallel NOR/NAND、SD/eMMC、1bit Recovery SPI NOR)
Internal Boot模式其實跟Boot From Fuses模式(BT_FUSE_SEL=1時)很類似,隻是這個模式下BT_FUSE_SEL的意義有點不同,具體表現如下:
- BT_FUSE_SEL=0:BootROM根據BOOT_CFG[x:0] pins和Fuse中Boot配置綜合決定Boot Device,其中BOOT_CFG[x:0] pins的配置會覆寫Fuse中意義相同的Boot配置資訊。
- BT_FUSE_SEL=1:BootROM完全根據Fuse中Boot配置資訊選擇指定的Boot Device去Boot。
我們可以通過更改BOOT_CFG[x:0] pins輸入狀态來切換Boot配置,這部分Boot配置在Fuse裡也同樣存在,但是使用BOOT_CFG[x:0]來更改Boot配置顯然比燒寫Fuse更友善快捷(也可以認為BOOT_CFG[x:0]主要用于産品開發過程中,待産品開發結束後,應直接用Fuse來鎖定Boot配置)。關于BOOT_CFG[x:0] pin具體提供哪些Boot配置,文章後面痞子衡會繼續講。
二、Boot Device類型選擇
前面痞子衡講了,無論是Boot From Fuses模式還是Internal Boot模式,最終目的都是為了選擇合适的Boot Device加載啟動,那麼Boot Device到底如何确定?主要取決于BOOT_CFG[x:0] pin以及Fuse裡的BOOT_CFG1位。
BOOT_CFG[x:0] pin(在RT105x/RT106x上是12bit,在RT102x上是10bit)跟Boot Device選擇相關的是BOOT_CFG[7:4]這4個bit,對應Fuse裡是偏移0x450處32bit配置資料裡的bit4-7(也叫BOOT_CFG1[7:4]),本小節主要介紹的是BOOT_CFG1[7:4]。
2.1 BOOT_CFG[x:0] Pinout
下表是BOOT_CFG相關pinout資訊,可在參考手冊的External Signals and Pin Multiplexing章節中找到。



2.2 BOOT_CFG1[7:4]六種Device
BOOT_CFG1[7:4]用于選擇具體Boot Device,無論是RT105x/RT106x還是RT102x,它們支援的外部存儲器種類是一樣的,但是這裡的具體配置值兩個晶片上稍稍有些差別(主要是SD和SEMC NAND不一樣)。
下表是BOOT_CFG1[7:4]具體配置值資訊,可在參考手冊的Fusemap章節中找到。
i.MXRT117x device selection:
i.MXRT1064 device selection:
i.MXRT105x / i.MXRT106x device selection:
i.MXRT102x device selection:
i.MXRT1015 device selection:
三、Boot Device具體配置
當Boot Device已經确定之後,底下就是配置該Device具體屬性了。假設我們選擇了Serial NOR FLASH,但是Serial NOR隻是一類FLASH的統稱,市面上有非常多的Serial NOR晶片,每個晶片特性可能不完全一樣,那麼BootROM怎麼知道這些不同的Serial NOR晶片的特性呢?還是通過BOOT_CFG[x:0] pin和Fuse來指定。
3.1 BOOT_CFG[x:0]
BOOT_CFG[x:0] pin其實是跟Fuse裡是偏移0x450處32bit配置資料裡的bit0-x是對應的。
- BOOT_CFG[7:0] pin對應的是Fuse BOOT_CFG1[7:0]
- BOOT_CFG[x:8] pin對應的是Fuse BOOT_CFG2[x-8:0]
前面講過BOOT_CFG1[7:4]是用來确定Boot Device類型的,其餘bit就是用來配置目前選擇的Boot Device的具體資訊,是以不同的Boot Device,這些bit的意義是不一樣的。具體在Fuse裡統一介紹。
3.2 eFUSE map
前面講過,Fuse是i.MXRT1xxx裡一塊特殊的存儲區域,用于存放全部晶片配置資訊,其中有一部分區域配置設定給Boot。參考手冊的Fusemap章節中可見所有bit具體定義,這裡痞子衡僅貼出一部分用于示例:
從上表中我們可以看到i.MXRT105x上BOOT_CFG1,BOOT_CFG2共16bit的完整定義,除了BOOT_CFG1[7:4]前面已經介紹過之外,從其餘bit的定義來看,确實是與具體Boot Device屬性相關的。
這些Boot相關的Fuse定義,在這裡逐一解釋意義不大,需要結合具體Boot Device一起來看,痞子衡後續會在介紹每個Boot Device啟動的文章裡再進一步分析。
至此,恩智浦i.MX RT1xxx系列MCU的Boot配置痞子衡便介紹完畢了,掌聲在哪裡~~~
歡迎訂閱
文章會同時釋出到我的 部落格園首頁、CSDN首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。