天天看點

痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗問題。

  本篇是《系統時鐘配置不當會導緻i.MXRT1xxx系列下OTFAD加密啟動失敗》 的後續篇,我們為i.MXRT1010解決了OTFAD時鐘配置限制問題後,加密的App就一定能正常跑了嗎?其實并不一定,如果你的App跟IAP有關(即會調用FlexSPI驅動去擦寫Flash),免不了會在FlexSPI驅動裡操作FlexSPI外設寄存器的軟複位位,軟複位操作方式使用不當可能會導緻App無法正常運作,今天痞子衡就來好好聊一聊這個FlexSPI複位小限制:

Note1: 雖然i.MXRT1170也包含OTFAD,但是本文中的FlexSPI複位限制問題在i.MXRT1170上并不存在。 Note2: 三位數系列i.MXRT600同樣包含OTFAD,且也受本文中的FlexSPI複位限制影響。

  從恩智浦官網下載下傳一個SDK包(痞子衡下的是v2.9.1),選擇其中 flexspi 例程 \SDK\boards\evkmimxrt1010\driver_examples\flexspi\nor\polling_transfer\ 。編譯這個 flexspi_nor_polling_transfer 工程(選擇 flexspi_nor_debug build,即XIP工程),得到可執行檔案,将其下載下傳到 MIMXRT1010-EVK 闆載Flash中離線啟動(正常模式,不加密),打開序列槽調試助手看到如下結果:

痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗

  這個結果是例程預期結果,你可能會對這個XIP build也能擦寫Flash感到奇怪,按說闆載Flash沒有RWW功能,擦寫Flash操作不能在Flash裡原地執行,但是例程的連結檔案裡已經将涉及Flash擦寫代碼的源檔案直接放在RAM裡了,是以例程是可以正常執行的。

痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗

  現在讓我們根據《系統時鐘配置不當會導緻i.MXRT1xxx系列下OTFAD加密啟動失敗》 文中操作使能OTFAD加密,将整個App空間都加密,記得要修複系統時鐘配置限制問題,這時候再離線啟動,看到序列槽調試助手沒有任何輸出,說明例程執行失敗了。檢視工程源代碼,main()函數裡第一句列印前調用了 flexspi_nor_flash_init(EXAMPLE_FLEXSPI);, 看起來OTFAD加密後這個Flash初始化函數執行不太正常。

  為了定位問題友善,我們回到不加密模式,給 flexspi_nor_polling_transfer 工程加上一些輔助調試的列印資訊,主要是FlexSPI相關API函數調用前加上列印資訊。注意:需要将如下三個源檔案也放到RAM中才能看到控制台完整輸出。

痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗

  有了輔助列印資訊,我們現在再回到OTFAD加密模式,可以看到代碼停在 FLEXSPI_UpdateLUT() 函數就沒有繼續執行下去了。本文不是為了講述如何一步步找到問題的方法,痞子衡其實知道就是 FLEXSPI_SoftwareReset() 函數惹的禍(沒有停在這個函數,是由于系統buffer的緣故),至于是什麼原因,詳見下節。

痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗

  老規矩,痞子衡直接給答案,這是OTFAD對FlexSPI外設複位的小限制,當OTFAD被使能時,如果被加密的app代碼是XIP執行,app裡利用FlexSPI->MCR0[SWRESET]位做複位時,這個swreset複位功能會同時清掉FlexSPI->INTR[KEYDONE]位,而FlexSPI的運作依賴OTFAD解析KeyBlob的結果,當FlexSPI->INTR[KEYDONE]位是0時,對Flash的AHB通路會被禁掉,故而發生CPU lockup,代碼無法繼續執行。

痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗

  FlexSPI->MCR0[SWRESET]位存在于任何一款i.MXRT晶片型号中,其功能是複位FlexSPI外設,在下面幾個場景都可以去做一次FlexSPI外設複位,不用擔心,這個外設複位并不影響FlexSPI配置寄存器裡的值。不過比較遺憾的是在此時的OTFAD加密啟動使能情形下,不能再用MCR0[SWRESET]位去做複位了 。

痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗

  很多時候FlexSPI->MCR0[SWRESET]位更多是被用來清除AHB TX/RX Buffer(尤其是在Flash擦寫之後),在i.MXRT1010 FlexSPI外設的AHBCR寄存器裡其實新增了單獨的CLRAHBTXBUF和CLRAHBRXBUF控制位,用以實作AHB TX/RX Buffer的清除。是以我們為了避免影響OTFAD加密啟動,可以使用AHBCR[CLRAHBTXBUF/CLRAHBRXBUF]位來代替MCR0[SWRESET]位去做複位。

痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗

  是以在 flexspi_nor_polling_transfer 工程裡,将FLEXSPI_SoftwareReset()函數調用全部改成如下的FLEXSPI_ClearAhbBuffer()函數調用就可以保證工程正常運作了。

  至此,FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗問題痞子衡便介紹完畢了,掌聲在哪裡~~~

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

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

痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗

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

痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗
痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗
痞子衡嵌入式:FlexSPI複位方式不當會導緻i.MXRT系列下OTFAD加密啟動失敗

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

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

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

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

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

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