代码拉取:git clone https://gitcode.com/u012988644/stm32u5-sbsfu-release.git
一:修改 LED 引脚并通过 Loader OTA 升级
修改 LED2 引脚为 PC7:
原工程 LED2 默认引脚与 NUCLEO-U575ZI-Q 板载 LED2(绿灯,PC7)不符,在SBSFU_Appli_NonSecure中修改引脚定义:
// 将 LED2 引脚改为 PC7#defineLED2_PinGPIO_PIN_7#defineLED2_GPIO_PortGPIOC#defineLED2_CLK_ENABLE()__HAL_RCC_GPIOC_CLK_ENABLE()修改完成后重新编译SBSFU_Appli(S + NS 子工程),生成新的签名镜像。
进入 Loader 模式:
- 按住开发板 User 按键(蓝色按键)不松
- 按下复位按钮后松开,等待串口输出 Loader 菜单:
====================================================================== = (C) COPYRIGHT 2021 STMicroelectronics = = = = LOCAL LOADER = ====================================================================== ================ New Fw Image ============================ Reset to trigger Installation ------------------------- 1 Download App Image ------------------------------------ 2通过 Ymodem 更新固件:
- 串口工具选择菜单项
2,进入固件下载等待状态 - 使用支持 Ymodem 协议的串口工具(如 Tera Term:
File→Transfer→YMODEM→Send)发送编译产物中签名后的镜像文件:
SBSFU_Appli/Binary/sbsfu_app_sign.bin注意:发送的必须是经
postbuild.sh签名打包后的.bin,不能直接发送原始.elf。
- 传输完成后输入
2,开发板自动复位,BL2 验证新镜像签名通过后跳转启动,输入2, LED2(PC7)正常亮灭了。✅
=================== Main Menu ============================ Test Protections -------------------------------------- 1 Toggle Secure LED ------------------------------------- 2 Selection :关于MCUBOOT_PRIMARY_ONLY与 App 菜单选项 3
App 菜单只有选项 1 和 2,选项 3(New Fw Image)被编译宏屏蔽:
// SBSFU_Appli/NonSecure/Src/main.c#if!defined(MCUBOOT_PRIMARY_ONLY)printf(" New Fw Image ------------------------------------------ 3\r\n\n");#endifMCUBOOT_PRIMARY_ONLY的含义
MCUBoot 支持两种 Flash 槽布局:
| 模式 | Flash 布局 | 升级方式 |
|---|---|---|
| 默认(双槽) | Primary slot(运行) + Secondary slot(暂存) | App 内下载到 Secondary,BL2 负责 swap/overwrite 到 Primary |
MCUBOOT_PRIMARY_ONLY(单槽) | 只有 Primary slot | 直接写入 Primary,无槽交换 |
本工程启用了MCUBOOT_PRIMARY_ONLY,因此:
- 没有 Secondary slot,节省约一半 Flash 空间
- BL2 不做槽交换,启动流程更简单
- App 内的固件下载功能(选项 3 及整个
fw_update_app.c)被#if !defined(MCUBOOT_PRIMARY_ONLY)整体编译掉 - 升级只能通过 Loader 模式:按住 User 键复位进入 Loader,由 Loader 直接将新固件写入 Primary slot,BL2 验证签名后启动
二:开启双槽模式,开放 App 内 OTA 升级(菜单选项 3)
背景:
原工程启用了MCUBOOT_PRIMARY_ONLY,导致 App 菜单选项 3(New Fw Image)被编译宏整体屏蔽,只能通过 Loader 模式升级固件。注释掉该宏后切换为双槽 overwrite 模式,App 内即可直接通过 Ymodem 下载新固件。
修改Linker/flash_layout.h:
// 注释掉 MCUBOOT_PRIMARY_ONLY,切换为双槽模式/* #define MCUBOOT_PRIMARY_ONLY */MCUBOOT_OVERWRITE_ONLY保持不变,组合为双槽 overwrite 模式:
- Primary slot:运行当前固件
- Secondary slot:接收新固件
- BL2 直接用 Secondary 覆盖 Primary,无需 swap/confirm 机制
Flash 空间变化:
去掉MCUBOOT_PRIMARY_ONLY后,FLASH_NS_PARTITION_SIZE从 1.25 MB 缩减到 640 KB(需为 Secondary slot 留出空间):
// flash_layout.h#if!defined(MCUBOOT_PRIMARY_ONLY)#defineFLASH_NS_PARTITION_SIZE(0xA0000)/* 640 KB,双槽各一份 */#else#defineFLASH_NS_PARTITION_SIZE(0x140000)/* 1.25 MB,单槽独占 */#endifSTM32U575 Flash 共 2 MB,空间分配验证:
| 区域 | 大小 |
|---|---|
| BL2 | ~128 KB |
| Loader | ~40 KB |
| Primary slot(S 24KB + NS 640KB) | 664 KB |
| Secondary slot(S 24KB + NS 640KB) | 664 KB |
| 合计 | ~1496 KB ✅ |
重新编译与烧录:
依次编译:SBSFU_Boot → SBSFU_Appli(S + NS)→ SBSFU_Loader
重新烧录:
regression.sh → SBSFU_UPDATE.sh升级流程(App 内 OTA):
启动后 App 菜单新增选项 3:
=================== Main Menu ============================ Test Protections -------------------------------------- 1 Toggle Secure LED ------------------------------------- 2 New Fw Image ------------------------------------------ 3 Selection :选择3进入固件下载子菜单,选择2通过 Ymodem 发送签名镜像,下载完成后复位,BL2 验证并覆盖安装新固件。