• 資料介紹
    • 簡(jiǎn)介
    • 存儲(chǔ)器子系統(tǒng)概述
    • 即時(shí)更新
    • MCU 支持的特性
  • 資料預(yù)覽
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

AN4767 雙存儲(chǔ)區(qū) STM32 微控制器的即時(shí)固件更新

01/06 15:22
843
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

AN4767 雙存儲(chǔ)區(qū) STM32 微控制器的即時(shí)固件更新

427.38 KB

簡(jiǎn)介

雙存儲(chǔ)區(qū)功能是多款 STM32 微控制器的通用特性。本文檔旨在描述如何在客戶應(yīng)用中使用此功能。

本應(yīng)用筆記中涉及的主要內(nèi)容是現(xiàn)場(chǎng)升級(jí),通過 X-CUBE-DBFU STM32Cube 擴(kuò)展包介紹。

即時(shí)更新的主要優(yōu)點(diǎn)是可以最大程度地縮短切換階段的停機(jī)時(shí)間,即使在更新期間也可以執(zhí)行要求嚴(yán)苛的實(shí)時(shí)任務(wù)。

盡管本文檔僅直接描述了 STM32L0 系列 Cat5 器件、STM32L4 系列的入門系列和 USB OTG器件,以及 STM32G4 系列 Cat.3 器件,但具有兩個(gè)半獨(dú)立存儲(chǔ)器區(qū)的其他 STM32 微控制器也可以共享部分所述屬性并采用類似的使用方式。

存儲(chǔ)器子系統(tǒng)概述

STM32L0 系列使用 Cortex? M0+ 內(nèi)核。STM32L4 和 STM32G4 系列使用 Cortex? M4 內(nèi)核,并且數(shù)據(jù)總線與指令總線相互獨(dú)立。這意味著,后兩個(gè)系列器件中的 AHB 總線矩陣更為復(fù)

雜。另一個(gè)區(qū)別是 STM32L0 基于 EEPROM 技術(shù)。設(shè)計(jì)應(yīng)用程序時(shí),務(wù)必要牢記 STM32L0的數(shù)據(jù) EEPROM 與程序 Flash 存儲(chǔ)器共享存儲(chǔ)區(qū)接口。

本文檔涵蓋的所有 MCU 均在 NVM 接口中采用了某種緩存機(jī)制,STM32L0 系列比較簡(jiǎn)單,基于 Cortex M4 的兩個(gè)系列則采用了更為高級(jí)的 ART Accelerator?。

雙存儲(chǔ)區(qū)存儲(chǔ)器可以被配置為一個(gè)支持連續(xù)尋址的大容量 NVM 塊(少數(shù)情況例外,本文檔不作詳細(xì)介紹)。將 NVM 配置為兩個(gè)并行塊時(shí)則具有顯著優(yōu)勢(shì),最重要的是可以一邊對(duì)其中一個(gè)存儲(chǔ)區(qū)執(zhí)行寫操作,一邊對(duì)另一個(gè)存儲(chǔ)區(qū)執(zhí)行讀操作(和取指操作)。這一點(diǎn)在執(zhí)行更新時(shí)尤為重要,因?yàn)闊o需停止從程序 NVM 中執(zhí)行代碼。

在設(shè)計(jì)使用雙存儲(chǔ)區(qū)器件的應(yīng)用程序時(shí),可以選擇多種方法來使用程序存儲(chǔ)器的后半部分。

即時(shí)更新

即時(shí)更新也稱為即時(shí)現(xiàn)場(chǎng)升級(jí),這是一種允許用戶在不干擾器件正常工作的情況下修改代碼

和配置的過程,與簡(jiǎn)單的 IAP 解決方案相比具有更多優(yōu)勢(shì):

使用雙存儲(chǔ)區(qū)時(shí)可以更新加載程序的代碼

即使加載失敗,原始代碼也仍然能夠正常運(yùn)行(操作可為“原子操作”)

無需定義加載程序狀態(tài),器件始終能夠加載代碼。

本文檔通過幾個(gè)示例詳細(xì)介紹了如何在幾微秒內(nèi)將基于原始代碼的所有操作轉(zhuǎn)換為基于更新代碼的所有操作。本文檔還介紹了使用重新定位的向量表從 RAM 執(zhí)行 ISR 的情況。這是降低中斷延遲的常見解決方案,但在現(xiàn)場(chǎng)升級(jí)時(shí)執(zhí)行起來比較棘手。

MCU 支持的特性

微控制器中實(shí)現(xiàn)了多種機(jī)制來確保固件正常執(zhí)行,其中最重要的是能夠一邊對(duì)其中一個(gè)非易失性存儲(chǔ)區(qū)進(jìn)行寫操作,一邊從另一個(gè)非易失性存儲(chǔ)區(qū)中執(zhí)行代碼。

存儲(chǔ)器重映射切換

微控制器中有一個(gè)控制位(在 STM32L4 和 STM32G4 系列中標(biāo)記為 FB_MODE,在STM32L0 系列中標(biāo)記為 UFB)可供用戶代碼訪問。該位位于系統(tǒng)配置寄存器中,用于控制存儲(chǔ)器映射和別名。此外,該位也用于雙存儲(chǔ)區(qū)自舉機(jī)制,如果使用時(shí)足夠謹(jǐn)慎,還可用于即時(shí)現(xiàn)場(chǎng)升級(jí)。

根據(jù)標(biāo)志設(shè)置,存儲(chǔ)區(qū) 1 或存儲(chǔ)區(qū) 2 被映射到以 0x0800 0000 為起始地址的區(qū)域,并在地址0x0000 0000 處設(shè)置別名。由于操作不影響 PC 和其他 CPU 寄存器,因此當(dāng)該位發(fā)生翻轉(zhuǎn)時(shí),CPU 只會(huì)簡(jiǎn)單地從另一個(gè)存儲(chǔ)區(qū)獲取下一條指令。示例代碼未鏈接到別名地址范圍,因?yàn)槿绻婕跋到y(tǒng)存儲(chǔ)器中的 ST 自舉程序,別名地址將保持為 0x0000 0000。

正常情況下,兩個(gè)存儲(chǔ)區(qū)中的代碼均鏈接到以 0x0800 0000 為起始地址的區(qū)域。

可重新定位的中斷向量表

CPU 可以配置 IVT 的偏移量。因此,可以通過軟件定義更多的 IVT,并根據(jù)需要在它們之間進(jìn)行切換。

向量表偏移量的默認(rèn)值為 0x0000 0000,通常指向程序存儲(chǔ)器的別名。

務(wù)必要為向量表預(yù)留足夠的空間,每個(gè)中斷向量需要 4 字節(jié)。此外,偏移地址值也存在限制,

即必須與 512 字節(jié)的倍數(shù)對(duì)齊。

用戶選項(xiàng)字節(jié)中的 BFB2 標(biāo)志

該標(biāo)志本質(zhì)上是用于觸發(fā)在復(fù)位時(shí)嘗試從存儲(chǔ)區(qū) 2 自舉。

當(dāng)存儲(chǔ)區(qū) 1 中不存在代碼時(shí),務(wù)必保持 BFB2 標(biāo)志置 1,以確保在意外斷電時(shí)也可保持安全。

當(dāng) BFB2 置 1 后,將激活系統(tǒng)自舉程序以評(píng)估存儲(chǔ)區(qū) 2 中是否存在代碼,以便盡可能對(duì)其進(jìn)行控制(詳見相關(guān)參考手冊(cè)或 AN2606)。之后,固件必須檢測(cè)到存儲(chǔ)區(qū) 1 的代碼被替換,且程序從存儲(chǔ)區(qū) 2 運(yùn)行。

在該應(yīng)用程序中,只有在從存儲(chǔ)區(qū) 2 執(zhí)行代碼時(shí)發(fā)生意外斷電的情況下,才使用 BFB2 作為故障安全機(jī)制。當(dāng)存儲(chǔ)區(qū) 1 不包含有效代碼時(shí),BFB2 必須保持置 1;當(dāng)存儲(chǔ)區(qū) 2 中的新代碼復(fù)制到存儲(chǔ)區(qū) 1 時(shí),BFB2 清零。

資料預(yù)覽

相關(guān)推薦