|
NUCLEO-H5E5ZJ开启TrustZone功能,文章里我会用TZ表示TrustZone,S代表Secure,NS代表NonSecure。 因为要打开TZ,所以不能沿用之前创建的工程代码了,这里需要用CubeMX重新创建新的工程代码。5 d1 Q+ \/ f0 p* | 5 ?8 b8 u4 ~. {9 e1 J/ s0 k3 S 先说一下大概实验思路:6 c3 u: b |5 D 1. 搭建工程 2. 串口打印初始化在NS分区,S分区控制NS分区串口外设的使用,可以限制NS无法使用串口打印 w$ q" M1 @! [% { 3. 串口打印初始化在S分区,NS分区调用S分区API,实现串口打印0 s! P* x% V- X! M* F+ [, S
打开CubeMX工具,选择基于board创建项目( j$ W' w* R) i u8 \
输入H5E5搜索型号 NUCLEO-H5E5ZJ
这里需要注意的是,选择 with TrustZone- {4 _$ o2 K1 @. a
板子外设默认全部选择上
这里我先修改的时钟频率为250MHz3 l0 m8 R3 ~1 E6 q; J+ h p9 B
可以看到UART3默认就是在S分区,所以不用修改了
接着就是生成代码,这里会有一个警告,忽略就行了
打开工程后可以看到一共有两个工程项目,S和NS,编译的话需要先编译S项目,再编译NS项目,因为NS会链接S的secure_nsc文件
' I; F+ H5 P4 B: c# J4 d 在NS项目的main.c中,初始化最后添加一个printf打印代码 printf("STM32H5E5ZJ None Secure Run\r\n"); 依次编译完成,烧录之前还需要配置芯片选项字,开启TZ
另外还需要修改flash分区,因为H5E5有两个bank,这里设置bank2为NS使用,这一点很重要,否则程序运行就会挂掉,因为新板子默认两个bank都是S。
然后依次下载S固件和NS固件,复位运行程序,此时发现串口没有任何输出。 5 e3 k7 x7 H2 R5 O
- \0 ^, M. q! _7 \' t 因为在S项目中的MX_GTZC_S_Init初始化函数将UART3设置为了S分区使用,所以NS是不能使用UART3的+ O5 m4 C3 I. M0 S
将GTZC_TZSC_PERIPH_SEC修改为NS使用,另外还要修改串口输出的两个GPIO也为NS使用,确保UART3在NS是可以完全使用的
重新编译S和NS代码,烧录重启后串口有了输出,所以可以通过GTZC限制外设在NS侧的使用权限。" j1 m3 R6 ?' M
: B+ a. Y1 q5 {# a. S" C 重新回到CubeMX,可以看到BSP选项中,可以把NUCLEO分配到S分区使用4 i1 }" i" V2 s- p- l
修改之后重新生成代码,把之前修改的UART3外设和GPIO都重新放回S分区使用。9 h a6 k6 G) _( t 在S工程中添加printf打印3 y; d4 T3 s- d c b- A1 Y7 Y
然后编译S和NS,此时NS编译会失败,因为之前在NS添加的log打印会报错,这里先删除掉这行代码,重新编译烧录运行
S工程正常打印log了
4 W# u) @; q" I2 P2 u 接下来需要添加NS调用的API,用于NS侧的log打印) ]2 x8 L1 ?: Z' _ 首先在S工程中的secure_nsc.c和.h中添加API/ Y- M. Q# S% a& r" j
然后NS工程添加调用
这里有个点需要注意一下,就是main中的系统时钟函数SystemClock_Config在S工程没有初始化,在NS工程重新初始化了的。 S启动初始化UART3的时钟和NS调用打印时候的时钟不一致了,会导致现在编译出来的固件,NS是无法完成打印输出的。+ g, a0 G0 O% _/ a$ y$ {" M3 _ 有一个比较简单的办法就是将NS工程中的SystemClock_Config函数复制到S工程中同样初始化一次,保证两边的时钟初始化一致。+ \3 z! i" I% o5 s 我这里就是直接复制过来初始化一次的* K, N/ F, n# F1 S
然后编译烧录运行,S和NS都可以正常打印日志了
另外还有一个比较有意思的点,因为H5E5有两个systick,那其实就可以两边都在systick中运行代码了- Y g H3 ^: J
比如我在S侧添加一个systick中断点灯LED1,那NS侧也可以添加一个点灯LED2代码,两边都可以各自运行,只是S侧的优先级会高于NS侧。
) K& R/ ?0 ` l& {/ H. F. `7 J 关于H5E5的安全分区系统实验就做完了,实验比较简单,可以熟悉一下S和NS的交互使用,对于安全功能要求比较严格的项目还是很适用的。- E' S2 l. F- r) }) U * |; \! }/ l% S |
【STM32H5 评测】基于NUCLEO_H5E5ZJ+Zephyr数字电源
【STM32H5 评测】基础硬件加密与随机数性能 - STM32H5E5实测硬件AES加解密、HASH运算、TRNG真随机数输出速率与稳定性
【STM32H5 评测】CPU核心性能 - STM32H5E5跑 RTOS,观察任务切换速度、中断响应快慢
【STM32H5 评测】内存读写性能 - STM32H5E5实测Flash,SRAM读写速度,用DMA搬运大块数据
【STM32H5 评测】3、STM32H5 Lwip 移植、官方例程和UDP发送数据
【STM32H5 评测】2、Keil中添加RTX5 RTOS和Event Record
NUCLEO-H5E5ZJ 移植 LVGL
NUCLEO-H5E5ZJ 移植 ST7735 SPI LCD 驱动
NUCLEO-H5E5ZJ 以太网(Ethernet)移植记录
【STM32H5 评测】介绍、环境搭建、工程测试
微信公众号
手机版