|
NUCLEO-H5E5ZJ开启TrustZone功能,文章里我会用TZ表示TrustZone,S代表Secure,NS代表NonSecure。 因为要打开TZ,所以不能沿用之前创建的工程代码了,这里需要用CubeMX重新创建新的工程代码。9 ]/ t9 i' r, M# [2 ]! [7 ` % K% t R' L0 \* p9 n 先说一下大概实验思路: 1. 搭建工程( P! e# l5 j4 g8 f; I s' c* q$ a 2. 串口打印初始化在NS分区,S分区控制NS分区串口外设的使用,可以限制NS无法使用串口打印* g) l- M/ s8 H2 f! \+ r 3. 串口打印初始化在S分区,NS分区调用S分区API,实现串口打印0 y( [+ {) Z+ u3 S6 F! F( D* D
打开CubeMX工具,选择基于board创建项目/ k7 W2 ^2 q' }( y; v. ~
输入H5E5搜索型号 NUCLEO-H5E5ZJ
这里需要注意的是,选择 with TrustZone
板子外设默认全部选择上
这里我先修改的时钟频率为250MHz2 s/ v0 a8 A3 Q( ^% x2 f5 g
可以看到UART3默认就是在S分区,所以不用修改了
接着就是生成代码,这里会有一个警告,忽略就行了
4 _0 _- f9 G& T2 C( f# y 打开工程后可以看到一共有两个工程项目,S和NS,编译的话需要先编译S项目,再编译NS项目,因为NS会链接S的secure_nsc文件2 |9 G+ I& v0 M2 _: A/ p
在NS项目的main.c中,初始化最后添加一个printf打印代码 printf("STM32H5E5ZJ None Secure Run\r\n"); 依次编译完成,烧录之前还需要配置芯片选项字,开启TZ
另外还需要修改flash分区,因为H5E5有两个bank,这里设置bank2为NS使用,这一点很重要,否则程序运行就会挂掉,因为新板子默认两个bank都是S。
然后依次下载S固件和NS固件,复位运行程序,此时发现串口没有任何输出。
因为在S项目中的MX_GTZC_S_Init初始化函数将UART3设置为了S分区使用,所以NS是不能使用UART3的; N6 W# i: ^. R6 l. h. p4 g) T& a
将GTZC_TZSC_PERIPH_SEC修改为NS使用,另外还要修改串口输出的两个GPIO也为NS使用,确保UART3在NS是可以完全使用的
重新编译S和NS代码,烧录重启后串口有了输出,所以可以通过GTZC限制外设在NS侧的使用权限。
重新回到CubeMX,可以看到BSP选项中,可以把NUCLEO分配到S分区使用) T$ r/ G: j" F, a! T) V5 c
修改之后重新生成代码,把之前修改的UART3外设和GPIO都重新放回S分区使用。 在S工程中添加printf打印5 K/ |' x, @* S
然后编译S和NS,此时NS编译会失败,因为之前在NS添加的log打印会报错,这里先删除掉这行代码,重新编译烧录运行
S工程正常打印log了0 F( A' q2 E _9 p
9 f% B8 T, e0 y 接下来需要添加NS调用的API,用于NS侧的log打印4 p7 B4 o2 |1 R3 P4 `5 D 首先在S工程中的secure_nsc.c和.h中添加API8 n+ ]" z: Q5 K" Z: |; Z7 L
然后NS工程添加调用% }! p; |) V6 l2 R6 ~% ^7 r# F6 h
这里有个点需要注意一下,就是main中的系统时钟函数SystemClock_Config在S工程没有初始化,在NS工程重新初始化了的。 S启动初始化UART3的时钟和NS调用打印时候的时钟不一致了,会导致现在编译出来的固件,NS是无法完成打印输出的。 有一个比较简单的办法就是将NS工程中的SystemClock_Config函数复制到S工程中同样初始化一次,保证两边的时钟初始化一致。 我这里就是直接复制过来初始化一次的% Y( K' m. A1 W& V9 X# q! O+ P0 i
然后编译烧录运行,S和NS都可以正常打印日志了3 a9 p6 x; r6 x- O/ H9 `! x
另外还有一个比较有意思的点,因为H5E5有两个systick,那其实就可以两边都在systick中运行代码了) ^- J U% t3 ^5 y+ B/ g
比如我在S侧添加一个systick中断点灯LED1,那NS侧也可以添加一个点灯LED2代码,两边都可以各自运行,只是S侧的优先级会高于NS侧。4 F1 A' [* K0 _2 h3 } Y* B
3 Z8 D5 `9 F- g 关于H5E5的安全分区系统实验就做完了,实验比较简单,可以熟悉一下S和NS的交互使用,对于安全功能要求比较严格的项目还是很适用的。& `9 ^, }1 C$ `7 N9 c 6 n1 p/ T: w( p) C) U$ {, Y |
【STM32H5 评测】Part4 STM32H5E5 存储测试
【NUCLEO-H5E5ZJ评测】M.2存储扩展实测
【STM32H5 评测】+ 多外设同时开启稳定性简要评测
【NUCLEO-H5E5ZJ评测】CoreMark 移植实录:从 CubeMX 到 700.89 分
【STM32H5 评测】+ 增加ETH外设和NetX协议栈实验
从 CubeMX 到 MX2:这些关键变化必须知道
【STM32H5 评测】+ H5E5专用OLED点亮实验
【STM32H5 评测】ADC 电压表
【STM32H5 评测】Part3 STM32H5E5 密码学加速性能测试
【STM32H5 评测】 Part1 Cortex-M33@250MHz内核性能测试
微信公众号
手机版