你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32H5 评测】NUCLEO-H5E5ZJ 使用 TrustZone 安全分区系统实践测试

[复制链接]
无敌帅帅帅 发布时间:2026-10-20 15:15
NUCLEO-H5E5ZJ开启TrustZone功能,文章里我会用TZ表示TrustZone,S代表Secure,NS代表NonSecure。
0 b- u+ l0 B9 N% y4 @% A因为要打开TZ,所以不能沿用之前创建的工程代码了,这里需要用CubeMX重新创建新的工程代码。9 ]/ t9 i' r, M# [2 ]! [7 `

: r, F1 z) m+ w+ {9 j3 t3 i% K% t  R' L0 \* p9 n
先说一下大概实验思路:
# i& Y  c" O4 G& a4 O: W1. 搭建工程( 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

8 a# J1 l  P8 ?) q$ i% S3 ~' X
  • 1. 搭建工程
    ( A% s) y" _  v6 [* P: {1 p

* R4 [. \, C% j3 X% z2 X打开CubeMX工具,选择基于board创建项目/ k7 W2 ^2 q' }( y; v. ~
1.jpg   L) Y2 R; W3 {9 f/ ]5 F
输入H5E5搜索型号 NUCLEO-H5E5ZJ
. G; L; S+ |2 j8 j) K9 Q 2.jpg
) S" w$ R8 w" P4 x* t  b& G; |) X7 @这里需要注意的是,选择 with TrustZone
0 G. i. t8 S% x, R5 ?: g! i 3.jpg
5 k: t) \7 s& j) q' B% d& a板子外设默认全部选择上
& M% `/ m( M: Z* p" |( K. x 4.jpg
2 y; W6 J1 Q3 E: w1 G  d这里我先修改的时钟频率为250MHz2 s/ v0 a8 A3 Q( ^% x2 f5 g
5.jpg . K' y; ]! n7 S0 L6 P$ e
可以看到UART3默认就是在S分区,所以不用修改了
& n) y4 M; k: {' t; b/ o 6.jpg 4 l3 ~+ R8 p) J2 Y- ^
接着就是生成代码,这里会有一个警告,忽略就行了
! \* S: X/ m% D; g9 l$ X4 v+ ~ 7.jpg - v2 w( \  Q" x  e" {
4 _0 _- f9 G& T2 C( f# y
打开工程后可以看到一共有两个工程项目,S和NS,编译的话需要先编译S项目,再编译NS项目,因为NS会链接S的secure_nsc文件2 |9 G+ I& v0 M2 _: A/ p
8.jpg 3 B5 t7 l/ }  B3 {3 q- w

- W9 J/ E' z6 q. Y+ R* C  X, h在NS项目的main.c中,初始化最后添加一个printf打印代码 printf("STM32H5E5ZJ None Secure Run\r\n");
3 S) D. ~- A6 B8 Q依次编译完成,烧录之前还需要配置芯片选项字,开启TZ
# }4 Z# x$ j1 u7 }. y 14.jpg   b0 E/ W- r; s- H# s
另外还需要修改flash分区,因为H5E5有两个bank,这里设置bank2为NS使用,这一点很重要,否则程序运行就会挂掉,因为新板子默认两个bank都是S。
8 ?+ E' v# _; G: {# `2 k 13.jpg 4 b0 F% G5 }$ }) o: N
然后依次下载S固件和NS固件,复位运行程序,此时发现串口没有任何输出。
2 c/ f* |) k3 H/ K* J
/ l6 O6 B  q: q* o/ _
  • 2. 串口打印初始化在NS分区,S分区控制NS分区串口外设的使用,可以限制NS无法使用串口打印9 Y: x- v+ s: {1 y9 f

3 L. S; T% W6 R# l
* }, ~$ f5 ^  I0 e' X因为在S项目中的MX_GTZC_S_Init初始化函数将UART3设置为了S分区使用,所以NS是不能使用UART3的; N6 W# i: ^. R6 l. h. p4 g) T& a
11.jpg 1 [9 u* v; @2 |8 j( {0 G; T* t
将GTZC_TZSC_PERIPH_SEC修改为NS使用,另外还要修改串口输出的两个GPIO也为NS使用,确保UART3在NS是可以完全使用的
% ?; @, d- h8 u& m9 f1 F  T 12.jpg 36.jpg
3 Z+ G& F; X! ^) e$ ]重新编译S和NS代码,烧录重启后串口有了输出,所以可以通过GTZC限制外设在NS侧的使用权限。
  _3 Q4 p3 S- L) V) ~9 D( B+ N 15.jpg 3 I' Y1 D: s4 W) W

( m" O' G- ]8 k! U
  • 3. 串口打印初始化在S分区,NS分区调用S分区API,实现串口打印( v/ w& N& r- G' L3 \

" B, Z7 ]  [) Q! B7 p
' D, J$ B* X- @' S重新回到CubeMX,可以看到BSP选项中,可以把NUCLEO分配到S分区使用) T$ r/ G: j" F, a! T) V5 c
16.jpg 17.jpg
9 @$ q# k7 |+ |. y3 f修改之后重新生成代码,把之前修改的UART3外设和GPIO都重新放回S分区使用。
. j$ Y8 @! _6 B9 D% f在S工程中添加printf打印5 K/ |' x, @* S
18.jpg
& G) E, n' G! H然后编译S和NS,此时NS编译会失败,因为之前在NS添加的log打印会报错,这里先删除掉这行代码,重新编译烧录运行
# {: F' L5 ]/ y2 n/ z3 X 19.jpg
: t7 [3 k! p  s% p. B; c2 TS工程正常打印log了0 F( A' q2 E  _9 p
20.jpg
8 F: a' N* }9 w2 W7 l9 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
22.jpg
, _9 N' q  y8 q( L2 s 23.jpg
! y; y5 _- W& ?0 l然后NS工程添加调用% }! p; |) V6 l2 R6 ~% ^7 r# F6 h
21.jpg
8 m* W+ d; b2 z+ O5 K这里有个点需要注意一下,就是main中的系统时钟函数SystemClock_Config在S工程没有初始化,在NS工程重新初始化了的。
3 I9 Z& H( e5 qS启动初始化UART3的时钟和NS调用打印时候的时钟不一致了,会导致现在编译出来的固件,NS是无法完成打印输出的。
4 H+ d- e9 f+ w4 Z: S有一个比较简单的办法就是将NS工程中的SystemClock_Config函数复制到S工程中同样初始化一次,保证两边的时钟初始化一致。
! J9 M; t4 K8 c" D# \" l我这里就是直接复制过来初始化一次的% Y( K' m. A1 W& V9 X# q! O+ P0 i
24.jpg
/ d. o8 j8 P+ o8 T然后编译烧录运行,S和NS都可以正常打印日志了3 a9 p6 x; r6 x- O/ H9 `! x
25.jpg 5 ?; ~# [4 F6 i8 W' r* S# w

: N% ~& r' X( {1 G: Q, z, @0 G另外还有一个比较有意思的点,因为H5E5有两个systick,那其实就可以两边都在systick中运行代码了) ^- J  U% t3 ^5 y+ B/ g
37.jpg
% S2 J  f% {2 ?& z) T( f比如我在S侧添加一个systick中断点灯LED1,那NS侧也可以添加一个点灯LED2代码,两边都可以各自运行,只是S侧的优先级会高于NS侧。4 F1 A' [* K0 _2 h3 }  Y* B
38.jpg $ i, Y) r- T- K* U4 f
3 Z8 D5 `9 F- g
关于H5E5的安全分区系统实验就做完了,实验比较简单,可以熟悉一下S和NS的交互使用,对于安全功能要求比较严格的项目还是很适用的。& `9 ^, }1 C$ `7 N9 c
6 n1 p/ T: w( p) C) U$ {, Y
赞 1 收藏 评论0 发布时间:2026-10-20 15:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版