簡介
雙存儲區(qū)功能是多款 STM32 微控制器的通用特性。本文檔旨在描述如何在客戶應(yīng)用中使用此功能。
本應(yīng)用筆記中涉及的主要內(nèi)容是現(xiàn)場升級,通過 X-CUBE-DBFU STM32Cube 擴展包介紹。
即時更新的主要優(yōu)點是可以最大程度地縮短切換階段的停機時間,即使在更新期間也可以執(zhí)行要求嚴(yán)苛的實時任務(wù)。
盡管本文檔僅直接描述了 STM32L0 系列 Cat5 器件、STM32L4 系列的入門系列和 USB OTG器件,以及 STM32G4 系列 Cat.3 器件,但具有兩個半獨立存儲器區(qū)的其他 STM32 微控制器也可以共享部分所述屬性并采用類似的使用方式。
存儲器子系統(tǒng)概述
STM32L0 系列使用 Cortex? M0+ 內(nèi)核。STM32L4 和 STM32G4 系列使用 Cortex? M4 內(nèi)核,并且數(shù)據(jù)總線與指令總線相互獨立。這意味著,后兩個系列器件中的 AHB 總線矩陣更為復(fù)
雜。另一個區(qū)別是 STM32L0 基于 EEPROM 技術(shù)。設(shè)計應(yīng)用程序時,務(wù)必要牢記 STM32L0的數(shù)據(jù) EEPROM 與程序 Flash 存儲器共享存儲區(qū)接口。
本文檔涵蓋的所有 MCU 均在 NVM 接口中采用了某種緩存機制,STM32L0 系列比較簡單,基于 Cortex M4 的兩個系列則采用了更為高級的 ART Accelerator?。
雙存儲區(qū)存儲器可以被配置為一個支持連續(xù)尋址的大容量 NVM 塊(少數(shù)情況例外,本文檔不作詳細(xì)介紹)。將 NVM 配置為兩個并行塊時則具有顯著優(yōu)勢,最重要的是可以一邊對其中一個存儲區(qū)執(zhí)行寫操作,一邊對另一個存儲區(qū)執(zhí)行讀操作(和取指操作)。這一點在執(zhí)行更新時尤為重要,因為無需停止從程序 NVM 中執(zhí)行代碼。
在設(shè)計使用雙存儲區(qū)器件的應(yīng)用程序時,可以選擇多種方法來使用程序存儲器的后半部分。
即時更新
即時更新也稱為即時現(xiàn)場升級,這是一種允許用戶在不干擾器件正常工作的情況下修改代碼
和配置的過程,與簡單的 IAP 解決方案相比具有更多優(yōu)勢:
使用雙存儲區(qū)時可以更新加載程序的代碼
即使加載失敗,原始代碼也仍然能夠正常運行(操作可為“原子操作”)
無需定義加載程序狀態(tài),器件始終能夠加載代碼。
本文檔通過幾個示例詳細(xì)介紹了如何在幾微秒內(nèi)將基于原始代碼的所有操作轉(zhuǎn)換為基于更新代碼的所有操作。本文檔還介紹了使用重新定位的向量表從 RAM 執(zhí)行 ISR 的情況。這是降低中斷延遲的常見解決方案,但在現(xiàn)場升級時執(zhí)行起來比較棘手。
MCU 支持的特性
微控制器中實現(xiàn)了多種機制來確保固件正常執(zhí)行,其中最重要的是能夠一邊對其中一個非易失性存儲區(qū)進行寫操作,一邊從另一個非易失性存儲區(qū)中執(zhí)行代碼。
存儲器重映射切換
微控制器中有一個控制位(在 STM32L4 和 STM32G4 系列中標(biāo)記為 FB_MODE,在STM32L0 系列中標(biāo)記為 UFB)可供用戶代碼訪問。該位位于系統(tǒng)配置寄存器中,用于控制存儲器映射和別名。此外,該位也用于雙存儲區(qū)自舉機制,如果使用時足夠謹(jǐn)慎,還可用于即時現(xiàn)場升級。
根據(jù)標(biāo)志設(shè)置,存儲區(qū) 1 或存儲區(qū) 2 被映射到以 0x0800 0000 為起始地址的區(qū)域,并在地址0x0000 0000 處設(shè)置別名。由于操作不影響 PC 和其他 CPU 寄存器,因此當(dāng)該位發(fā)生翻轉(zhuǎn)時,CPU 只會簡單地從另一個存儲區(qū)獲取下一條指令。示例代碼未鏈接到別名地址范圍,因為如果涉及系統(tǒng)存儲器中的 ST 自舉程序,別名地址將保持為 0x0000 0000。
正常情況下,兩個存儲區(qū)中的代碼均鏈接到以 0x0800 0000 為起始地址的區(qū)域。
可重新定位的中斷向量表
CPU 可以配置 IVT 的偏移量。因此,可以通過軟件定義更多的 IVT,并根據(jù)需要在它們之間進行切換。
向量表偏移量的默認(rèn)值為 0x0000 0000,通常指向程序存儲器的別名。
務(wù)必要為向量表預(yù)留足夠的空間,每個中斷向量需要 4 字節(jié)。此外,偏移地址值也存在限制,
即必須與 512 字節(jié)的倍數(shù)對齊。
用戶選項字節(jié)中的 BFB2 標(biāo)志
該標(biāo)志本質(zhì)上是用于觸發(fā)在復(fù)位時嘗試從存儲區(qū) 2 自舉。
當(dāng)存儲區(qū) 1 中不存在代碼時,務(wù)必保持 BFB2 標(biāo)志置 1,以確保在意外斷電時也可保持安全。
當(dāng) BFB2 置 1 后,將激活系統(tǒng)自舉程序以評估存儲區(qū) 2 中是否存在代碼,以便盡可能對其進行控制(詳見相關(guān)參考手冊或 AN2606)。之后,固件必須檢測到存儲區(qū) 1 的代碼被替換,且程序從存儲區(qū) 2 運行。
在該應(yīng)用程序中,只有在從存儲區(qū) 2 執(zhí)行代碼時發(fā)生意外斷電的情況下,才使用 BFB2 作為故障安全機制。當(dāng)存儲區(qū) 1 不包含有效代碼時,BFB2 必須保持置 1;當(dāng)存儲區(qū) 2 中的新代碼復(fù)制到存儲區(qū) 1 時,BFB2 清零。