目錄
概述
1.? 軟硬件環境
1.1 軟件開發環境
1.2 硬件環境?
2 MCU boot
2.1 核心功能
2.2???關鍵術語
?2.3 重要字段介紹
3 VS-Code下創建MCU-BOOT項目
3.1 軟件框架結構
?3.2 創建測試項目
3.3 編譯項目
3.3 固件在Flash中的分布
4 驗證?
4.1 燒寫固件
??4.2 代碼實現原理
4.3 驗證固件升級功能
概述
本文主要介紹在?Zephyr RTOS?架構下為?Nordic MCU?(如 nRF52/nRF53 系列) 構建?MCUboot?引導加載程序,需要遵循的主要步驟。包括MCU boot介紹,VS-Code下創建MCU-BOOT項目的方法,以及在nRF52840開發板上驗證該程序。
1.? 軟硬件環境
1.1 軟件開發環境
nordic提供了基于zephyr平臺sdk, 其提供了大量的demo可供開發者參考和使用,同時nordi還提供一個集成的軟件庫工具,方便開發者安裝相應的SDK和編譯工具鏈。集成環境同時包含了其他的一些軟件,非常便于進行項目開發。
軟件工具 | 功能 | 版本信息 |
nRF Connect SDK? | nordic提供基于zephyr的代碼庫 | v2.9.0? |
nRF Connect SDK Toolchain | 代碼編譯工具 | v2.9.1 |
VS-CODE | 集成開發環境 | v1.99.3? |
nRF Connect for Desktop | nordic集成工具鏈 | v5.1.0 |
nRF Connect | 手機App |
手機App下載地址:
https://nav.nordicsemi.com/search?query=nRF%20Connect
搭建編譯環境的注意點
安裝工具時,在D:\ncs\v2.9.0目錄下執行如下語句,安裝與編譯器相關的工具鏈
pip3 install --user -r scripts/requirements.txt
運行該語句后,安裝信息如下:
1.2 硬件環境?
本案例是在nRF52840開發板(nRF52-DK)上實現的,該開發板nRF52840的主要特點如下:
1)板載j-link調試接口
2)引出所有 IO接口,用戶可根據實際應用,外載其他設備
3)支持4個LED
4)支持4路Key接口
5)板載UART調試接口,方便打印調試信息
2 MCU boot
MCUboot 是一個開源的安全引導加載程序(Secure Bootloader),專為微控制器(MCU)設計,支持固件驗證、安全更新和回滾保護等功能。以下是 MCUboot 的詳細使用方法。
2.1 核心功能
安全啟動:驗證固件簽名后再執行
固件更新:支持多種更新機制
回滾保護:防止降級到不安全版本
多鏡像支持:A/B分區、升級/回滾機制
2.2???關鍵術語
Primary slot:主運行分區
Secondary slot:備用/升級分區
Image trailer:鏡像尾部的元數據區
Swap type:交換類型(測試/永久)
?2.3 重要字段介紹
以如下字段為例介紹,mcu boot 提供信息的字段解釋:
Primary image: magic=good, swap_type=0x3, copy_done=0x1, image_ok=0x1
字段解析:
magic=good
magic:? 是一個固定值(例如?0x77d4b535),用于驗證鏡像頭的有效性。
good:? ?表示該值匹配預期,說明鏡像頭部是合法的,可以被引導加載程序識別。
swap_type=0x3
表示鏡像交換(swap)的類型,常見于支持固件雙分區(A/B分區)的系統中。
0x3?可能對應某種特定的交換模式,例如:
0x1:測試鏡像(測試后回滾或確認)。
0x2:永久性交換(確認更新)。
0x3:可能是“恢復模式”或“回滾操作”
(注:具體含義需結合具體引導加載程序的實現,例如 MCUboot 的?swap_type?定義。)
copy_done=0x1
標志位,通常表示“鏡像已成功復制到目標分區”。
0x1: 表示完成,
0x0 :表示未完成。
image_ok=0x1
標志位,表示“當前鏡像已驗證且可啟動”。
0x1 :表示鏡像有效,系統可以安全啟動;
0x0 :可能表示鏡像損壞或需要回滾。
3 VS-Code下創建MCU-BOOT項目
3.1 軟件框架結構
1)?sysbuild.conf
使能和boot相關的配置信息,SB_CONFIG_BOOTLOADER_MCUBOOT=y用于使能mcuboot
SB_CONFIG_BOOTLOADER_MCUBOOT=y
SB_CONFIG_PARTITION_MANAGER=n
2) \sysbuild\mcuboot.conf
設置boot編譯選項
文件的內容如下:
CONFIG_MCUBOOT_LOG_LEVEL_INF=y
?3.2 創建測試項目
分別創建兩個測試項目,用于驗證Boot之間的跳轉
3.3 編譯項目
?完成以上配置后,就可以編譯項目,具體編譯結果如下:
上圖有3個編譯結果,其中mcuboot為bootloader的生成目錄?
3.3 固件在Flash中的分布
在nRF52840的設備樹中已經分配了固件Image的空間,其具體內容如下:
boot_partition:? mcu boot存儲的位置
slot0_partition:??image-0的地址
slot1_partition:??image-1的地址
?設備樹已經計算出了所占Flash的空間大小:
4 驗證?
4.1 燒寫固件
完成編譯后,會在Build目錄下分別生成3個編譯項目,其對應3塊固件
下面分別燒錄3塊固件,觀察MCU的運行情況
1) 擦除整塊Flash
2) 燒寫MCU boot?
?燒寫完成后,MCU會復位,串口打印如下log:
查看Flash中的數據, MCU boot已經燒寫到Flash中
3) 燒寫Image-0
串上已經輸出Image-0的log:
?查看Flash中的數據信息:
?4)燒寫Image-1
?串口終端上并沒有打印Image-1運行的log:
查看Flash中的內容:
?4.2 代碼實現原理
1)固件升級實現代碼
代碼101行: 實現固件升級功能
代碼106行: MCU復位
2)測試函數代碼
代碼第81行: 調用固件升級功能
代碼第88行: 刪除Image-1
?固件升級后,可以通過該語句刪除Image-0
4.3 驗證固件升級功能
在通過使用DK-52840上的兩個按鍵,選擇是否升級或者刪除Image-1
1) 按下button-0:
?log信息
*** Booting MCUboot v2.1.0-dev-12e5ee106034 ***
*** Using nRF Connect SDK v2.9.0-7787b2649840 ***
*** Using Zephyr OS v3.7.99-1f8f3dc29142 ***
I: Starting bootloader
I: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Secondary image: magic=good, swap_type=0x3, copy_done=0x3, image_ok=0x1
I: Boot source: none
I: Image index: 0, Swap type: perm
I: Starting swap using move algorithm.
I: Bootloader chainload address offset: 0xc000
*** Booting nRF Connect SDK v2.9.0-7787b2649840 ***
*** Using Zephyr OS v3.7.99-1f8f3dc29142 ***
Swapped application booted on nrf52840dk