天天看點

痞子衡嵌入式:解鎖i.MXRTxxx上FlexSPI子產品自帶的位址重映射(Remap)功能

前段時間痞子衡寫了一篇文章 《利用i.MXRT1060,1010上新增的FlexSPI位址重映射(Remap)功能可安全OTA》,介紹了Remap功能在OTA設計中的重要性。如果你對比過i.MXRT三位數(RT500/600)和四位數(RT1xxx)的FlexSPI子產品,你會發現它們是一樣的,寄存器定義幾乎完全一緻。但是我們知道這兩個系列又分别是來自不同平台(LPC/i.MX),i.MXRT三位數可沒有i.MXRT四位數上用于存放Remap控制的IOMUXC_GPR子產品,那麼在i.MXRT500/600上到底有沒有Remap功能呢?本文痞子衡将為你解答。

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT三位數系列隐藏的FlexSPI Remap功能。

  前段時間痞子衡寫了一篇文章 《利用i.MXRT1060,1010上新增的FlexSPI位址重映射(Remap)功能可安全OTA》,介紹了Remap功能在OTA設計中的重要性。如果你對比過i.MXRT三位數(RT500/600)和四位數(RT1xxx)的FlexSPI子產品,你會發現它們是一樣的,寄存器定義幾乎完全一緻。但是我們知道這兩個系列又分别是來自不同平台(LPC/i.MX),i.MXRT三位數可沒有i.MXRT四位數上用于存放Remap控制的IOMUXC_GPR子產品,那麼在i.MXRT500/600上到底有沒有Remap功能呢?本文痞子衡将為你解答。

  老規矩還是先看一下FlexSPI在i.MXRT三位數上的系統映射空間。因為核心架構的差異,配置設定的映射位址與i.MXRT1xxx上完全不同。

  i.MXRT500中配置設定給FlexSPI的系統映射空間如下,兩個FlexSPI各配置設定了128MB。

痞子衡嵌入式:解鎖i.MXRTxxx上FlexSPI子產品自帶的位址重映射(Remap)功能

  i.MXRT600中配置設定給FlexSPI的系統映射空間如下,一個FlexSPI配置設定了128MB。

痞子衡嵌入式:解鎖i.MXRTxxx上FlexSPI子產品自帶的位址重映射(Remap)功能

  目前我們已經可以從恩智浦官網下載下傳到i.MXRT600的SDK軟體包和參考手冊,i.MXRT500的資料暫時還沒有公布。對于i.MXRT600,無論是在SDK軟體包中的頭檔案還是在參考手冊中搜尋“Remap”關鍵字,都搜不到任何資訊,莫非是沒有Remap功能?

  好了,痞子衡就不賣關子了,其實Remap功能是支援的,而且直接做到了FlexSPI子產品裡,控制寄存器也在FlexSPI裡,就在FLEXSPI BASE位址偏移0x420的地方(子產品有更新,但文檔暫時沒有同步更新):

  因為Remap控制嵌在FlexSPI子產品寄存器裡,是以對于有兩個FlexSPI子產品的i.MXRT500,Remap控制也有兩組,互相獨立,這點跟同樣有兩個FlexSPI子產品的i.MXRT1060上Remap設計是不一樣的。

  雖然i.MXRT500/600上的Remap控制嵌在FlexSPI子產品内部,但Remap設計依然是屬于系統架構層面的,隻是在AHB總線層面做一個位址重定向。下面是Remap控制寄存器:

Remap功能

對應控制寄存器

寄存器名

寄存器位址

ADDR_START

HADDRSTART

FLEXSPI_BASE + 0x420

ADDR_END

HADDREND

FLEXSPI_BASE + 0x424

ADDR_OFFSET

HADDROFFSET

FLEXSPI_BASE + 0x428

  Remap設計很簡單,就是位址(addr)落在[ADDR_START, ADDR_END]裡的AHB讀通路,其實際通路到的是addr + ADDR_OFFSET位置處的資料。(注意ADDR_START, ADDR_END, ADDR_OFFSET都是4KB對齊的)

痞子衡嵌入式:解鎖i.MXRTxxx上FlexSPI子產品自帶的位址重映射(Remap)功能

  Remap功能及寄存器定義上基本跟i.MX1xxx保持一緻,但有一個小差別,就是HADDRSTART寄存器的bit0同時也承擔了Remap功能開關控制。

痞子衡嵌入式:解鎖i.MXRTxxx上FlexSPI子產品自帶的位址重映射(Remap)功能

  啟用Remap功能後,調用FlexSPI NOR驅動函數去擦寫Flash不會受影響,擦寫Flash操作正常走的是FlexSPI IPG指令方式,資料沒有經過AHB bus。

  下面這段測試代碼是在MIMXRT500-EVK上跑的,用ROM API驅動擦寫0x08100000位址,擦寫操作前加了一段Remap設定幹擾,實測下來Remap設定對擦寫沒有任何影響,複位後去讀Flash,操作的還是原0x08100000位址。

  Remap寄存器因為在FlexSPI子產品中,是以Remap設定代碼要在FlexSPI子產品初始化之後,僅有子產品時鐘被開啟,子產品寄存器才能正常指派,否則不生效(實測時鐘不打開,讀寫Remap寄存器永遠是0,并且不産生HardFault)。

  最後再簡單說一下第4節示例代碼裡一點讓人疑惑的地方,我們是在MIMXRT500-EVK上做的測試,i.MXRT500有兩個FlexSPI(0/1),Flash是連在FlexSPI0上,但是ROM API裡的instance傳參竟然需要是1(i.MXRT1060 ROM API的FLEXSPI0傳參就是0),這是怎麼回事?

  下面是i.MXRT500 BootROM中根據instance擷取FLEXSPI子產品基址的函數代碼,其是根據i.MXRT500頭檔案中FLEXSPI_BASE_PTRS定義來擷取基址值的。

  而BootROM中用的i.MXRT500頭檔案中FLEXSPI_BASE_PTRS定義如下所示,有點奇怪,跟正式SDK裡的定義不一緻。其實也可以了解,BootROM是晶片設計階段的産物,那時候頭檔案是初版,後期有變化也正常。

  至此,i.MXRT三位數系列隐藏的FlexSPI Remap功能痞子衡便介紹完畢了,掌聲在哪裡~~~

文章會同時釋出到我的 部落格園首頁、CSDN首頁、知乎首頁、微信公衆号 平台上。

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

痞子衡嵌入式:解鎖i.MXRTxxx上FlexSPI子產品自帶的位址重映射(Remap)功能

  最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。

痞子衡嵌入式:解鎖i.MXRTxxx上FlexSPI子產品自帶的位址重映射(Remap)功能
痞子衡嵌入式:解鎖i.MXRTxxx上FlexSPI子產品自帶的位址重映射(Remap)功能
痞子衡嵌入式:解鎖i.MXRTxxx上FlexSPI子產品自帶的位址重映射(Remap)功能

  衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。

  專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/

  與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]

  可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。

  關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。

  痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。