• 正文
  • 相关推荐
申请入驻 产业图谱

STM32U5 TrustZone+LPBAM 引发 HardFault 问题定位与根治方案

03/31 09:34
898
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在 STM32U5 系列低功耗安全 MCU 开发中,TrustZone 安全隔离与 LPBAM 低功耗后台自治模式的组合,能实现 Stop0/1/2 低功耗下外设自动运行,是电池供电设备的优选方案。但不少开发者在 Nucleo-U575ZI 开发板上调试时,会遇到启用 TrustZone 后使用 LPBAM 直接触发 HardFault,程序能跳转非安全工程却无法进入 main 函数的诡异问题。

本文基于 ST 官方 LAT1199 应用笔记,从故障现象、技术原理、根因定位到实操解决,完整拆解这一典型安全配置类异常,帮开发者快速避坑。

资料获取:【应用笔记】LAT1199 TrustZone架构下LPBAM使用导致的HardFault

1. 问题复现场景

客户基于 NUCLEO-U575ZI 开发板做低功耗自治方案:

  1. 启用Arm TrustZone安全架构,将 LPGPIO 映射到非安全区;
  2. 配置LPBAM 模式,用 LPTimer 做触发源,LPDMA 链表自动修改 LPGPIO 寄存器,实现低功耗下 GPIO 自动翻转;
  3. 程序可正常从安全工程跳转到非安全工程,执行SystemInit__main,但无法进入 main 函数,直接触发 HardFault 异常;
  4. 关闭 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 工具,定位异常关键信息:

  1. 执行流程:安全工程→非安全工程SystemInit__main→卡死;
  2. 异常类型:Bus Fault → PRECISERR(精准总线错误);
  3. 异常时机:尚未进入 main 函数,CPU 访问 Flash/RAM 触发总线非法访问;
  4. 排除项:无 TrustZone 时代码正常,排除驱动 / 逻辑错误,锁定安全属性配置问题。

4. 根因精准定位

结合内存布局与安全默认配置,问题根源一目了然:

  1. LPBAM 要求使用SRAM4(0x28000000) 存储数据;
  2. TrustZone 复位后,所有 SRAM(含 SRAM4)默认是安全属性;
  3. 非安全工程直接访问安全属性的 SRAM4,违反 TrustZone 访问规则,触发总线错误→HardFault;
  4. 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();
}

配置说明

  1. 复用 SRAM3 的配置结构,无需重新定义参数;
  2. HAL_GTZC_MPCBB_ConfigMem:GTZC 控制器提供的 API,用于修改 SRAM 块的安全属性;
  3. 配置后,SRAM4 对非安全工程开放,CPU 可正常访问,不再触发总线异常。

配置完成后,重新下载安全工程 + 非安全工程,程序可正常进入 main 函数,LPBAM 功能稳定运行,无任何 HardFault。

6. TrustZone+LPBAM 开发避坑总结

  1. 内存安全属性先行:TrustZone 使能后,所有 SRAM 默认安全,非安全工程使用 SRAM4(LPBAM 必备)、SRAM3 等,必须先在安全工程通过MPCBB开放权限。
  2. 严格区分安全 / 非安全资源
    • 安全工程:负责 MPCBB、GTZC、SAU 等安全配置;
    • 非安全工程:仅访问已授权的内存与外设;
    • 禁止非安全工程直接访问安全属性的 RAM / 寄存器。
  3. LPBAM 专属约束:Stop2 模式下仅 SRAM4 可用,务必在分散加载文件中,将 LPBAM 相关数据段映射到0x28000000,并提前完成 MPCBB4 配置。
  4. HardFault 快速排查思路:TrustZone 工程出现 Bus Fault/Usage Fault,优先检查:
    • 访问的内存 / 外设安全属性是否匹配;
    • MPCBB(RAM)、GTZC(外设)是否完成授权配置;
    • SAU/IDAU 地址映射是否正确。

本次 HardFault 并非代码逻辑错误,而是TrustZone 安全机制与 LPBAM 硬件约束的配置冲突—— 非安全工程非法访问默认安全的 SRAM4,且未通过 MPCBB4 开放权限。

STM32U5 的 TrustZone 开发,核心是先规划安全边界,再编写业务代码。只要牢记 “安全工程管权限、非安全工程管应用”,提前配置好 MPCBB/GTZC,就能完美规避这类安全访问类异常,让 TrustZone+LPBAM 的低功耗自治方案稳定落地。

相关推荐