什么是i.MXRT11xx上的串行NOR Flash雙程序可交替啟動?
一、什么是i.MXRT11xx上的串行NOR Flash雙程序可交替啟動
i.MXRT11xx上的串行NOR Flash雙程序可交替啟動指的是,在i.MXRT11xx芯片中集成了兩個獨立的程序存儲區(qū)域,分別存儲兩份相同的程序代碼。在系統(tǒng)啟動時,可以通過設(shè)置引腳信號或者軟件控制來選擇其中一個程序進(jìn)行啟動,從而實現(xiàn)程序的高可靠性啟動。當(dāng)其中一個程序出現(xiàn)問題時,可以通過切換到另一個程序進(jìn)行啟動,以保證設(shè)備的正常運行。而這些程序代碼存儲在串行NOR Flash中,該存儲器類型具有讀取速度快、可靠性高、使用壽命長等優(yōu)點,非常適合于嵌入式系統(tǒng)的應(yīng)用場景。
與 i.MXRT10xx 一樣,在一片掛載在 FlexSPI 上的串行 NOR Flash 里做冗余/雙程序設(shè)計就是下圖中的 image L 和 image H,不涉及 LPSPI 接口 Flash B 里的 image 2。
跟 i.MXRT10xx 上一樣的冗余程序啟動流程,i.MXRT1170 上電先啟動物理地址靠前的 image L,如果 image L 被破壞了,則繼續(xù)啟動 image H。什么是雙程序可交替啟動呢?簡單說就是物理地址靠前的 image L 并不總是上電首先啟動的 image,在 i.MXRT1170 上新增了如下原型的 image version 啟動頭(在固定偏移 0x600 處),芯片上電 BootROM 會嘗試判斷兩個 image L/H 里的 version 頭版本,高版本的 image 優(yōu)先被啟動。這種設(shè)計方便了 OTA 升級。
Note: 當(dāng) image L/H 中均不含有效 version 啟動頭時(img_ver 等于 0xFFFFFFFF,或者高低16bit不符合取反關(guān)系),雙程序可交替啟動特性就不生效,此時等效于冗余程序啟動,image L 永遠(yuǎn)被優(yōu)先啟動。
typedef struct{uint16_t version; // 版本值uint16_t inversion; // version值的取反(~version)} img_ver_t;
二、i.MXRT11xx上的串行NOR Flash雙程序可交替啟動與 i.MXRT11xx 系列雙程序啟動的差異
1、復(fù)啟動的接口外設(shè)不同
名列前茅點不同其實與本文要討論的 FlexSPI 雙程序啟動特性無關(guān),因為還是在一片掛載在 FlexSPI 上的串行 NOR Flash 里做雙程序設(shè)計,就是下圖中的 image 0 和 image 1,不涉及 Flexcomm SPI 接口 Flash B 里的 image 2(在 i.MXRT1170 上這個外設(shè)是 LPSPI)。
在介紹 i.MXRT1170 雙程序啟動一文里我們用了 image L/H 來表示 image 0/1,這里還是恢復(fù)使用 image 0/1 來表示,因為后面我們要看的 i.MXRT500/600 參考手冊啟動流程圖里就是用 image 0/1 來表達(dá)的,避免表達(dá)混亂。
2、可啟動 image 結(jié)構(gòu)不同
i.MXRT1170 上最簡易可啟動 image 結(jié)構(gòu)比較復(fù)雜(包含 FDCB、img_ver、IVT、BD、App),而 i.MXRTxxx 上就比較簡單了(僅需 FDCB、img_ver、App),但是好在兩者關(guān)于 image version 頭結(jié)構(gòu)定義以及偏移位置是完全一致的(0x600)。
typedef struct{ uint16_t version; // 版本值 uint16_t inversion; // version值的取反(~version)} img_ver_t;
此外 i.MXRT1170 上名列前茅個 FlexSPI 的 AHB 映射地址是 0x3000_0000,而 i.MXRTxxx 上名列前茅個 FlexSPI 的 AHB 映射地址是 0x0800_0000,這是系統(tǒng)設(shè)計差異,需要注意。
Note:下圖中示意地址均是 Flash 偏移地址,沒有包含 AHB 映射地址,另外這里假設(shè)第二份 image 偏移地址在 0x400000(具體是由 otp 配置值來決定的)。
3、使能雙程序啟動的otp配置地址不同
i.MXRTxxx 上關(guān)于使能雙程序啟動的 otp 配置定義與 i.MXRT1170 上是一致的,只是因為兩者 otp 空間設(shè)計不同,所以具體配置地址不同。i.MXRTxxx 上具體配置在 otp BOOT_CFG2/3 上面:
//Remap功能的ADDR_START寄存器固定設(shè)為 Flash 起始映射地址。otp 0x188[31:28] - FlexSPI remap size //App的最大長度,標(biāo)識了名列前茅份App的結(jié)束地址,該值加上ADDR_START后被填入Remap功能的ADDR_END寄存器。otp 0x18C[31:22] - Second image offset //標(biāo)識了第二份App的起始地址(在Flash中偏移位置),即填入Remap功能的ADDR_OFFSET寄存器的值。
這次我們要在 MIMXRT595-EVK 板卡上實測,這個板子 FlexSPI0 上掛了兩片 Flash,默認(rèn)連接的 64MB OctalFlash,還有一片 8MB QuadSPI Flash(需要做板子改動才能使能)。為了跟之前測試保持一致,還是借助 MCUBootUtility 工具將 Second image offset 燒錄為 0x10,F(xiàn)lexSPI remap size 保持默認(rèn) 0,即第二份 image 偏移地址在 Flash 0x400000(4MB)處,最大 image 長度也是 4MB。
4、暫存狀態(tài)的非易失寄存器有差異
i.MXRT1170 是用非易失寄存器 SRC_GPR10 其中 2bit 來記錄當(dāng)前啟動狀態(tài)的,而 i.MXRTxxx 上則復(fù)雜得多,它采用了 SYSCTL0 外設(shè)里的一個非易失寄存器的全部 32bit 來暫存啟動狀態(tài)。
// Load redundant boot options stored in specific register#define LOAD_REDUNDANT_BOOT_OPTIONS() (*(volatile uint32_t *)(SYSCTL0_BASE + 0x384))// Store redundant boot options in specific register before system reset#define SET_REDUNDANT_BOOT_OPTIONS(val) ((*(volatile uint32_t *)(SYSCTL0_BASE + 0x384)) = val)
這個 32bit 寄存器功能原型如下,它不單純是用做雙程序啟動的狀態(tài)記錄了,還糅合了 ROM API 功能。具體用法可以在芯片參考手冊 ROM API 小節(jié)找到。
typedef struct _user_app_boot_invoke_option{ union { struct { uint32_t reserved : 8; uint32_t boot_image_index : 4; uint32_t instance : 4; uint32_t boot_interface : 4; uint32_t mode : 4; uint32_t tag : 8; } B; uint32_t U; } option;} user_app_boot_invoke_option_t;
5、image 版本判斷邏輯不同
在 i.MXRT1170 上 image version 頭有效的條件一定是其高低16bit符合取反關(guān)系,而 i.MXRTxxx 上除了這個條件外,其認(rèn)定 0xFFFFFFFF 也是一個有效版本(被定為最低版本)。芯片參考手冊里有比較詳細(xì)的 version 判斷邏輯如下,這個邏輯跟 i.MXRT1170 上差異還是比較大的,i.MXRTxxx 上 BootROM 只會啟動包含有效版本號的 image,版本有效性是 image 能被啟動的一個必要條件,不像 i.MXRT1170 上版本信息只是單純用來判斷啟動順序,不作為 image 是否有效的標(biāo)準(zhǔn)。
延伸閱讀1:i.MXRT11xx是什么
i.MXRT11xx是恩智浦半導(dǎo)體(現(xiàn)在的NXP Semiconductors)推出的一款高性能、超低功耗的Cortex-M微控制器,采用Arm Cortex-M33內(nèi)核,主頻高達(dá)500 MHz,支持DSP和浮點計算,并提供了豐富的外設(shè)和接口,可廣泛應(yīng)用于工業(yè)自動化、醫(yī)療設(shè)備、智能家居、汽車等領(lǐng)域。該系列微控制器還具備低功耗、安全可靠、易用性等特點,并支持多種存儲介質(zhì)和通信協(xié)議,適應(yīng)不同的應(yīng)用場景需求。

相關(guān)推薦HOT
更多>>
在 iPad 上運行 Windows 是什么體驗?
一、在 iPad 上運行 Windows 是什么體驗?zāi)壳笆忻嫔嫌幸恍┠軌蛟?iPad 上運行 Windows 的應(yīng)用程序,例如 Parallels Access、Splash較好、VMware ...詳情>>
2023-10-14 19:14:27
vector, list, map等容器使用場合是什么?
一、vector, list, map等容器使用場合vector適用于對象簡單,變化較小,并且頻繁隨機(jī)訪問的場景。list適用經(jīng)常進(jìn)行插入和刪除并且不經(jīng)常隨機(jī)訪...詳情>>
2023-10-14 14:59:11
分庫分表的數(shù)據(jù)庫和分布式數(shù)據(jù)庫有什么區(qū)別?
一、分庫分表的數(shù)據(jù)庫和分布式數(shù)據(jù)庫有什么區(qū)別分庫分表的數(shù)據(jù)庫:沒有這種數(shù)據(jù)庫,所謂分庫分表,這是開發(fā)應(yīng)用的程序員通過自己的代碼、或者底...詳情>>
2023-10-14 13:59:18
APP定制開發(fā)的難點有哪些?
一、APP定制開發(fā)的難點1、多平臺適配不同的移動平臺(如iOS和Android)具有不同的操作系統(tǒng)、開發(fā)語言和開發(fā)工具。在進(jìn)行APP定制開發(fā)時,需要適...詳情>>
2023-10-14 12:57:35熱門推薦
TIM和QQ的區(qū)別?
沸linux系統(tǒng)中的安全設(shè)置有哪些?
熱golp是什么設(shè)備?
熱excel中的數(shù)據(jù)分析方法有哪些?
新Hbase適合存哪些數(shù)據(jù)?
高級程序設(shè)計語言的特點是什么?
路由器和交換機(jī)的區(qū)別?
什么是采購管理?
什么是聊天機(jī)器人?
什么是ai算法?
app的啟動流程都包括哪些步驟?
MySQL數(shù)據(jù)庫全局隔離級別和默認(rèn)隔離級別有什么區(qū)別?
在 iPad 上運行 Windows 是什么體驗?
Python代碼中的yield到底是什么?
技術(shù)干貨







快速通道 更多>>
-
課程介紹
點擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費用
了解課程價格 -
優(yōu)惠活動
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團(tuán)隊
了解師資團(tuán)隊 -
實戰(zhàn)項目
獲取項目源碼 -
開班地區(qū)
查看來校路線