天天看點

痞子衡嵌入式:深扒i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合。

  在串行 NOR Flash 熱啟動過程中(非首次上電複位,而是單純系統軟複位 NVIC_SystemReset),有很多場景下均需要先複位一下 Flash ,将其恢複到預設的 Normal 模式,然後 Flash 才能被i.MXRT BootROM 正常啟動。

  《了解i.MXRTxxx系列ROM中靈活的串行NOR Flash啟動硬複位引腳選擇》 一文裡介紹的硬複位 Flash 的方法适用包含獨立 RESET# 引腳的 Flash,但很多 Flash 型号并不包含這個專用引腳(尤其是 SOIC-8 封裝),有沒有一種更通用的複位 Flash 方法呢?當然是有的,《串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之SW Reset》 一文裡介紹了一種利用 Flash 裡普遍支援的 SW Reset 軟複位指令的方法,并在使用者應用程式裡給出了示例代碼。

  我們知道大部分早期 i.MXRT1xxx 型号 BootROM 裡并沒有內建 Flash SW Reset 功能,需要使用者代碼裡去內建這個 Flash SW Reset 指令功能,這有點不友善,是以在更新的 i.MXRTxxx 系列型号 BootROM 裡就內建了這個 Flash SW Reset 軟複位功能。今天痞子衡就介紹下這個功能在 BootROM 裡實作細節:

備注1:本文主角是i.MXRT500/600,但内容也基本适用i.MXRT1160/1170。 備注2:本文主要适用普通四線 QSPI NOR 或者八線 Octal Flash

  關于 i.MXRT 系列的串行 NOR Flash 啟動初始化流程,痞子衡一共寫過三篇文章,這些文章雖針對早期 i.MXRT1xxx 系列型号寫的,但内容基本也适用 i.MXRTxxx 系列型号,後續更新的 i.MXRT 型号在這個方面特性隻會微調和增強。

《深入i.MXRT1050系列ROM中串行NOR Flash啟動初始化流程》 《了解i.MXRT1060系列ROM中串行NOR Flash啟動初始化流程優化點》 《自識别特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動》

  為了讓大家對 i.MXRTxxx 系列串行 NOR Flash 啟動初始化流程有明确概念,痞子衡重畫了相應啟動流程圖,從流程上來看,其和 i.MXRT1060 最主要的差異就是三處步驟Y,這是最核心的改進點,也是本文主題。除此以外,還有一些微小差異(步驟7的位置調整)。

痞子衡嵌入式:深扒i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合

  BootROM 中 Flash SW Reset 功能是通過 flexspi_nor_restore_spi_protocol() 函數實作的(關于它的原型可以在 i.MXRT1170 SDK\middleware\mcu-boot\src\drivers\flexspi_nor\flexspi_nor_flash.c 檔案裡找到),這個函數一共被調用兩次,一次是在 Auto Probe 流程裡(見 flexspi_nor_flash.c 檔案裡的 flexspi_nor_get_config() 函數實作,這個過程使用者無需參與);另一次是在主流程裡(見如下代碼),主流程裡的調用才是使用者可以參與控制的:

  其中 flashRunCtx.B.restore_sequence 取值跟 Flash 型号有關, kRestoreSequence_Send_66_99 适用 QSPI NOR,比如華邦的 W25Q64(下圖裡 SW Reset 指令有 SPI 模式和 QPI 模式兩種,但 BootROM 隻用 QPI SDR 這種):

痞子衡嵌入式:深扒i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合

  kRestoreSequence_Send_66_99 也适用 Micron 的 OctalFlash,如 MT35X 系列(下圖裡 SW Reset 指令有 SPI 模式和 OPI 模式兩種,但 BootROM 隻用 OPI SDR 這種):

痞子衡嵌入式:深扒i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合

  kRestoreSequence_Send_6699_9966 适用旺宏的 Octal Flash,比如 MX25UM51345(下圖裡 SW Reset 指令有 SPI 模式和 OPI 模式兩類,但 BootROM 隻用 OPI 這類,不過 SDR/DTR 都支援):

痞子衡嵌入式:深扒i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合

  上一節代碼中的 flash_run_context_t 結構體變量 flashRunCtx 是使用者程式跟 BootROM 溝通的關鍵,這個變量需要存在一個晶片系統軟複位不清除的區域,BootROM 代碼裡選擇了如下非易失性通用寄存器:

  使用者有兩種方式将 flashRunCtx 值傳遞給 BootROM,一是在應用程式代碼裡加入如下代碼,主動将值寫進指定的通用寄存器,這種方式比較靈活,flashRunCtx 設定可根據實際應用情況任意調整。

  第二種方式是利用啟動頭 FDCB,在 flexspi_nor_config_t.flashStateCtx 裡儲存的就是 flashRunCtx,每一次 BootROM 啟動都會将 FDCB 裡的 flashStateCtx 寫入指定的通用寄存器,這種方式相對來說不夠靈活,适用明确的場景。

  Flash 的 SPI 模式和 QPI/OPI 模式常常是互斥的,同一時間僅能一種模式工作。Flash 上電預設是 SPI 模式,需要發送特殊的 QPIEN 指令或者配置一些内部寄存器才能進入 QPI 或者 OPI模式,一旦進了 QPI/OPI 模式,需要被複位回 SPI 模式才能被 BootROM 正常啟動。

  比如在 MIMXRT595-EVK 闆卡上,SDK 裡 FDCB 啟動頭使能了預設闆載 Octal Flash - MX25UM51435 的 OPI DDR 模式,是以我們需要在應用程式系統初始化裡插入如下代碼:

  《串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之SW Reset》 一文裡的問題,可通過如下新方案實作(基于 MIMXRT1170-EVK 闆卡):

  大部分 Flash 都支援進入 Deep Power Down 模式(通過 B9H 指令進入),這種模式适合一些對功耗要求敏感的裝置,比如智能手表。在 Deep Power Down 模式下,Flash 不再響應讀寫擦指令,需要接受 Release Deep Power Down 指令(同時也是 Read Device ID指令)才能被再次喚醒正常工作,某些 QSPI NOR 以及 OctalFlash 下也支援 SW Reset 指令來喚醒退出低功耗模式,這時候也可以根據實際情況利用 BootROM 裡內建的 SW Reset 功能。

痞子衡嵌入式:深扒i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合

  至此,i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合痞子衡便介紹完畢了,掌聲在哪裡~~~

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

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

痞子衡嵌入式:深扒i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合

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

痞子衡嵌入式:深扒i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合
痞子衡嵌入式:深扒i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合
痞子衡嵌入式:深扒i.MXRTxxx系列ROM中內建的串行NOR Flash啟動SW Reset功能及其應用場合

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

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

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

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

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

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