關鍵詞:雙 Bank, 在線升級
1、前言
STM32G47x 的 Flash 可以工作在雙 bank 模式下,在該模式下對 FLASH 的操作支持RWW(Read-While-Write),在 Bank1 中可以對 Bank2 進行操作而不影響當前 Bank1 中的應用程序的運行,反之亦然。本文對雙 Bank 模式下程序在線升級進行介紹,指出操作中的注意事項。
2、雙 Bank 工作原理
STM32G47x 系列 MCU 支持 Flash 雙 Bank 功能,且芯片出廠默認配置即使能了雙 Bank功能。基于兩個獨立的 Bank,用戶可以選擇將應用程序放在任意一個 Bank 中運行,通過設置標志位 BFB2 來決定從哪一個 Bank 啟動:
BFB2 = 0,MCU 雙 Bank 啟動禁用,從 Bank1 啟動運行;
BFB2 = 1,MCU 雙 Bank 啟動使能,從 Bank2 啟動運行,若是 Bank2 中無正常程序,則檢測 Bank1 中是否有正常程序,若有則運行 Bank1 中的程序,若無則跳轉到系統 Bootloader 運行(詳見 AN2606 對應說明)。FB_MODE 反映了 Bank 的地址映射,雙 Bank 的地址映射方式如下:
FB_MODE= 0 時,Bank1 的起始地址為 0x08000000,Bank2 的起始地址為
0x08040000;FB_MODE= 1 時,Bank1 的起始地址為 0x08040000,Bank2 的起始地址為0x08000000;

在 STM32G47x 系列 MCU 中,MCU 啟動時始終是從 0x08000000 這個地址開始運行。通過地址重映射的方式,將不同的 Bank 起始地址指定到 0x08000000,所以當從 Bank2 啟動運行時,千萬不要認為 MCU 是從 0x08040000 開始運行的,MCU 依舊是從 0x08000000 這個地址開始運行,認清這點對程序在線升級時對 Flash 的擦除與燒寫特別重要。
另外基于以上地址重映射操作,在程序設計過程中,用戶也不需要對地址空間做偏移處理,完全按照單 Bank 的思路進行設計即可,但程序不能超過單 Bank 大小。
3、在線升級實現
ST 的固件庫中給出了完整單 Bank MCU 的 IAP 升級方案,基于 UART 和 Y-Modem 協議。在雙 Bank 模式下,數據傳輸層面與單 Bank 是完全一樣的,所以本文不再對 IAP 的數據傳輸方式與協議進行描述,具體可以參考 AN4045 與 Y-Modem 協議內容。
G4 系列的開發包中目前還沒有專門的 IAP 例程,直接從其他系列移植即可,比如 F3 或是L4 系列。這些例程中存在兩個工程,即 IAP 工程與APP程序工程。在 G47x 雙 Bank 模式下,是在當前 Bank 中對另一 Bank 進行操作,且由于 Flash 支持 RWW,所以不需要再將 IAP 與應用程序分開,可以合并到一起。
?以 L4 的 IAP 例程為基礎,在原 IAP 例程的基礎上,為了雙 Bank,需要修改的點如下(本文只討論程序下載,其他暫不討論):


將修改后的代碼編譯生成 bin 文件,通過 CubeProgrammer 燒錄到 0x08000000。
4、結果驗證
?MCU 運行后的通過終端串口工具(Tera Term)打印調試信息,燒錄完程序后,第一次上電的信息如下,BFB2 禁用,程序在 Bank1 中啟動。在終端中輸入 1 可以啟動程序下載,輸入 3 觸發Bank 切換,“2”忽略。

此時 MCU 將進入等待數據傳輸,并顯示“Waiting for the file to be sent ... (press 'a' to abort)”,用戶在 Tera Term 通過以下的菜單選擇目標 bin 文件,并啟動傳輸。


5、小結
本文簡單介紹了雙 Bank 的工作原理與雙 Bank 進行在線 IAP 時應該注意的問題和需要添加的代碼,并對最終運行的結果進行了驗證。
? ? ? ? ? ? ? ??
? THE END
▽點擊“閱讀原文”,可下載原文檔