在线时间185 小时
UID3375312
注册时间2017-6-28
NXP金币12
TA的每日心情 | 开心 2020-12-17 09:04 |
---|
签到天数: 346 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 1363
- 最后登录
- 2025-5-7
|
Hello,又和大家见面了如上次所说,这次评测咱们围绕Cortex-M33的三大特色之一的TrustZone来做一次demo心得,虽然接触M33有一段时间了,由于工作原因排不开时间所以这是我一次玩TrustZone,有不足之处希望大家不吝赐教,在此感谢NXP官方和NXP社区的大力支持。
首先翻开收据手册翻开TrustZone章节内容。
可以看到保护区间是分地址区段的,像Same as above内容本身是属于保护阶段的,用户层是不能对其进行更改调配的,可以修改保护的就只能在Non-secure地址区间做对应的修改了,本次是基于NXP官方的演示demo_gpio来调试分析,打开keil的workspace,程序示例有ns和s两个。
这两个程序分别起什么作用呢?ns程序里面就只有一个简单的循环体是基于s的程序配置来执行的,因为是执行的端口的IO脚读取,又因为使用的P0_5与debug口有冲突,小编又比较懒在此就没有去引出验证了。重点来讲s里面的程序,首先定义了__attribute__函数属性的non-secure回调函数类型,这个函数只能在硬件复位后才生效,因此在下载程序的时候不要勾选reset and run选项,否则会报错。然后进入TrustZone的初始化配置可以看到
允许修改的正如刚刚数据手册上所讲的那样,本次这里只使用上述代码标红的字节区间。这个初始化是回调函数所调用执行的,因此它也是在硬件复位后才能执行。 最后就是功能区间了,这里省略基础IO初始化配置,只针对加密端重点剖析。
- /* Set non-secure main stack (MSP_NS) */
- __TZ_set_MSP_NS(*((uint32_t *)(NON_SECURE_START))); <font color="#ff0000">//设置加密地址,官网定义的是0x00010000</font>
-
- /* Set non-secure vector table */
- SCB_NS->VTOR = NON_SECURE_START; <font color="#ff0000"> //使能non-secure矢量属性</font>
-
- /* Get non-secure reset handler */
- ResetHandler_ns = (funcptr_ns)(*((uint32_t *)((NON_SECURE_START) + 4U))); <font color="#ff0000">//获取复位句柄函数</font>
-
- /* Call non-secure application - jump to normal world */
- /* */
- ResetHandler_ns(); <font color="#ff0000"> //进入</font><span style="color: rgb(255, 0, 0);">non-secure回调函数</span>
复制代码 这里功能具体实现是通过两个按键在中断模式下使能RGB灯的绿灯和蓝灯的状态来区分。- void SysTick_Handler(void)
- {
- /* Control GPIO MASK based on S2 button press */
- if (GPIO_PinRead(DEMO_SW2_GPIO, DEMO_SW2_GPIO_PORT, DEMO_SW2_GPIO_PIN)) //复位按键
- {
- AHB_SECURE_CTRL->SEC_GPIO_MASK0 |= DEMO_BLUE_LED_PIN_SEC_MASK;
- }
- else
- {
- AHB_SECURE_CTRL->SEC_GPIO_MASK0 &= ~DEMO_BLUE_LED_PIN_SEC_MASK;
- }
- /* Control green LED based on S1 button press */
- if (GPIO_PinRead(DEMO_SECURE_SW1_GPIO, DEMO_SECURE_SW1_GPIO_PORT, DEMO_SECURE_SW1_GPIO_PIN)) //唤醒按键
- {
- LED_GREEN_OFF();
- }
- else
- {
- LED_GREEN_ON();
- }
- }
复制代码 上述函数可知只有执行完复位阶段后TrustZone才会生效执行绿灯闪烁一次,执行完后就封闭了,只有等待下一次reset完后才能执行一次,完后无法读取IO状态的。而蓝灯是基于普通IO来做的,状态是可以查询的,按下亮,放开就熄灭。 TrustZone的加密功能GPIO只是九牛一毛,更多的是对数据的封闭性,如果大家有兴趣小编可以后续继续更进。在此谢谢大家。
|
|