天天看點

痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT上使能NOR Flash的Continuous read模式在軟複位後無法正常啟動問題的解決經驗。

  前一篇文章 《在i.MXRT啟動頭FDCB裡使能串行NOR Flash的Continuous read模式》 裡,痞子衡簡單介紹了Flash的Continuous read模式作用與意義,并且在MIMXRT1170-EVK上嘗試使能了芯成IS25WP128的Continuous read模式做了一次實踐(主要是文中第三節FDCB啟動頭的改動)。

  但其實在i.MXRT上使能Flash的Continuous read模式是有點小陷阱的,如果你在App代碼裡直接插一句 NVIC_SystemReset() 函數的調用,即對主要晶片做一次軟複位,你會發現晶片沒有從Flash正常啟動,這是因為Flash此時仍處于Continuous read模式,這種情況下BootROM有時不能正常配置讀取Flash内容去啟動App。今天痞子衡就來跟大家探讨解決這個問題。

本系列會有多篇文章,每篇文章均從一個核心切入點出發,給出一系列具體實作方案。 本系列均以MIMXRT1170-EVK闆為示例目标對象,闆載Flash型号為芯成IS25WP128(其他i.MXRT晶片和Flash型号下實作流程也差不多,需檢視對應資料手冊)。

  我們知道無法啟動問題是由于主晶片發生軟複位但Flash仍處于Continuous read模式造成的,要解決這個問題無非如下三個角度,痞子衡會在後面具體實作方案裡按這些角度全部搞一次(如果适用的話)。

一、ROM方面不做任何相關處理,但App在調用NVIC_SystemReset()做複位前将Flash先切回到Normal模式; 二、App方面不做任何相關處理,對BootROM相關配置做一些調整,讓BootROM也能正常處理處于Continuous read模式的Flash; 三、ROM和App聯合對Flash模式切換做一些特殊處理。

  本文找的核心切入點是利用Flash的硬體複位引腳。Flash的硬體複位引腳有兩種:一種是獨立的,常見于SOIC-16封裝上(這種情況下對闆級設計有要求,需要在闆級設計時将Flash複位引腳連到主晶片i.MXRT的GPIO上);另一種是複用在IO3上的,常用于SOIC-8封裝上。

  如果是獨立的複位引腳(RESET#),則主晶片GPIO直接做拉低操作即可(注意低電平持續時間的要求,詳見Flash資料手冊);如果是複用的複位引腳(RESET#/IO3),則需要先激活IO3的複位功能,然後做拉低操作。

痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#

  在IS25WP128資料手冊裡可以找到RESET#信号低電平至少需要持續1us(下表tRESET,如果RESET#低電平持續時間小于1us,也許不會影響Flash器件的複位,但不推薦),Flash進入複位後需要最大100us的恢複時間(下表tHWRST),在恢複期間内對Flash進行讀寫擦操作并不會生效,是以複位函數裡(下文3.2節裡的reset_flash_via_pin)最好保證足夠的等待時間(這樣後續代碼裡的Flash操作可靠性就得到了保證)。

痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#

  本章節描述的方法,如果是在App裡(這裡均指XIP App)完成,那麼App裡增加的相關處理代碼(注意是執行到的全部代碼)需要是 ramfunc 屬性(即運作在内部RAM裡),這樣操作Flash時可以不受限制。此外代碼運作前需要把全局中斷關掉,防止執行過程中有中斷觸發,導緻Flash裡的相關IRQHandler函數被執行。

  我們先僅從ROM單方面角度來解決問題,可以先看下痞子衡之前的舊文 《深入i.MXRT1050系列ROM中串行NOR Flash啟動初始化流程》 裡的2.1節。i.MXRT全系列ROM裡關于串行NOR Flash啟動流程大同小異。

  如果要利用ROM裡內建的Flash硬體複位功能,則Flash本身必須包含獨立的硬體RESET#引腳。本系列示例主晶片i.MXRT1170的fusemap表裡關于RESET_PIN的相關定義如下,那麼闆級設計時Flash RESET#引腳應該連接配接到GPIO4[3]或者GPIO2[8](根據fuse 0xC80[5]位而定),并且我們還要将fuse 0xC80[7]位燒寫為1。

痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#

  上一小節裡的方法先決條件是Flash要包含獨立RESET#引腳,但實際客戶項目中SOIC-8封裝的Flash選擇更多。是以我們更多應該在複用的RESET#/IO3引腳上做文章,這就要從App方面的角度來解決問題了。

  我們先從IS25WP128資料手冊看看RESET#/IO3引腳詳細功能解釋,主要如下兩點:

痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#
痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#

  是以 reset_flash_to_normal() 函數裡我們需要先設Status Register将Flash切到QE不使能的狀态(i.MXRT啟動運作App時,Flash應處于QE使能的狀态),然後再設Read Register将IO3複位功能指定為RESET#,然後拉低IO3對應的GPIO直到滿足複位最小時間要求,最後再将之前改寫的Status Register/Read Register全部恢複。過程中主要涉及如下指令:

痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#

  代碼可以基于 \SDK_2.9.1_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\flexspi\nor\polling_transfer\cm7下面的 flexspi_nor_polling_transfer.c 和 flexspi_nor_flash_ops.c,并新增如下代碼:

  為了保證上述代碼均執行在RAM裡,工程連結檔案裡(以IAR示例)需做如下改動:

  關于ROM和App聯合處理角度,在複位引腳這個切入點上并沒有什麼優勢,此處略去。

  至此,i.MXRT上使能NOR Flash的Continuous read模式在軟複位後無法正常啟動問題的解決經驗痞子衡便介紹完畢了,掌聲在哪裡~~~

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

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

痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#

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

痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#
痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#
痞子衡嵌入式:串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#

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

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

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

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

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

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