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

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

[复制链接]
无敌帅帅帅 发布时间:2026-10-20 15:15
NUCLEO-H5E5ZJ开启TrustZone功能,文章里我会用TZ表示TrustZone,S代表Secure,NS代表NonSecure。
% U& H) F) I5 J3 d  r. b# s因为要打开TZ,所以不能沿用之前创建的工程代码了,这里需要用CubeMX重新创建新的工程代码。5 d1 Q+ \/ f0 p* |

- w! n% J; R/ _  b4 Z' S' a! o5 ?8 b8 u4 ~. {9 e1 J/ s0 k3 S
先说一下大概实验思路:6 c3 u: b  |5 D
1. 搭建工程
; s! T9 O9 X4 Y8 t( J7 h1 i: ^2. 串口打印初始化在NS分区,S分区控制NS分区串口外设的使用,可以限制NS无法使用串口打印  w$ q" M1 @! [% {
3. 串口打印初始化在S分区,NS分区调用S分区API,实现串口打印0 s! P* x% V- X! M* F+ [, S

7 F0 y+ M: P5 W* k8 F, N" b* u9 S$ F
  • 1. 搭建工程
    8 s+ V( E, u8 H, K

) }' a; W# u" h) {打开CubeMX工具,选择基于board创建项目( j$ W' w* R) i  u8 \
1.jpg " F3 Y5 B) w7 Y6 @1 X
输入H5E5搜索型号 NUCLEO-H5E5ZJ
" t* @: H' N( X& I 2.jpg
( q, Q# n. c1 b! ?3 U' b2 I这里需要注意的是,选择 with TrustZone- {4 _$ o2 K1 @. a
3.jpg ! Q' p+ L" Y( j+ s( u7 C" i, r0 l
板子外设默认全部选择上
" |" L  ^$ ]7 E' m 4.jpg 7 W& [; P* [1 T7 }8 ]5 P  q
这里我先修改的时钟频率为250MHz3 l0 m8 R3 ~1 E6 q; J+ h  p9 B
5.jpg
( m! d5 W& T/ k4 h; ?5 J) w可以看到UART3默认就是在S分区,所以不用修改了
7 y3 h! ?. V% t# w 6.jpg % g8 i; |0 w! e& {1 @' G! q; \4 i
接着就是生成代码,这里会有一个警告,忽略就行了
1 H; m! W4 {2 Z+ W6 {. ] 7.jpg
$ I' |' k& E+ T% A
1 s  N2 i7 {/ i' L0 e  P# t% _1 H打开工程后可以看到一共有两个工程项目,S和NS,编译的话需要先编译S项目,再编译NS项目,因为NS会链接S的secure_nsc文件
( ]9 a' c: V# B4 F3 P 8.jpg
" s) t( c# [# {. R( S' I; F+ H5 P4 B: c# J4 d
在NS项目的main.c中,初始化最后添加一个printf打印代码 printf("STM32H5E5ZJ None Secure Run\r\n");
3 S4 g; [- c4 i; |# y( U) w7 C依次编译完成,烧录之前还需要配置芯片选项字,开启TZ
0 k9 v* G8 A9 A6 a% v" R 14.jpg & t$ T6 _6 e) P+ O- u  \) }
另外还需要修改flash分区,因为H5E5有两个bank,这里设置bank2为NS使用,这一点很重要,否则程序运行就会挂掉,因为新板子默认两个bank都是S。
+ P; t$ ]. X) L4 N: `& A 13.jpg ) i1 ^: l8 N$ b
然后依次下载S固件和NS固件,复位运行程序,此时发现串口没有任何输出。
% x  D8 {% a3 n& y8 L5 e3 k7 x7 H2 R5 O
  • 2. 串口打印初始化在NS分区,S分区控制NS分区串口外设的使用,可以限制NS无法使用串口打印5 K; N# E: `' \* x3 r

. [9 g9 r- T5 x6 W$ }# ?" ~- \0 ^, M. q! _7 \' t
因为在S项目中的MX_GTZC_S_Init初始化函数将UART3设置为了S分区使用,所以NS是不能使用UART3的+ O5 m4 C3 I. M0 S
11.jpg 5 O5 t4 [" m( T2 S, v, ~. `
将GTZC_TZSC_PERIPH_SEC修改为NS使用,另外还要修改串口输出的两个GPIO也为NS使用,确保UART3在NS是可以完全使用的
6 A. S& N: O+ s5 l+ K 12.jpg 36.jpg
0 O( Z+ V' a1 I. y$ L3 W+ P/ Z6 a重新编译S和NS代码,烧录重启后串口有了输出,所以可以通过GTZC限制外设在NS侧的使用权限。" j1 m3 R6 ?' M
15.jpg
6 f. {$ V  i+ ]
2 F! K" H4 E2 `
  • 3. 串口打印初始化在S分区,NS分区调用S分区API,实现串口打印
    . z; g9 A6 M: a5 ~: ~& Y; C
9 w- _% c) s9 \. z( L9 W/ @
: B+ a. Y1 q5 {# a. S" C
重新回到CubeMX,可以看到BSP选项中,可以把NUCLEO分配到S分区使用4 i1 }" i" V2 s- p- l
16.jpg 17.jpg
6 N7 z9 a, @! Q) n* E" Q8 p修改之后重新生成代码,把之前修改的UART3外设和GPIO都重新放回S分区使用。9 h  a6 k6 G) _( t
在S工程中添加printf打印3 y; d4 T3 s- d  c  b- A1 Y7 Y
18.jpg
! N0 O6 r7 _) V5 u5 ?: q* ~' C$ ]然后编译S和NS,此时NS编译会失败,因为之前在NS添加的log打印会报错,这里先删除掉这行代码,重新编译烧录运行
0 k, O9 z. i$ q" n( {, U/ O 19.jpg 8 |6 h# ?6 _, W" f* N4 k, b9 w. q" i* y
S工程正常打印log了
% I+ Y8 i# ?/ z9 T7 ^ 20.jpg . p/ Y6 o+ \, l7 a
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
22.jpg 9 |5 a) j( _: }1 a# g0 q
23.jpg
: F3 n' F+ R4 J然后NS工程添加调用
4 f% h2 M" O4 r+ w. v$ R! e7 N 21.jpg
: ~$ t$ N- ^  u* i4 \& n这里有个点需要注意一下,就是main中的系统时钟函数SystemClock_Config在S工程没有初始化,在NS工程重新初始化了的。
( ?. Y1 v3 @* e2 G6 m/ C0 IS启动初始化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
24.jpg
2 ?' Z. B+ }% p' L( y: ~, \然后编译烧录运行,S和NS都可以正常打印日志了
  g. a1 g& ~' n0 M' |7 T) N 25.jpg $ I7 n- g2 x3 @, K. o1 |

7 q: E5 \4 x' `* P) M, v另外还有一个比较有意思的点,因为H5E5有两个systick,那其实就可以两边都在systick中运行代码了- Y  g  H3 ^: J
37.jpg
4 Y0 |, ?& E5 e比如我在S侧添加一个systick中断点灯LED1,那NS侧也可以添加一个点灯LED2代码,两边都可以各自运行,只是S侧的优先级会高于NS侧。
& {% y" b2 m. ?; \. R/ _! A! Z 38.jpg # h4 W' y& K. U2 q3 B' m$ z3 K
) K& R/ ?0 `  l& {/ H. F. `7 J
关于H5E5的安全分区系统实验就做完了,实验比较简单,可以熟悉一下S和NS的交互使用,对于安全功能要求比较严格的项目还是很适用的。- E' S2 l. F- r) }) U
* |; \! }/ l% S
赞 1 收藏 评论0 发布时间:2026-10-20 15:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

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