news 2026/5/18 23:04:12

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[STM32U3] 【STM32U385RG 测评】+ TrustZone及其测试

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

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

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


图1 TrustZone结构框架



图2 内核结构

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


图3 模式类型


图4 模式类型

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

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



图5 完整隔离


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


图6 目录内容

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



图7 提示1


图8 提示2

若打开Secure目录下项目工程GPIO_IOToggle_TrustZone_S,则可以快速打开。
其主程序为:

复制
  1. intmain(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. staticvoidNonSecure_Init(void)
  2. {
  3. uint32_tvtor_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 LED2电路

LED2的初始化函数为:

复制
  1. staticvoidGPIO_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 完成编译


图11 完成下载

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


图12 点亮LED2

此外,为了对非安全模式的测试,可对其初始化函数加以修改,修改后的内容为:

复制
  1. staticvoidNonSecure_Init(void)
  2. {
  3. uint32_tvtor_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的控制失效。

效果演示:




---------------------
作者:jinglixixi
链接:https://bbs.21ic.com/icview-3478041-1-1.html?_dsign=345a122a
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/18 23:00:32

如何选择CTF操作系统:Windows、Mac和Linux终极对比指南

如何选择CTF操作系统:Windows、Mac和Linux终极对比指南 【免费下载链接】resources A general collection of information, tools, and tips regarding CTFs and similar security competitions 项目地址: https://gitcode.com/gh_mirrors/reso/resources 在…

作者头像 李华
网站建设 2026/5/18 22:57:44

智能消毒柜串口屏开发实战:基于大彩DGUS的HMI方案解析

1. 项目概述:当智能消毒柜遇上串口屏最近在做一个多功能智能消毒柜的项目,客户对交互界面的要求不低,既要显示实时温湿度、工作模式、倒计时,还要能触控切换紫外线、臭氧、热风等多种消毒模式,甚至要集成预约和童锁功能…

作者头像 李华
网站建设 2026/5/18 22:57:19

嵌入式开发中堆栈8字节对齐:ARM Cortex-M架构的硬件要求与实战解析

1. 项目概述:一个被忽视的底层编程“潜规则”在嵌入式单片机开发这个行当里,尤其是跟ARM Cortex-M这类内核打交道时,有一个细节几乎成了老鸟们的肌肉记忆,但新手却常常一头雾水,甚至因此踩坑:为什么在函数调…

作者头像 李华
网站建设 2026/5/18 22:49:09

C++高精度算法的简单实现

一、基本原理1、存储方式采用数字记录高精度数字,数组的第一个元素存储数据长度,比如记录数字为1024示例如下:2、计算方式采用模拟立竖式计算,比如加法的计算流程,如下图所示10249000:这里只给出加法的计算…

作者头像 李华