[STM32U3] 【STM32U385RG 测评】+ TrustZone及其测试

[复制链接]
641|0
jinglixixi 发表于 2025-8-11 11:27 | 显示全部楼层 |阅读模式
#申请原创#



STM32U385RG属于 STM32 超低功耗家族,其内核是基于 96MHz 高性能的 Arm® Cortex®-M33 ,它集成了 Arm TrustZone®及硬件加密加速器。

那啥是TrustZone呢?
从字面讲TrustZone是指信任区,具体到ARM TrustZone® 则是ARM为了防止设备有效资源被拷贝、破坏或篡改,防止被恶意攻击,对资产包括有形和无形资产进行,以防止恶意软件、硬件监视、硬件干预等方式破坏或获取设备信息。

ARMv8-M架构下TrustZone结构框架如图1所示,带安全扩展的ARM V8-M内核结构如图2所示。

图片1.png
1 TrustZone结构框架

图片2.png

2 内核结构

ARMv8-M所支持的运行与访问模式如图3所示,通过函数和中断可实现内核状态的切换,见图4所示。
图片3.png
3 模式类型

图片4.png
4 模式类型

对于函数调用方式:
新指令支持 安全世界 和 非安全世界 之间的函数调用
• SGBXNSBLXNS
新操作
软件,清除安全世界的通用寄存器内容
硬件,自动将下一条安全指令入栈到S stackFNC_RETURN赋值给LR
对于中断方式:
只要优先级许可,彼此可以相互被打断
寄存器值自动入栈
被打断的代码,当前执行的上下文(通用寄存器)被硬件入栈到对应的堆栈
安全世界的堆栈 (MSP_SPSP_S
非安全世界的堆栈(MSP_NSPSP_NS
安全代码被非安全中断打断后
除了硬件自动入栈寄存器,还会自动清零当前寄存器的内容

对于STM32U5它已从内核延伸到系统级的完整隔离,见图5所示。
图片5.png

5 完整隔离


以例程GPIO_IOToggle_TrustZone工程为例,在其目录下的内容如图6所示。
图片6.png
6 目录内容

此时,若打开名为Project的项目工程,会出现图7和图8的提示而无法打开,说明保护机制已启动。
图片7.png

7 提示1

图片8.png
8 提示2

若打开Secure目录下项目工程GPIO_IOToggle_TrustZone_S,则可以快速打开。
其主程序为:
  1. int main(void)
  2. {
  3.   HAL_Init();
  4.   SystemClock_Config();
  5.   MX_GTZC_S_Init();
  6.   MX_ICACHE_Init();
  7.   GPIO_Init();
  8.   SecureInitIODone = 1;
  9.   HAL_GPIO_ConfigPinAttributes(LED_GPIO_Port, LED_Pin, GPIO_PIN_NSEC);
  10.   HAL_SuspendTick();
  11.   NonSecure_Init();
  12.   while (1)
  13.   {
  14.   }
  15. }


由此可知,其作用是:当启用TrustZone安全功能(选项位TZEN=1)时,将IO的安全属性从安全更改为非安全。 要切换的IO是PA.05,对应LED2。 在安全代码中,IO被配置为输出,LED保持开启状态(持续两秒)。然后IO被传递给非安全代码,由非安全代码切换LED。
非安全模式的初始化函数为:
  1. static void NonSecure_Init(void)
  2. {
  3.   uint32_t vtor_ns;
  4.   funcptr_NS NonSecure_ResetHandler;
  5.   vtor_ns = SCB_NS->VTOR;
  6.   __TZ_set_MSP_NS((*(uint32_t *)vtor_ns));
  7. NonSecure_ResetHandler = (funcptr_NS)(*((uint32_t *)((vtor_ns) + 4U)));
  8.   NonSecure_ResetHandler();
  9. }



LED2的电路如图9所示,其控制引脚为PA5.
图片9.png
9 LED2电路

LED2的初始化函数为:
  1. static void GPIO_Init(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  4.   __HAL_RCC_GPIOA_CLK_ENABLE();
  5.   HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
  6.   GPIO_InitStruct.Pin = LED_Pin;
  7.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  8.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  9.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  10.   HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
  11.   HAL_Delay(2000);
  12. }


其配置引脚的定义为:

#define LED_Pin         GPIO_PIN_5
#define LED_GPIO_Port   GPIOA

由此可知,其作用是对引脚PA5进行功能配置,并输出高电平。

经程序的编译和下载,其结果如图10和图11所示。
图片10.png
10 完成编译

图片11.png
11 完成下载

经程序的测试运行,其效果为LED2被点亮,见图12所示。
图片12.png
12 点亮LED2

此外,为了对非安全模式的测试,可对其初始化函数加以修改,修改后的内容为:
  1. static void NonSecure_Init(void)
  2. {
  3.   uint32_t vtor_ns;
  4.   funcptr_NS NonSecure_ResetHandler;
  5.   vtor_ns = SCB_NS->VTOR;
  6.   HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
  7.   __TZ_set_MSP_NS((*(uint32_t *)vtor_ns));
  8.   NonSecure_ResetHandler = (funcptr_NS)(*((uint32_t *)((vtor_ns) + 4U)));
  9.   NonSecure_ResetHandler();
  10. }


这样会在上电后,先点亮LED2,经2秒延时后便熄灭LED2。若将熄灭LED2的语句进行下移,也就是加入非安全模式,则对LED2的控制失效。

效果演示:




您需要登录后才可以回帖 登录 | 注册

本版积分规则

525

主题

2957

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部