本帖最后由 MianQi 于 2020-12-21 17:32 编辑
按照STM32 L5系列的介绍,这款芯片的最大亮点是启用了M33内核,最显著的特色是TZ(TrustZone)的出现。
TrustZone,我把它译作:可信区。这是一种STM32提供的安全(secure)机制,但是,对这里所说的“安全”要有正确的理解。我的理解是:“安全”分框架安全和内容安全。内容安全,说的是私密性,靠加密实现——无论软件或硬件加密;框架安全,说的是健壮性,靠隔离(isolate)实现,至少STM32在M33的TrustZone里是这么做地。
那所谓的“隔离”是什么意思呢?它指的是,一个系统里有确定的部分,有不太确定或者不确定的部分。确定的部分指的是常规的、通用的、已经定形了的部分,基本上可以认为是没有bug地;不确定的部分指的是实验或者试验性质的、有可能是拷贝(fork)来的,可能含有bug地。对这两部的“隔离”,意味着,可信区的对象可以访问或者调用不可信区的对象,反之不行,类似于硬件电路里的基于二极管的极性保护(个人理解)。
那可信区与不可信区由谁来划分呢?用户。
下面通过一个例子来演示一下TZ(TrustZone)的用法。需要说明的是,我是在Ubuntu 20.04.1 LTS上运行STM32CubeIDE,这里的界面布局跟Windows版有很大的不同,我将逐一用截图显示每一步的设置在哪里。
首先看一下,在Ubuntu上安装了STM32CubeIDE之后的icon界面:
启动IDE:
初次运行STM32CubeIDE的预安装界面:
新建一个STM32项目:
选板子:
最下边一个:
这个时候要把板子插上:
设置项目名称和工程路径:
注意:勾选“Enable TrustZone”:
下载固件:
初步设置完成:
设置GPIO:
在GPIO中选择“show all”,才会出现PG8/PG7:
在“Connectivity”中选择“LPUART1”:
设置为“Cortex-M33 non secure”:
将设置为:Asynchronous,波特率设置为:115200。(这个时候要注意输入法的切换,如果还是汉语输入,将会是:115200)
在“Clock Configuration”中,将APB1配置为55MHz。注意是peripheral clocks,而不是Timer clocks.
在“Secutity”中配置“GTZC”:
上述的截图位置跟windows下几乎都不相同(这里假设示例中的截图取自windows版的STM32CubeIDE)但是功能的设置是完全一样地——当然还有一处不同,就是当我参照这个教程的时候(https://www.stmcu.com.cn/ecosystem/chip/chipfamily-STM32L5-4),最后一步是“EXTI 14 line 14 interrupt”,而不是“13”。
在“NVIC Settings”中设置“Global TrustZone controller global interrupt”使能:
接下来的一部出现了问题:示例中用的是“EXTI line 13 interrupt”,而在我这里的界面中只有“EXTI line 14 interrupt””:
实际上,这是我这里的测试中发现的唯一一处跟示例中真正的不同,对接下来代码的使用有什么影响,且看下一帖:【NUCLEO-L552ZE测评】-2: Stay in TrustZone。
在现有的状态下点击生成代码:
这是现在的项目目录: