1. 程式人生 > >痞子衡嵌入式:瞭解i.MXRT1060系列ROM中序列NOR Flash啟動初始化流程優化點

痞子衡嵌入式:瞭解i.MXRT1060系列ROM中序列NOR Flash啟動初始化流程優化點

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是**i.MXRT1060系列ROM中序列NOR Flash啟動初始化流程優化點**。   前段時間痞子衡寫了一篇 [《深入i.MXRT1050系列ROM中序列NOR Flash啟動初始化流程》](https://www.cnblogs.com/henjay724/p/14086265.html),那篇文章如果你認真讀,你會發現為了能讓i.MXRT系列儘可能地支援來自不同廠商的不同序列NOR Flash型號,而且還得發揮Flash最好效能,BootROM可謂煞費苦心,做了很多精心設計。   i.MXRT1060是在i.MXRT1050之後釋出的,相比i.MXRT1050在FlexSPI NOR啟動初始化上有了一些優化點,今天痞子衡就跟大家聊一聊這些優化點(或者說差異的地方): > * 備註:本文主角是i.MXRT1060,但內容也基本適用i.MXRT1170,僅細節微小差別。 ### 一、整體初始化流程   跟上一篇文章一樣,痞子衡重畫了i.MXRT1060的FlexSPI NOR啟動流程圖,從流程上來看,其和i.MXRT1050有兩處主要差異,第一個是步驟0(冗餘App啟動支援)和步驟X(Auto Probe),除此以外,還有一些微小差異(JEDEC硬體復位,延時等待策略等)。 ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_InitFlexSPI_overall.PNG) ### 二、初始化流程差異   本文不會介紹步驟X(Auto Probe特性),主要是說一下其他差異,步驟X是個特別重要的改進,痞子衡會另起一文單獨介紹。 #### 2.1 冗餘App啟動   第一個要提的便是新增的冗餘App啟動支援,即步驟0,痞子衡之前寫過一篇文章 [《利用i.MXRT1060,1010上新增的FlexSPI地址重對映(Remap)功能可安全OTA》](https://www.cnblogs.com/henjay724/p/13510275.html),這篇文章的第二節講了i.MXRT1060上多了一個Remap功能,這個功能使得Flash裡可以存放多份相同連結地址的XIP App(偏移0x0處固定放App1;偏移0x100000處(這個地址使用者自定義)放了App2),藉助Remap功能可以將Flash裡App2在記憶體對映地址上直接覆蓋到App1處,不需要物理上的實際搬移。 ```text fuse 0x6e0[15:13] - xSPI_FLASH_IMAGE_SIZE,第二份App的實際位置,即填入Remap功能的ADDR_END暫存器的值。 fuse 0x6e0[23:16] - FLEXSPI_NOR_SEC_IMAGE_OFFSET,第二份App的實際大小,即填入Remap功能的ADDR_OFFSET暫存器的值。 ``` ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_InitFlexSPI_fusemap_remap_v2.png)   BootROM中支援冗餘App啟動,並不是常見的OTA用意,而是防App誤損壞導致裝置無法啟動,因此App1固定在偏移0x0地址,App2永遠是覆蓋App1,這意味著App2必須跟App1一樣都是包含FDCB, IVT, BootData等完整啟動頭的App。BootROM上電永遠先嚐試啟動App1,如App1無法啟動,則嘗試啟動App2。我們知道,多份App都損壞是小概率事件。 > * 備註1:這個功能在i.MXRT1010上同樣存在,畢竟i.MXRT1010支援Remap。 > * 備註2:這個功能雖存在於i.MXRT1170上,但步驟移到了FlexSPI第二次初始化之後。 #### 2.2 延時等待策略   在i.MXRT1050 FlexSPI NOR啟動初始化步驟4裡的善後工作裡,有一個藉助呼叫microseconds_delay()做延時以使FlexSPI外設以及Flash完全準備好的操作,這個操作在i.MXRT1060上被從步驟4移到了步驟1前後,即復位Flash前做一次,復位Flash後再做一次。 > * 備註1: 復位Flash前的那一次延時操作,實際hold time要減去3ms(如hold time設定小於3ms,則只減3ms),因為復位Flash前屬於系統上電啟動,ROM本身執行到開始訪問Flash就需要時間,所以Flash差不多有近3ms的上電等待時間了。 > * 備註2: hold time在fuse中的位置從i.MXRT1050上的0x450[3:2]被移到了i.MXRT1060上的0x6e0[5:4]。 ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_InitFlexSPI_fusemap_hold_time.PNG) #### 2.3 JEDEC標準復位   i.MXRT1060在復位Flash上多了一個JEDEC標準的硬體復位選項,也包含在步驟1裡面,這個復位僅針對Adesto ATXP系列為代表的Flash有效,需要Flash本身支援JEDEC制定的硬體復位功能。 ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_InitFlexSPI_fusemap_jedec_reset.PNG) ![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_InitFlexSPI_adesto_jedec_reset.PNG)   至此,i.MXRT1060系列ROM中序列NOR Flash啟動初始化流程優化點痞子衡便介紹完畢了,掌聲在哪裡~~~ ### 歡迎訂閱 文章會同時釋出到我的 [部落格園主頁](https://www.cnblogs.com/henjay724/)、[CSDN主頁](https://blog.csdn.net/henjay724)、[知乎主頁](https://www.zhihu.com/people/henjay724)、[微信公眾號](http://weixin.sogou.com/weixin?type=1&query=痞子衡嵌入式) 平臺上。 微信搜尋"__痞子衡嵌入式__"或者掃描下面二維碼,就可以在手機上第一時間看了哦。 ![](http://henjay724.com/image/github/pzhMcu_qrcode_258x