在 STM32U5 系列低功耗安全 MCU 开发中,TrustZone 安全隔离与 LPBAM 低功耗后台自治模式的组合,能实现 Stop0/1/2 低功耗下外设自动运行,是电池供电设备的优选方案。但不少开发者在 Nucleo-U575ZI 开发板上调试时,会遇到启用 TrustZone 后使用 LPBAM 直接触发 HardFault,程序能跳转非安全工程却无法进入 main 函数的诡异问题。
本文基于 ST 官方 LAT1199 应用笔记,从故障现象、技术原理、根因定位到实操解决,完整拆解这一典型安全配置类异常,帮开发者快速避坑。
资料获取:【应用笔记】LAT1199 TrustZone架构下LPBAM使用导致的HardFault
1. 问题复现场景
客户基于 NUCLEO-U575ZI 开发板做低功耗自治方案:
- 启用Arm TrustZone安全架构,将 LPGPIO 映射到非安全区;
- 配置LPBAM 模式,用 LPTimer 做触发源,LPDMA 链表自动修改 LPGPIO 寄存器,实现低功耗下 GPIO 自动翻转;
- 程序可正常从安全工程跳转到非安全工程,执行
SystemInit、__main,但无法进入 main 函数,直接触发 HardFault 异常; - 关闭 TrustZone 后,相同代码运行完全正常。
2. 核心技术背景
2.1 STM32U5 TrustZone 安全机制
U5 系列基于 Armv8‑M 架构,TrustZone 通过IDAU+SAU划分内存 / 外设安全属性:
- IDAU:硬件固化的地址安全映射,Flash、SRAM 均有安全 / 非安全地址别名;
- SAU:软件可配置安全区域,最终安全属性由 IDAU+SAU 共同决定;
- 复位默认状态:所有 SRAM 均为安全属性,非安全状态无法直接访问安全 RAM。
2.2 LPBAM 低功耗后台自治模式
LPBAM(Low‑power Background Autonomous Mode)允许外设在 Stop2 低功耗模式下自动运行,无需 CPU 干预。
关键约束:只有 SRAM4 支持在 Stop2 模式下保持数据与访问,因此 LPBAM 相关代码 / 数据必须存放在 SRAM4(地址 0x28000000)。
3. 故障现象与异常分析
通过 Keil 调试与 Fault Report 工具,定位异常关键信息:
- 执行流程:安全工程→非安全工程
SystemInit→__main→卡死; - 异常类型:Bus Fault → PRECISERR(精准总线错误);
- 异常时机:尚未进入 main 函数,CPU 访问 Flash/RAM 触发总线非法访问;
- 排除项:无 TrustZone 时代码正常,排除驱动 / 逻辑错误,锁定安全属性配置问题。
4. 根因精准定位
结合内存布局与安全默认配置,问题根源一目了然:
- LPBAM 要求使用SRAM4(0x28000000) 存储数据;
- TrustZone 复位后,所有 SRAM(含 SRAM4)默认是安全属性;
- 非安全工程直接访问安全属性的 SRAM4,违反 TrustZone 访问规则,触发总线错误→HardFault;
- SRAM4 由MPCBB4(块基内存保护控制器)管理安全权限,安全工程未对 MPCBB4 做非安全开放配置。
5. 一步解决:安全工程配置 MPCBB4
仅需在安全工程中添加 MPCBB4 配置,将 SRAM4 开放给非安全区访问,即可彻底解决 HardFault。
实操代码(GTZC_S_Init 函数中添加)
/* 沿用SRAM3的MPCBB配置参数 */
MPCBB_Area_Desc.AttributeConfig.MPCBB_PrivConfig_array[31] = 0x00000000;
MPCBB_Area_Desc.AttributeConfig.MPCBB_LockConfig_array[31] = 0x00000000;
/* 配置SRAM4的安全属性为非安全 */
if(HAL_GTZC_MPCBB_ConfigMem(SRAM4_BASE, &MPCBB_Area_Desc) != HAL_OK)
{
Error_Handler();
}
配置说明
- 复用 SRAM3 的配置结构,无需重新定义参数;
HAL_GTZC_MPCBB_ConfigMem:GTZC 控制器提供的 API,用于修改 SRAM 块的安全属性;- 配置后,SRAM4 对非安全工程开放,CPU 可正常访问,不再触发总线异常。
配置完成后,重新下载安全工程 + 非安全工程,程序可正常进入 main 函数,LPBAM 功能稳定运行,无任何 HardFault。
6. TrustZone+LPBAM 开发避坑总结
- 内存安全属性先行:TrustZone 使能后,所有 SRAM 默认安全,非安全工程使用 SRAM4(LPBAM 必备)、SRAM3 等,必须先在安全工程通过MPCBB开放权限。
- 严格区分安全 / 非安全资源
- 安全工程:负责 MPCBB、GTZC、SAU 等安全配置;
- 非安全工程:仅访问已授权的内存与外设;
- 禁止非安全工程直接访问安全属性的 RAM / 寄存器。
- LPBAM 专属约束:Stop2 模式下仅 SRAM4 可用,务必在分散加载文件中,将 LPBAM 相关数据段映射到0x28000000,并提前完成 MPCBB4 配置。
- HardFault 快速排查思路:TrustZone 工程出现 Bus Fault/Usage Fault,优先检查:
- 访问的内存 / 外设安全属性是否匹配;
- MPCBB(RAM)、GTZC(外设)是否完成授权配置;
- SAU/IDAU 地址映射是否正确。
本次 HardFault 并非代码逻辑错误,而是TrustZone 安全机制与 LPBAM 硬件约束的配置冲突—— 非安全工程非法访问默认安全的 SRAM4,且未通过 MPCBB4 开放权限。
STM32U5 的 TrustZone 开发,核心是先规划安全边界,再编写业务代码。只要牢记 “安全工程管权限、非安全工程管应用”,提前配置好 MPCBB/GTZC,就能完美规避这类安全访问类异常,让 TrustZone+LPBAM 的低功耗自治方案稳定落地。
898