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,则可以快速打开。
其主程序为:
intmain(void){HAL_Init();SystemClock_Config();MX_GTZC_S_Init();MX_ICACHE_Init();GPIO_Init();SecureInitIODone =1;HAL_GPIO_ConfigPinAttributes(LED_GPIO_Port, LED_Pin, GPIO_PIN_NSEC);HAL_SuspendTick();NonSecure_Init();while(1){}}
由此可知,其作用是:当启用TrustZone安全功能(选项位TZEN=1)时,将IO的安全属性从安全更改为非安全。 要切换的IO是PA.05,对应LED2。 在安全代码中,IO被配置为输出,LED保持开启状态(持续两秒)。然后IO被传递给非安全代码,由非安全代码切换LED。
非安全模式的初始化函数为:
staticvoidNonSecure_Init(void){uint32_tvtor_ns;funcptr_NS NonSecure_ResetHandler;vtor_ns = SCB_NS->VTOR;__TZ_set_MSP_NS((*(uint32_t*)vtor_ns));NonSecure_ResetHandler = (funcptr_NS)(*((uint32_t*)((vtor_ns) +4U)));NonSecure_ResetHandler();}
LED2的电路如图9所示,其控制引脚为PA5.
图9 LED2电路
对LED2的初始化函数为:
staticvoidGPIO_Init(void){GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);GPIO_InitStruct.Pin = LED_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);HAL_Delay(2000);}
其配置引脚的定义为:
#define LED_Pin GPIO_PIN_5
#define LED_GPIO_Port GPIOA
由此可知,其作用是对引脚PA5进行功能配置,并输出高电平。
经程序的编译和下载,其结果如图10和图11所示。
图10 完成编译
图11 完成下载
经程序的测试运行,其效果为LED2被点亮,见图12所示。
图12 点亮LED2
此外,为了对非安全模式的测试,可对其初始化函数加以修改,修改后的内容为:
staticvoidNonSecure_Init(void){uint32_tvtor_ns;funcptr_NS NonSecure_ResetHandler;vtor_ns = SCB_NS->VTOR;HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);__TZ_set_MSP_NS((*(uint32_t*)vtor_ns));NonSecure_ResetHandler = (funcptr_NS)(*((uint32_t*)((vtor_ns) +4U)));NonSecure_ResetHandler();}
这样会在上电后,先点亮LED2,经2秒延时后便熄灭LED2。若将熄灭LED2的语句进行下移,也就是加入非安全模式,则对LED2的控制失效。
效果演示:
---------------------
作者:jinglixixi
链接:https://bbs.21ic.com/icview-3478041-1-1.html?_dsign=345a122a
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。