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 工程與應用程序工程。在 G47x 雙 Bank 模式下,是在當前 Bank 中對另一 Bank 進行操作,由於 Flash 支持 RWW,所以不需要再將 IAP 與應用程序分開,可以合併到一起。
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 工程與應用程序工程。在 G47x 雙 Bank 模式下,是在當前 Bank 中對另一 Bank 進行操作,由於 Flash 支持 RWW,所以不需要再將 IAP 與應用程序分開,可以合併到一起。
以 L4 的 IAP 例程為基礎,在原 IAP 例程的基礎上,為了雙 Bank,需要修改的點如下(本文只討論程序下載,其他暫不討論):
#將要進行擦除燒錄的Flash的起始地址固定為 : 0x08040000
#添加Bank判斷函數
#添加Page判斷函數
#修改FLASH_IF_Erase(uint32_t start)函數如下 :
#將修改後的代碼編譯生成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 文件,並啟動傳輸。
傳輸完成後,將顯示燒錄成功的信息。
此時可以輸入 3 進行 Bank 切換,切換成功後將顯示結果如下,切換到 Bank2 中運行。
5 : 小結
本文簡單介紹了雙 Bank 的工作原理與基於雙 Bank 進行在線 IAP 時應該注意的問題和需要添加的代碼,並對最終運行的結果進行了驗證。
評論