痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啟動那些事(1)- Boot簡介



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1xxx系列MCU的BootROM功能簡介

  截止目前(2019年12月)為止i.MX RT1xxx系列已公布的芯片有七款i.MXRT105x, i.MXRT1021, i.MXRT106x,i.MXRT1015, i.MXRT1064 SIP, i.MXRT1011, i.MXRT117x,所以本文的研究對象便是這七款芯片,從參考手冊來看,這七款芯片的BootROM功能差別雖有,但總體是一個架構,所以一篇文章可以概括這七款芯片的BootROM特性。

一、Boot基本原理

1.1 從內部FLASH啟動

  Boot是任何一款MCU都有的特性。提及Boot,首先應該聯想到的是FLASH,通常Cortex-M微控制器芯片內部一般都會集成FLASH(從FLASH分類上來看應該屬於Parallel NOR FLASH),你的Application代碼都是保存在FLASH里,每次上電CPU會自動從FLASH里獲取Application代碼並執行,這個行為就是Boot
  大家都知道,ARM Cortex-M內存使用的是統一編址,32bit總線的地址空間是4GB (0x00000000 - 0xFFFFFFFF)。打開最新的Arm®v6/7/8-M Architecture Reference Manual手冊找到如下system address map表,你會發現ARM已經將這4GB空間內容給初步規划好了,各ARM Cortex-M微控制器廠商在設計芯片時一般都會遵守ARM規定。

  從上述system address map表中我們可以知道,ARM 4GB空間的前512MB(0x00000000 - 0x1FFFFFFF)規划為非易失性存儲器空間。看到這,你是不是明白了為啥各大廠商生產的Cortex-M芯片內部FLASH地址總是從0x0開始,因為僅含FLASH的芯片上電啟動默認都是從0x0地址開始獲取Application的初始PC和SP開始Boot。

1.2 BootROM是什么

  大家是不是也會經常在芯片參考手冊里看到BootROM的字眼,BootROM是什么?BootROM其實是芯片在出廠前固化在ROM里的一段Bootloader程序。這個Bootloader程序可以幫助你完成FLASH里的Application的更新,而不需要使用額外的外部編程/調試器(比如JLink),除了Application更新之外,當然BootROM也可以完成Application的啟動,Bootloader一般提供UART/SPI/I2C/USB接口與上位機進行通信,與Bootloader配套使用的還有一個上位機軟件,當芯片從BootROM啟動后,通過這個上位機軟件與BootROM建立連接,然后可以將你的Application代碼(bin/s19/hex格式)下載進芯片FLASH。
  BootROM並不是每一款MCU都有的。以恩智浦Kinetis系列MCU為例,早期的Kinetis產品比如MKL25並不含ROM,第一款支持ROM的Kinetis芯片是2014年推出的MKL03,而恩智浦的LPC系列以及意法半導體的STM32系列MCU一般都是含ROM的。不同廠商芯片的ROM起始地址可能不一樣(Kinetis ROM一般從0x1c000000開始,LPC ROM一般從0x03000000開始,STM32 ROM結束地址是0x1FFFFFFF)。

1.3 Boot Mode選擇

  當芯片既有ROM也有FLASH的時候,便會出現Boot位置選擇問題,標准術語稱為Boot Mode。芯片上電CPU到底是先從FLASH啟動還是先從ROM啟動?關於這個問題,各芯片廠商的解決方案不一樣
  Kinetis的Boot Mode由FLASH偏移地址0x40d處的值(上電系統會自動將這個值加載到FTFx_FOPT寄存器中)以及NMI pin共同決定。LPC的Boot Mode由ISP[1:0]以及VBUS pins決定。STM32的Boot Mode由BOOT[1:0] pins決定。
  下圖為MK80的具體Boot Mode:


  下圖為LPC54114的具體Boot Mode:

  下圖為STM32F407的具體Boot Mode:

1.4 從內部SRAM啟動

  SRAM存在於任何一款MCU中,它除了可以保存Application數據變量外,當然也可以存放Application代碼以供CPU執行。但是SRAM是易失性存儲器,存放的數據斷電會丟失,所以從SRAM啟動跟從FLASH/ROM啟動性質不一樣。
  從FLASH/ROM啟動屬於一級啟動,不依賴除了Boot Mode選擇之外的條件;而從SRAM啟動屬於二級啟動,其需要借助裸芯片本身之外的外力引導一下才能完成。外力引導的方式有兩種:一是借助於外部調試器,直接將Application下載進SRAM並將PC指向Application開始執行,其實這就是所謂的在SRAM調試;二是借助於事先存儲在FLASH/ROM中的Bootloader程序,Bootloader會將存放在FLASH(或其他非易失性存儲器,或者從上位機直接接收)中的Application先加載到SRAM里然后Jump過去執行。

1.5 從外部存儲器啟動

  有些MCU並沒有內部FLASH,所以會支持外接存儲器,常見的外部存儲器有QSPI NOR/NAND, SD/eMMC, SDRAM, Parallel NOR/NAND, SPI/I2C EEPROM等,MCU內部集成相應的存儲器接口控制器,通過接口控制器可以輕松訪問這些外部存儲器。一個沒有內部FLASH的MCU肯定會有ROM(BootROM),因為必須要借助BootROM才能Boot存儲在外部存儲器的Application,所以從外部存儲器啟動也屬於二級啟動
  那么怎么理解從外部存儲器啟動?需要弄明白以下幾個問題:
  第一個問題:從外部NOR FLASH存儲器啟動(比如QSPI NOR/Parallel NOR/EEPROM)跟從內部FLASH啟動有什么區別?最大的區別是從外部NOR FLASH啟動本質上屬於二級啟動,其無法像內部FLASH那樣直接啟動,需要由Bootloader引導。即使技術上可以做到存儲在外部NOR FLASH里的Application能夠原地執行(XIP),但也需要Bootloader完成外部NOR FLASH的初始化以及XIP相關配置。
  第二個問題:從外部NAND FLASH存儲器啟動(比如QSPI NAND/Parallel NAND/SD/eMMC)跟從NOR FLASH啟動有什么區別?最大的區別是NAND FLASH無法像NOR FLASH那樣可以XIP執行,這是由NAND FLASH原理決定的,因為NAND FLASH是按Page訪問的並且允許壞塊的存在,這意味着CPU無法直接從NAND FLASH取指和執行,必須先由Bootloader將存放在NAND FLASH中的Application先全部拷貝到內部SRAM中,然后從SRAM啟動執行。
  第三個問題:從外部SDRAM存儲器啟動跟從內部SRAM啟動有什么區別?這里其實區別倒不大,兩個都是易失性存儲器,都無法直接啟動,不過SRAM是直接掛在系統bus上,而SDRAM是掛在存儲器接口控制器上,而后者需要Bootloader去做初始化。

二、i.MXRT1xxx Boot方式

  在第一部分里講了Boot基本原理以及各種Boot方式,那么i.MXRT1xxx Boot到底屬於哪一種?在回答這個問題之前我們先看一下i.MXRT105x的system memory map(其他i.MXRT1xxx也類似,區別是BootROM/ITCM/DTCM/OCRAM的size不同)。

  從memory map里可以看到,i.MXRT1xxx支持存儲類型一共有三種:一是96KB的ROM(即BootROM)、二是總容量512KB的FlexRAM(OCRAM/DTCM/ITCM)、三是分配給外部存儲器接口控制器(SEMC/QSPI)的2GB區域。看到這里你應該明白了,i.MXRT1xxx Boot方式主要是借助BootROM從外部存儲器加載Application到內部SRAM/外擴RAM/原地XIP執行
  那么i.MXRT1xxx到底支持從哪些外部非易失性存儲器加載啟動呢?翻看i.MXRT1xxx的參考手冊里的System Boot章節,可以看到i.MXRT啟動支持以下7種外部存儲器:

  • Serial(Multi-IO) NOR Flash via FlexSPI
  • Serial(Multi-IO) NAND Flash via FlexSPI
  • Parallel NOR Flash via SEMC
  • SLC Raw NAND Flash via SEMC
  • SD Card via uSDHC
  • eMMC Card via uSDHC
  • Serial(1-bit SPI) NOR/EEPROM via LPSPI

  除了外部非易失性存儲器之外,i.MXRT加載啟動還支持以下2種外部易失性存儲器:

  • SDRAM via SEMC
  • HyperRAM via FlexSPI

  上述非易失性存儲器中Serial/Parallel NOR這兩種Device可以XIP,其他5種Device無法XIP,需要拷貝到內部RAM或外接SDRAM/HyperRAM里運行。關於具體如何從這7種Device啟動,痞子衡會在下篇文章繼續聊。

三、i.MXRT1xxx Boot差異

  痞子衡在文章一開始說了,i.MXRT1xxx七款芯片BootROM功能是有差異的,這個差異主要體現在啟動設備類型支持上,下面痞子衡用一個表格總結差異:

芯片 Serial NOR Serial NAND Parallel NOR SLC Raw NAND SD Card eMMC Card 1-bit SPI NOR SDRAM HyperRAM
i.MXRT117x 支持 支持 - 支持 支持 支持 支持 支持 支持
i.MXRT1064 支持 - - - 支持 支持 支持 支持 支持
i.MXRT106x 支持 支持 支持 支持 支持 支持 支持 支持 支持
i.MXRT105x 支持 支持 支持 支持 支持 支持 支持 支持 支持
i.MXRT1021 支持 支持 支持 支持 支持 支持 支持 支持 支持
i.MXRT1015 支持 支持 - - - - 支持 - 支持
i.MXRT1011 支持 - - - - - - - 支持

  至此,恩智浦i.MX RT1xxx系列MCU的BootROM功能痞子衡便介紹完畢了,掌聲在哪里~~~

歡迎訂閱

文章會同時發布到我的 博客園主頁CSDN主頁微信公眾號 平台上。

微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM