一、 引言
FLASH SWAP 是 NXP MCX A 系列微控制器中的一項核心功能,目的在支持安全可靠的Image管理。通過在內部 Flash 空間中分配兩個分區來存儲兩個Image映像 (Image A 和 Image B),在升級過程中,新版本的 Image 可以寫入未使用的區塊,然後通過交換操作使新版本的Image生效,達到線上即時更新的效果。
此功能主要提供以下優勢:
1. 安全的 Image 更新:允許用戶在運行系統的同時更新 Image,保留原有的 Image。
2. 可靠的回退機制 :如果更新後的新版本 Image 無法正常啟動,系統會自動切回原來版本的 Image。
3. 完整性校驗 :每次啟動的 Image 均經過驗證,防止因損壞的數據導致系統故障。
本文旨在介紹如何啟動 MCX A 微控制器的 Flash SWAP 功能,這是一項有助於 Image 升級和存儲管理的功能。Flash SWAP 允許系統在執行應用程序的同時進行 Image 的更新,從而實現無縫升級,避免了因更新而讓系統中斷的情況。
二、Flash SWAP原理介紹
Flash SWAP 的運作原理基於交替使用 Flash 的兩個區塊(區塊 0 和區塊 1)。當系統運行於一個區塊(例如區塊 0)時,另一個區塊(區塊 1)處於閒置的狀態,可以用來寫入新的 Image。
以下是 Flash SWAP 的Image更新流程:

1. 系統首先從預設的區塊(例如區塊 0)啟動並運行。此時,區塊 1 處於閒置的狀態。
2. 當需要進行 Image 升級時,新版本的 Image 寫入原本閒置的區塊(區塊 1)。在寫入過程中,區塊 0 保留正常運行應用程序。
3. 在新的 Image 寫入並驗證成功後,MCU 通過設置 SWAP 控制寄存器進行交換操作,使區塊 1 成為新的運行區塊。
4. 系統重啟後,MCU 將從區塊 1 啟動並運行新的 Image,原先的區塊 0 則成為閒置狀態,等待下一次更新。
這種交替使用 Flash 區塊的機制,確保了系統在升級過程中始終有一個穩定的 Image 版本可供運行,從而最大限度地降低了升級失敗導致系統無法運行的風險。
三、MCX A 的 Flash SWAP

上圖為 MCX A 系列 Flash SWAP 功能的流程圖,描述了 Image 更新和交換(Swap)的操作邏輯,以下是流程介紹 :
1. Enter Flash Swap
系統進入 Flash SWAP 模式,此步驟通常是由用戶應用程序或 Bootloader 啟動,用於執行Image交換操作。
2. Swap Enabled on IFR0 ?
檢查 IFR0(Information Flash Region 0) 中是否啟用了 Flash SWAP 功能。如果有啟用,進一步進行 Image 交換檢查。反之,則流程結束。
3. Get Swap Image Offset & Size
提取 Swap Image 的起始偏移地址和大小,此步驟確保系統能知道 Swap Image 的位置以及存儲區域的配置。
4. Swap Image Has Version ?
檢查 Swap Image 是否包含版本信息(通常存儲於 Flash Configuration Block,FCB)。如果有版本信息,下一步會與當前 Image 比較,反之,則禁用 Flash SWAP,退出流程。
5. Newer Version
檢查 Swap Image 的版本號是否高於當前運行的 Image 版本,如果 Swap Image 較新,下一步會檢查程式完整性。反之,則禁用 Flash SWAP,退出流程。
6. Integrity Check Swap Image
驗證 Swap Image 的完整性,通常會計算並校驗 Swap Image的校驗碼 (Checksum) 或 Hash 值。如果驗證成功,進一步配置硬體,反之,則禁用 Flash SWAP,退出流程。
7. Program Corresponding Registers
配置相關的硬體寄存器以準備執行 SWAP 操作,此步驟通常會進行 Flash 控制寄存器配置,設置系統將 Swap Image 作為下一次啟動的有效 Image。
8. Enable Swap
啟用 SWAP 功能,硬體執行 Flash 區域的交換(例如:Swap Image 替代當前運行 Image)。
9. Exit Flash Swap with Status
根據執行結果退出 Flash SWAP 流程,此時可能會返回執行狀態(成功或失敗)供用戶應用程序記錄或處理。
接著,我們進行 Flash SWAP 功能實作。
四、Flash SWAP 功能實作
我們利用 FRDM-MCXA153 開發板,搭配 SDK 中 led_blinky 範例,透過讀取 Image Version (0x24h) 信息,改變 LED 的顏色輸出,藉此驗證 Flash Swap 功能。
以下是驗證環境
1. FRDM-MCXA153 開發板

2. MCUXpresso IDE V11.10.0_3148

3. MCUXpresso Secure Provisioning V8

4. led_blinky 範例 ( 使用 FRDM-MCXA153 SDK 2.16.000 )

接著進行程式調整。
1. 利用 ConfigTools -> Pins,新增 LED_GREEN 腳位 (P3_13)


2. 在 main.c 中,定義一個 bool (此處名稱為 systick_irq),讓 systick 進入中斷時,改變變數內容,藉此改變 LED 狀態

3. 在 main 函式中,初始化 LED_GREEN 腳位

4. 在 main 函式中,定義一個變數 (此處名稱以 image_version 為例),保存 Image Version (位址 0x24) 的內容

5. 當 systick_irq 等於 true 時,系統會依據讀取的 image_version 決定哪個 LED 會閃爍 ( Image Version = 1 時,LED 閃爍紅色,Image Version = 2 時,LED 閃爍綠色 )

6. 修改完成,我們編譯專案,再透過 Binary Utilities 將 axf 檔案轉成 bin 檔

完成後,接著透過 MCUXpresso Secure Provisioning Tool 進行燒錄與功能驗證
7. 讓 FRDM-MCUX153 進入 ISP 模式,請在斷電模式下,先按住 EVB的 SW2 再上電

8. 開啟 MCUXpresso Secure Provisioning Tool,依造下列步驟建立 Workspace


9. 請依下列步驟,建立第一組 Image ( Image Version = 1 ),燒錄在 0x00000000 的位址

Step 1 : 選取 Led 專案轉出的 bin 檔案
Step 2 : Boot 欄位中,選取 Plain with CRC
Step 3 : Image Version 填 “1”
Step 4 : 點選 Dual Image Boot
Step 5 : 點選 Target dual boot image 與 Image 1 size 內容與上述內容一致
Step 6 : 完成後,選取 Build image 建立 Image Version = 1 的燒錄檔
10. 依下列步驟,燒錄第一組 Image

Step 1 : 選取 Write Image 欄位
Step 2 : 選取 UART 欄位,確認 UART 的PORT 與您的環境一致,Baud rate 為 115200
Step 3 : 確認後,選取 Write image 開始燒錄
11. 燒錄完成後,重置 FRDM-MCXA153 開發板,此時可以看到開發板上的紅燈持續閃爍,代表 Image Version 1 正在運行

再來,我們建立第二組 Image
12. 讓 FRDM-MCUX153 進入 ISP 模式,斷電模式下,先按住 EVB上的 SW2 再上電

13. 請依下列步驟,建立第二組 Image ( Image Version = 2 )

Step 1 : 選取 Build Image 欄位
Step 2 : 將 Image Version 的值修改為 2
Step 3 : 完成後,選取 Build image 建立 Image Version = 2 的燒錄檔,燒錄在 0x00010000 的位址
14. 選取 Tools -> Flash Programmer

15. 請依下列步驟,燒錄第二組 Image

Step 1、Step 2 : 載入 Image Version = 2 的 Bin 檔
Step 3 : 將 Address 調整為上述內容
Step 4 : 選取 Auto erase、Auto verify
Step 5 : 選取 Write 開始燒錄
16. 燒錄完成後,重置 FRDM-MCXA153 開發板,此時可以看到開發板上的綠燈持續閃爍,代表 Image Version 2 正在運行,因兩個 Image 的燒錄位址不同,也代表著 Flash SWAP 的功能有順利的切換

五、總結
MCX A 系列的 Flash SWAP 功能是一種強大而方便的工具,能夠幫助開發者實現 Image 的無縫升級。在操作過程中,請確保嚴格按照步驟進行,並充分考慮數據的完整性和安全性,以達到最佳效果。