你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們介紹的是飛思卡爾i.MX RTyyyy系列MCU的Boot配置。html
在上一篇文章 Boot簡介 裏痞子衡爲你們介紹了Boot基本原理以及i.MXRTyyyy Boot方式簡介。今天痞子衡就來重點聊一聊i.MXRTyyyy Boot方式具體由哪些配置決定的。工具
不管是什麼芯片裏的BootROM,其最核心的功能無非兩個:1、從存放Application的存儲器中加載執行;2、經過支持的通訊接口接收來自Host的Application數據完成更新,因此Boot配置也主要圍繞這兩個核心功能。htm
BOOT_MODE[1:0] pin是決定i.MXRTyyyy Boot行爲的最頂層配置,可是與上一篇文章裏介紹的Kinetis/LPC/STM32 Boot Mode配置不一樣的是,i.MXRTyyyy上電永遠是從ROM裏開始啓動,此處的BOOT_MODE[1:0]決定的僅是BootROM程序的不一樣行爲模式(執行代碼分支),而Kinetis/LPC/STM32 Boot Mode側重的是決定CPU從ROM仍是FLASH裏啓動。blog
下表是BOOT_MODE相關pinout信息,可在參考手冊的External Signals and Pin Multiplexing章節中找到。
i.MXRT105x / i.MXRT106x pinout:
接口
i.MXRT102x pinout:
ip
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)提及。開發
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.MXRTyyyy支持的全部外部非易失性存儲器中,爲後續從外部存儲器啓動作準備。除此之外Serial Downloader模式還能夠用來查看Fuse值。
關於Serial Downloader模式以及Flashloader具體如何應用,痞子衡會在下一篇文章裏進一步介紹。get
Boot From Fuses模式從名字來看其實會讓人誤解,這個模式並非從Fuse里加載Application啓動的意思,而是根據Fuse裏的一些Boot配置值來決定從哪一個外部存儲器Boot。Fuse是i.MXRTyyyy裏一塊特殊的存儲區域,用於存放所有芯片配置信息,其中有一部分配置信息和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配置信息,文章後面痞子衡會繼續講。it
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 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]。
下表是BOOT_CFG相關pinout信息,可在參考手冊的External Signals and Pin Multiplexing章節中找到。
i.MXRT105x / i.MXRT106x pinout:
i.MXRT102x pinout:
BOOT_CFG1[7:4]用於選擇具體Boot Device,不管是RT105x/RT106x仍是RT102x,它們支持的外部存儲器種類是同樣的,可是這裏的具體配置值兩個芯片上稍稍有些區別(主要是SD和SEMC NAND不同)。
下表是BOOT_CFG1[7:4]具體配置值信息,可在參考手冊的Fusemap章節中找到。
i.MXRT105x / i.MXRT106x device selection:
i.MXRT102x device selection:
當Boot Device已經肯定以後,底下就是配置該Device具體屬性了。假設咱們選擇了Serial NOR FLASH,可是Serial NOR只是一類FLASH的統稱,市面上有很是多的Serial NOR芯片,每一個芯片特性可能不徹底同樣,那麼BootROM怎麼知道這些不一樣的Serial NOR芯片的特性呢?仍是經過BOOT_CFG[x:0] pin和Fuse來指定。
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裏統一介紹。
前面講過,Fuse是i.MXRTyyyy裏一塊特殊的存儲區域,用於存放所有芯片配置信息,其中有一部分區域分配給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 RTyyyy系列MCU的Boot配置痞子衡便介紹完畢了,掌聲在哪裏~~~