摘要
本文是意法半导体(ST)把 STM32CubeMX 生成工程移植进 SBSFU 的分步指南:工程配置、存储器映射、硬件适配与调试技巧。
以 NUCLEO-L476RG 的 applications 目录里 SBSFU 2_Images 示例为准;其他 SBSFU 示例与 STM32 目标也可参照。
本文不是 SBSFU 入门。需要先熟悉 SBSFU。更多信息见原文 Related links。
引言
X-CUBE-SBSFU 是安全框架,提供:
- 安全引导加载模块
- 安全固件更新模块
- Secure engine 模块(管理安全服务)
- 密钥管理服务模块(L4、WL)
移植前先建好用户应用。本文用一个简单的 STM32CubeMX 工程:每 1 秒翻转板载绿色 LED(PA5),并经连 STLINK 的 USART2 打印 "Hello World"。
重要: 用 STM32CubeMX 生成工程时,须在工程配置中启用 “Generate under root”。该设置会影响生成工程结构及工程与构建脚本使用的相对路径。
撰写本文时的系统配置:
- Python:v3.12.3
- STM32CubeIDE v2.2.0
- X-CUBE-SBSFU v2.8.0
- STM32CubeMX v6.18.1
- STM32CubeCTL v1.1.18
硬件使用 NUCLEO-L476。
1. 用户应用配置
使用 2_Images 示例与 NUCLEO-L476 板:
x-cube-sbsfu-v2-8-0/STM32CubeExpansion_SBSFU_V2.8.0/Projects/NUCLEO-L476RG/Applications/2_Images
- 将用户应用 SBSFU_user_application 复制到 2_Images 文件夹
- 导入到 STM32CubeIDE:File → STM32 Project Create/Import → STM32CubeMX/STM32CubeIDE Project → Next
- 工程路径:上述 2_Images 路径
2. SBSFU 总体流程
构建或烧录须按特定顺序。
右键图中高亮的 STM32CubeIDE 图标,选择 Build project:
- 先构建 2_Images_SECoreBin
- 再构建 2_Images_SBSFU
- 用 STM32CubeIDE 烧录 SBSFU.elf
- 构建用户应用,在 2_Images_UserApp/Binary 下生成 UserApp.sfb
- 用 Tera Term 将用户应用上传到器件
为便于开发,可先禁用全部安全特性,基本功能验证后再启用。打开 2_Images_SBSFU/APP/app_sfu.h,取消注释:
#define SECBOOT_DISABLE_SECURITY
安装 Python 包,进入:
.../Middlewares/ST/STM32_Secure_Engine/Utilities/KeysAndImages
在 PowerShell 中运行:
pip3 install -r requirements.txt.
3. 用户应用编译器配置
- 为 SBSFU_user_application 配置 include paths(properties → C/C++ build → settings → MCU GCC compiler → include paths):
../../../2_Images_SBSFU/SBSFU/App../../../Linker_Common/STM32CubeIDE../../../2_Images_SECoreBin/Inc../../../../../../../Middlewares/ST/STM32_Secure_Engine/Core
- MCU GCC compiler → Miscellaneous → Other flags 增加:
-Wno-format -Wno-strict-aliasing - MCU GCC Linker → library → Library search path 增加:
../../../2_Images_SBSFU/STM32CubeIDE/Debug(以便检测到 postbuild.sh 生成的se_interface_app.ld) - Build steps → Post-Build:
arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "../${BuildArtifactFileBaseName}.bin" && arm-none-eabi-size "${BuildArtifactFileName}" && "../../2_Images_SECoreBin/STM32CubeIDE/postbuild.sh" "./" "${BuildArtifactFileBaseName}.elf" "../${BuildArtifactFileBaseName}.bin" "1" "1"
点击 Apply and close。
4. Flash 存储器适配
用户应用要链接并跑在 SBSFU 应用槽,不能留在默认地址 0x08000000。以 2_Images/UserApp 为参考,把它的链接脚本 STM32L476RGTx.ld 内容拷进 CubeMX 生成应用的链接脚本,再改存储器区域、向量表位置、段与 RAM/栈。
5. 用户应用软件配置
用 STM32CubeMX 生成时建议打开 IWDG——SBSFU bootloader 会配它。主循环里要定期喂狗,或者按自己的方案关掉。
- 在
main()最顶部、HAL_Init()之前复位 RCC/时钟状态(HAL_RCC_DeInit()或 RCC 复位序列) - 将
SCB->VTOR设为应用实际向量表地址(链接脚本符号,如INTVECT_START/g_pfnVectors) - 反初始化 SBSFU 已用外设,尤其 UART:在
MX_USART2_UART_Init()前调用HAL_UART_DeInit() - 喂狗:
HAL_IWDG_Refresh()或WRITE_REG(IWDG->KR, IWDG_KEY_RELOAD);若看门狗已在运行,勿再按 CubeMX 生成路径重新初始化
原文示例结构示意:
extern void *g_pfnVectors;
#define INTVECT_START ((uint32_t)&g_pfnVectors)
int main(void)
{
SCB->VTOR = INTVECT_START;
HAL_Init();
HAL_RCC_DeInit();
HAL_UART_DeInit(&huart2);
// User code here
while(1){
WRITE_REG(IWDG->KR, IWDG_KEY_RELOAD);
}
}
6. 测试用户应用
- 构建 SBSFU_user_application → 在 Binary 下生成
.sfb - 用 SBSFU 工程烧录 Nucleo-L476
- 用 Tera Term 经 Ymodem 做固件更新
- 启动时按蓝色按键可进入固件更新模式
- 详见 SBSFU getting started 用户手册 8.4.2
7. 调试应用
打开 2_Images_SBSFU 的 debug configuration → Startup:添加工程并启用 Load symbols;为 SBSFU_user_application 与 SECoreBin 加载符号,无需下载用户镜像或 SECoreBin。
开发模式(app_sfu.h):
- 停用全部安全保护:启用
SECBOOT_DISABLE_SECURITY_IPS - 确保
SFU_FINAL_SECURE_LOCK_ENABLE禁用 - 启用
SFU_FWIMG_BLOCK_ON_ABNORMAL_ERRORS_MODE - 启用
SFU_VERBOSE_DEBUG_MODE与SFU_DEBUG_MODE
随后可调试 SBSFU 工程。
8. 限制
8.1 路径中的空格
工程、工具链或工作区路径不要含空格;SBSFU 构建脚本不支持。
8.2 更新 Python 脚本
按系统 Python 命令别名,必要时将 2_Images_SECoreBin/STM32CubeIDE 与 2_Images_SBSFU/STM32CubeIDE 下 .sh 中的 python 改为 py 等。
8.3 编译过程
用 Arm GCC 14(如 14.3.1)构建 SECoreBin 时可能出现 Secure Engine 链接错误。变通:使用早于 GCC 14 的 Arm GNU 工具链;本文用 STM32CubeCLT 1.1.18(提供兼容的 Arm GCC 13),并在 Window → Preferences → STM32Cube → Toolchain Manager 指向该 arm-gcc。
9. 使用附件工程
- 解压工程
- 复制到
.../Projects/NUCLEO-L476RG/Applications/ - 用 STM32CubeIDE 导入
注意:解压可能多一层目录;只复制包含 SBSFU 工程与 SBSFU_user_application 的根文件夹。
结论
到这里,STM32CubeMX 生成的应用已经能进 SBSFU 工程;文中也给了调试 SBSFU 时的注意点。
来源:https://community.st.com/stm32-mcus-60/how-to-port-a-stm32cubemx-application-to-sbsfu-168363 参数以意法半导体官方最新资料为准。
40
