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

基于STM32H5的DA之初体验经验分享(带 Trust Zone)

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:53
一、前言! z  [" Q% i; f: v
STM32H5 是 ST 2023 年新推出的产品系列,与以往 MCU 不同的是, STM32H5 推出新的 product state 功能特性以替代以往的 RDP 功能。
2 j7 U% Y) A1 K3 B5 r
) E. @1 p4 ~, W5 \! N! T- ] 微信图片_20240229165316.png
2 p$ K% J. u. ~, ^% `

# h4 v' I& f8 w如上图所示,product state 有如下状态 :
) u$ C% t8 T$ R. H. v
& l, t! `4 [9 I8 k+ t2 k# Q7 O
Open(0xED) : 完全 open 状态,相当于以前的 RDP0。! q; A* Y( |2 A8 }

5 M0 I& r( l. PProvisioning(0x17) : 此状态是专门用来做预配置的。 7 p4 q% h8 k- J: s& t/ O
- \2 v% Y! P! p7 Q4 C7 ^
iROT-Provisioned(0x2E) : 用于 STiROT 或 OEMiROT。) _2 s7 v* E) h7 t: _4 n9 ^
( G& y3 R$ k# ~/ n( K
TZ-Closed(0xC6): Secure 区域关闭, 相当于 RDP0.5(仅在 TZEN=0xB4 时有效)。
8 Q; ^8 c; s) V* |/ Z7 Y8 C7 E) N9 x0 T3 R& t, D
Closed(0x72): S 和 NS 区域均受到保护,这点有些类似于 RDP1,此时调试口没法对其直接访问,但可通 过 DA 打开调试口或回退,这一点有点类似于 STM32U5 上的可带密码回退的 RDP2。
% ]: T* P+ p* d/ h% N# K+ [; M
; d* A, b$ b+ `5 y  q6 gLocked(0x5C): 完全关闭芯片的外部访问,相当于以往 STM32 芯片的 RDP2 保护等级。
7 h+ q7 p: Z$ d5 g& [
: O, I  R% M: }3 \# H整体如下图所示:& p7 F( j1 ~( h5 n4 j
% {/ }' W' n5 L- Z: s
微信图片_20240229165313.png 4 \  p5 b2 ?3 r8 ^# {% ~/ U

0 D2 j: m3 }; ]" K  p+ b其状态切换如下图所示 :# _9 a6 c$ V( `
+ b4 t5 u7 R+ D0 U0 T0 I
微信图片_20240229165309.png 1 g- ~, o9 V( A4 A+ _" |

+ ^9 U! ]5 G: f/ A+ G- D# p5 z2 e/ g如上图所示,product state 从 open->provisioning->iROT-Provisioned->TZ-Closed->Closed 如此从左到右是可切换的,但是,要从右到左如此回退,则必须要经过 DA[Debug Authentication]过程。如上图所示,经过 DA 后,要么完全回退到 Open 状态,要么部分回退到 TZ-Closed 状态。
& R3 w0 k( Y% f$ d9 v, d) x. ^, I. H2 G! ^3 `9 R
所谓的 DA,就是通过向芯片提供证书(STM32H503 是提供密码),通过芯片的身份认证后,允许向 芯片发起 product state 状态回退,或者重新打开调试口请求(仅当 TZEN=0xB4 时)。
. s- }# C* c, G! q3 _
3 Y, M; a& T: {# p0 i. w' I
由于新的 product state 和 DA 的引入,所有 STM32H5 开发者都必须掌握 DA 的用法。因此,本 文档针对 STM32H5 初学者,演示当 TZEN=0xB4 时, 使用证书来完成 DA 过程。0 L) t" c2 ^. x  C

; R6 l, F4 L) I二、准备工作( }+ D/ A5 Q3 }$ l" W0 Z
开发板 : NUCLEO-H563ZI
5 S0 k, B: M( e: R) C
8 z$ h3 v3 d+ f3 B! N
微信图片_20240229165305.jpg ' _+ b: O7 Q: {& S; q* e1 @
: _5 z2 Y5 K" M7 t# u8 e, v5 _( I
软件包 : STM32Cube_FW_H5_V1.1.05 c1 Z5 {& P/ W
" c  D& _8 y% p6 ~( b& A
工具:
  z! D1 c+ _2 C! CSTM32CubeProgrammer v2.14.0
  B* O9 Y% p/ k7 K$ gTera Term 串口终端显示
3 n6 n* d5 @  ~! gTrust Package Creator(安装 STM32CubeProgrammer 时一并安装, 注意勾选)+ Q) i% }5 r- _7 i
IDE: STM32CubeIDE v1.13.0; ^" ~/ g+ B0 r2 o* t$ n4 J# P' p
STM32CubeH5 包我们需要将其放到一个没有空格没有中文的路径下,在本动手实验中,我们 默认将其放在路径 C:\workspace\目录下。! E  n; m. M, o* e. H* ~( p1 E
+ y% F2 R' J+ I5 h8 d/ i' |
三、生成 OBK 并测试5 U1 b0 h# {2 d% n) M
在 STM32CubeH5 包下的路径 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEOH563ZI\ROT_Provisioning\DA,在此目录下,已经包含了自带的默认 obk,密钥以及证书。其实 我们可以直接使用这些 obk 以及对应的证书和密钥,这里我们将重新生成一套,并测试它是否 OK。
% a7 j" r) S2 `+ S7 Q

. B1 l! a" @1 c3.1. 重新生成密钥对打开 TPC(TrustedPackageCreator)工具
( W0 a7 w' G% m. t1 u7 r9 Y8 \# K4 I1 v! `+ W. b0 m1 O
微信图片_20240229165302.png
  S/ u+ f7 T! C& F# s" q
. R: s4 q& x' g3 }& o在 xml file 处,导入 DA_Config.xml 文件 :: `+ \, B# c$ r) Y8 K- B& _* w" X
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Config/DA_Config.xml* A2 |- ^" A( `" R/ h. ]: x) q( |
如上图,在导入 DA_Config.xml 文件后,点击 Regenerate 按键后,将在 Keys 目录下重新生成公钥私钥对 :( n0 \" i& q% n) r# h" z! E  S6 Z

) [' E: H! @' n1 ^+ \% }4 v, n 微信图片_20240229165259.png
2 X5 u; ]$ o. @$ j

7 v3 d8 d3 S/ C  l& W; ]& f5 @( Q这组密钥对就是接下来需要使用到的密钥对了。
: J' ]6 K9 s3 j6 z9 Y  }+ o其中 :
# v* V) G' U# n8 `Key_1_root.pem 为私钥
! f" {# t% ?! t: _1 a& J! KKey_1_root_pub.pem 为公钥
, S8 m% c7 @4 V1 c
( p8 a' |: I9 V; O3.2. 生成 DA OBK 文件: x' b3 m6 P& B. g# Y0 @
接下我们将创建 DA 的 obk 文件 :9 U0 R- L) l: a6 J$ f, E

5 D! Y  C4 p' J& H$ t 微信图片_20240229165245.png
4 `" B3 i# }3 ]+ y; b; `
2 ?* y$ O8 {* D  o  f
如上图所示,继续在 TPC 工具中,在 Permission Mask 下,激活允许的操作许可,被激活的就是 DA 认证通过后,允许的操作. 然后在 Output File 处选择输出文件。我们使用默认即可。然后点击 Generate OBKey 按键,则在 Binary 目录下生成 DA_Config.obk 文件 :* d2 @0 P: e! f6 G( h  ~' O
1 S9 r$ z! k( A  y( q( N. l% {$ \
微信图片_20240229165240.png ) {' y1 }- s* L- Y: q" C

) N" M8 U* }% w* u# z- J+ F, |这个 obk 文件就是我们后续将来做 DA 预配置(provisioning)的 obk 文件了。0 H) v) V& E5 Q) m
* r4 Y5 {: ~. o; z7 U* X0 R
, A! h: F( j5 A. |+ ?
3.3. 生成证书* w8 _4 l+ a: h! J4 }5 O
接下来我们继续用 TPC 工具生成证书。
% A; p) L5 I) F: q& `2 @$ ~& n5 \/ u0 ^+ ?3 F: A( ^
微信图片_20240229165237.png # X6 @/ V7 m) U) v

8 p; p! a% v% F9 }; s) V  J如上图所示,在 Microcontroller 处选择 STM32H5-2M,在 Root Private Key 处我们选择之前生成的私钥文件 : C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Keys/key_1_root.pem* W6 I! I( `# B- V( O
# P( k/ F! n" ?; O
- F( R, w& d8 e1 L- h; L- [
而在Root Public Key处则选择之前生成的公钥文件:C:/workspace/STM32Cube_FW_H5 _V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Keys/key_1_root_pub.pem
3 w6 I9 i# K- D  V4 A/ e  C/ a6 R
( G% E3 r+ w/ q! n; b
然后在 Permission Mask 处选择此证书所允许的操作许可。我们将 Full 回退 to TZ,以及Secure/Non Secure 下的 Level 1~3 的 Debug 权限许可全部打开。+ M& v9 X$ [% T4 y( ~

, b$ ]' j, `: ?3 N6 {
在 Certificate file 处选择输出文件,我们选择C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/cert_root.b642 y- e7 N5 |0 B" ?4 h" B
即在 Certificates 目录下生成 cert_root.b64 文件,最后再点击右下角的 Generate Certificate 按键,最终在 Certificates 生成了 cert_root.b64 文件。
; \. n9 J! s4 c/ ^( p8 k: W1 U. W+ M6 ]( z- i! T- g- n- C
微信图片_20240229165233.png " q1 M5 B6 P6 h7 p" s% y/ o5 }
, s4 d% V1 y" W1 U( o% `4 @( c2 r6 s2 M
如上图所示,在 Certificates 目录下将同时生成两个文件 : cert_root.b64, cert_root.cert。5 K0 t8 B: Z' [- f0 C. ?) D( T
其中 cert_root.b64 就是我们需要的证书文件了,它就是根证书。它将在后续步骤中进行 DA 时将会用到。而另一个生成的文件 cert_root.cert,我们并未用到它。
0 _; I8 y. ]0 ^: |8 u# J9 \
9 k6 @) n3 Q% f$ o9 h6 h

  ~; \& F$ V+ J' e: \3 h3.4. DA 预配置 (provisioning)! ^9 Z9 e. S$ t* t6 L4 o, `
接下来我们将做 DA 预配置,在此之前我们确保使能 Trust Zone 功能,即 TZEN=0xB4。
& I5 W! M3 h/ D5 f7 a5 R$ q
( U7 L: E' a$ {; a2 k9 s& p! J& X! Q* b 微信图片_20240229165229.png 1 d+ F' ^+ C. _# E5 i5 n

& S9 w7 U( n" O, S如上图所示,使用 STM32CubeProgrammer 连接芯片,并将 TrustZone 打开。
, `3 a6 ~0 U# e* `然后将 Product State 切换到 Provisioning 状态 :) m1 Y; U7 ?# ~$ U
% h2 e: _- w- n0 d- V7 L5 F
微信图片_20240229165226.png
; B5 L* R0 s1 e6 ^
- j9 I3 @' r/ \* Z6 Q7 ~接下来正式做 DA 预配置…
) b6 `; Y  h0 d+ s# d  S% R
' I8 \0 E  y1 C/ d4 o8 b: g: S4 ?/ @ 微信图片_20240229165223.png
/ K  B( I& q+ N1 q$ x8 g1 @, E* M
$ o7 j" R- n$ o9 {如上图所示,在 STM32CubeProgrammer 左边选择盾牌图标,然后在上方选项卡处选择PROV,接着在 OBKey file path 处选择之前生成的 DA_Config.obk 文件 :( |# d2 G+ @2 v9 n. t( H8 p

: H8 n* d2 d/ H8 z
C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Binary\ DA_Config.obk8 [) _  ^3 R; p' s; C& r+ f2 V

/ b; ~6 B7 K/ z( D1 E
8 q3 g3 U* G, Z4 S
最后点击 Start Provisioning 按键…& @4 y" L8 I" Y# q
& D+ O& R/ ]9 M# p; {
微信图片_20240229165219.png
6 m. Z( t0 G8 }# j3 j/ `/ J& j! v' n3 A) L) b# i- Y
成功时,将弹出消息提示成功。此时表示,DA obk 文件已经预配置到芯片内部并且已经成功了。然后断开 STM32CubeProgrammer 的连接…9 U% f  t& Y7 Z9 ~9 p
! a! K1 d0 B8 e
微信图片_20240229165211.png
. r+ q5 C- }+ a/ e; q
$ d  |- f$ W1 h# |3 {- x如上图所示,点击 Disconnect 按键,确保 STM32CubeProgrammer 已经断开连接。接下来我们将尝试用证书做 DA 回退… " n4 m* s  ^1 ~* p! M

/ z3 b0 C5 e* m- B
# e3 O; i" T) r# }' G. f
3.5. DA 回退
# l; y3 x. d, t* u. t& _/ c
; P( @  w3 t- w8 `; P& E 微信图片_20240229165207.png 3 z3 s; ~7 g7 D5 r. a
- T% }/ x: P4 [4 L) o; D5 p
如上图所示,在确保 STM32CubeProgrammer 断开连接的情况下,左边还是选择盾牌图标,上方选项卡处选择 DA,然后在界面中点击 Discover 按键…
9 a" u7 j- U# b
0 t5 x4 t3 m8 Q/ C" W5 S
微信图片_20240229165204.png
% d& N: n2 n) v: X. j3 y; ^7 S1 G! k
6 o+ S) U  s7 l4 M# r5 ?( X
如上图所示,在接下来的界面中,在 Key File Path 处选择之前生成的私钥文件 key_1_root.pem:C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pe
3 E, Y. `" f0 }) F( {$ O; O( r
$ Q% Y# A9 R& }: r5 y如上图所示,在接下来的界面中,在 Key File Path 处选择之前生成的私钥文件 key_1_root.pem:C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pe2 D2 o0 R& B: Y4 i8 u0 w, D

. [1 p% e. p; X+ F& Q在 Certificate File Path 处选择之前生成的证书 cert_root.b64:C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\cert_root.b64 p' r! v& d/ t( B

3 ~; K0 F1 N$ T( D/ q& c& K% d5 d然后点击右边的 Continue 按键… # }5 |7 W& k3 l$ j7 E
2 T$ O: ?  Q4 C1 F7 G/ ]
微信图片_20240229165158.png
7 ^3 }) T' V4 H, ~  ?
" [$ m, j  s2 Z, {3 q, G/ X如上图所示,在下方新显示出来的界面内容中,在左边选择 Full Regression, 即你想要的操作,然后点击右边的 Execte 按键…" _6 d4 {  G2 N, x6 [/ H2 t
& B: k* N' @; D9 x$ `: ?
微信图片_20240229165152.png
9 l) f3 y( j, b$ g; n  O* \9 U
$ T, K( Q6 B' d& ?  j2 t- s9 x5 j
如上图所示,弹出界面显示 DA 成功。
( [4 D" G; R# q/ W: G7 O
- p$ [$ S  K" U$ X$ x; G/ s, Q! N这也就表示,之前生成的私钥文件 key_1_root.pem + 证书文件 cert_root.b64 正是匹配之前生成的 obk 文件 DA_Config.obk 的。
9 i1 u) R! O$ r. c& H. D3 i( z" n' S
其中 DA_Config.obk 文件和固件 hex 文件是要给工厂烧录芯片用的。而私钥文件 key_1_root.pem + 证书文件 cert_root.b64 则是需要保留,将来工程师需要它们来做 DA 回退和 DA 调试用的。: ^( D% }) G5 Z- Z2 o* c. e

% W7 y! S/ {3 Z" ?这里需要注意地是,如果上述 DA 回退未成功,则表示证书+私钥与之前预配置的 DA obk 不匹配,需要重新执行 3.1~3.5 节。直到 DA 回退成功为止,否则切记不要进入到下一步骤,不然很可能会由于证书不对无法回退导致芯片废掉(除非用户代码可以执行回退)。
. E0 }* F1 j4 ?5 O8 U! m* w& b- O7 P' A9 ~
" P' h6 N1 s5 [6 i' H% e) l
四、运行一个程序并 DA 调试  T0 m/ w; i. @' C2 {) f
4.1. 在 Open 状态下运行一个示例程序
1 l8 d, d* V- T5 l6 G# X
使用 STM32CubeProgrammer,确保 product state =Open, TZEN=0xB4:) b0 E9 H1 M7 K# K7 d6 e# V' J
" @& C* [- e; B& i6 m
微信图片_20240229165146.png
8 c9 D: L  b$ c
* ?2 d: _) @9 [4 D' }  W% s并确保:SECWM1_PSTRT=0x0 SECWM1_PEND=0x7F, SECWM2_PSTRT=0x7F SECWM2_PEND=0x0:
' ]; k# R' D3 V$ P. I! v! x4 @2 [/ m* i- w  N# j2 q0 c5 p% \
微信图片_20240229165142.png
- P  |. I5 h: D' @+ ]5 O3 @$ I0 N. c* e
然后使用 STM32CubeIDE 编译 STM32CubeH5 包下的示例工程:STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Examples\GPIO\GPIO_IOToggle_TrustZone\STM32CubeIDE 分别先后编译 S 和 NS 工程并烧录对应程序,并复位运行。正常情况下,可以看到板子上 LD5(橙色), LD6(绿色)两盏灯在来回闪动。即表示测试程序运行 OK。
3 l0 x; X: d: }0 R: B. P9 U, Q3 h; ~
; Z  D! B2 p* j
4.2. DA 预配置
4 k9 Y' y6 v7 g6 H- j' F1 T7 _接下来我们参照之前的 3.4 节,将 product state 切换到 provisioning 状态, 然后进行 DA 预配置。
7 |# b" x1 c( }; k, _9 c' R, ?6 N. A
1 N: `1 s6 |0 v- e4 x: Q/ P 微信图片_20240229165137.png : M0 d$ @9 e% H4 y
, R& E( F/ N( b' D& X2 ?
如上图,切换到 provisioning 状态。 7 O; a/ X( n4 |% M/ s* ?, J

6 z8 x. A9 {  X0 |! F 微信图片_20240229165132.png
0 `* F0 c! b- u! ?) u
/ P8 U+ q; h+ K) Q3 n+ A如上图所示,导入之前生成的 DA_Config.obk 文件,然后点击 Start Provisioning 按键,进行预配置。/ {% n7 w8 ?" A  X" g3 u% l
  q' T# y. \8 g! a6 H0 U9 z
微信图片_20240229165128.png
+ C0 B) H% Z, Y% _2 h" K0 g' w$ o# p
弹出上面显示模式,则表示预配置已经成功。1 e% {9 }  ~, B
. F" P% n( b2 H3 v$ ]$ o
6 |! R2 m, X- A" U
4.3. 修改状态到 Closed 状态
  `6 v* U! C% D: B3 P: t5 b) J9 j5 T) z- @. D* c9 m: S+ Y2 @. b
微信图片_20240229165124.png
* }8 D* \: @/ r! g2 ~& C9 j$ z9 h" ^
, f* c  {% i  [% T+ w, [
如上图所示,接下来将 product state 修改为 Closed 状态。此时 ST-Link 连接会自动断开,表示芯片内部调试口已经自己关闭了。
0 r7 n+ _- a1 a$ O9 u3 G# }$ v. h' J) {此时查看板子,LD5、LD6 两灯依旧来回闪烁,说明程序在 Closed 状态下运行正常。只不过此时调试口是连接不上了。/ s- G$ [& V0 W+ g5 O+ Q
; |, K7 o( j) P5 e& l1 Q
4.4. DA 调试
9 p% V+ p% {0 R. w4 W4.4.1. 使用 STM32CubeIDE 调试 NS 工程
: O6 S4 b" f3 q% a- t8 w/ G; l
在 STM32H563 处于 Closed 状态下时,SWD 口默认是关闭的,此时是无法调试代码的,若想调试代码,必须得通过 DA 认证重新打开调试端口,好在这一功能已经集成在 STM32CubeIDE 中了。接下来我们将使用 STM32CubeIDE 调试 NS 工程,在 NS 工程的 Debug Configuration 中, 在 Debugger 选项卡下 :
. [% r( N5 T: m0 W8 H
: b3 l" O' b: b3 O 微信图片_20240229165121.png , v3 s5 l9 D: r# _4 r2 j

" @! R! t; S2 Q: E& A+ J如上图所示,在 Reset behaviour 的 Type 下,选择 software system reset, 然后在 Debug Authentication 下勾上 Enable,在 Key path 后面选择之前生成的私钥文件 : C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pem,在 Certification path 后面选择之前生成的证书 : C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\cert_root.b64, 然后 Permission 后边选择 Debug Non Secure L1,然后点击 Debug 按键…
/ F+ Z% l4 R$ b7 l) _" M$ s
7 \: y8 A6 u$ d/ U9 Q3 E 微信图片_20240229165116.png
( P+ O8 Q# |4 r" L; ^" y- x  L
# P8 {6 k  {6 a$ E( M  i如上所示,程序在运行在 NS 工程的 main 函数开始处则停下来了,接下来你可以选择单步调试...; I0 W5 v  P- P' [' R( Z+ y" t
* C7 M( m4 p6 M  K" ?. t7 A
4.4.2. 使用 STM32CubeIDE 调试 S 工程! q: j: y* x5 K1 M4 D, K
S 工程的调试配置有些许差异。
1 b3 Z$ f  f5 R) @! p6 t1 F' u* u5 q! _  S/ t2 H- l( k7 d& H
微信图片_20240229163237.png
* t0 E- f5 `& e- o4 Y
/ Y/ L; O+ v; l! d7 J. l  C2 i如上,Reset behaviour Type 为 None,同样在 Debug Authentication 下设置之前生成的私钥和证书,Permission 变为 Debug Secure L1。' |& q$ g8 s6 T  h* W
6 t8 }8 y7 g6 }6 M8 Z
微信图片_20240229163234.png 1 _; I8 O% m# W0 w

- ]+ P: N; h) i. ~然后拖下来将 Verify flash download 之前的勾去掉(如上图所示)。# |( S$ b0 o0 E- Q1 w' T/ E$ c6 Q- A
3 P+ ^, t# s4 V5 p: s, L* t
微信图片_20240229163232.png ' v& `! a6 T$ N- K. H

: S3 b) f7 o& ?( n如上图所示,在 Startup 选项卡下,在 Load Image and Symbols 列表中选择当前工程的 Image,然后点击右边的 Edit…按键,然后在弹出的对话框中将 Download 前的勾去掉。点击 OK、Apply、并 Closed、关闭当前窗口。接下来在 S 工程中的源文件中的 xxx_it.c 源文件中的 systick 中断入口处设置一个断点, 如下图所示:
8 U' t7 k* C# O- K9 f! v4 V. b2 \! R8 B% C6 O+ m
微信图片_20240229163228.png
% v2 L& Q  e/ R$ R
( `* T6 J# j) p. m$ L 微信图片_20240229163225.png ) h8 z: c9 U! j9 a" J
1 O0 m$ G. |0 ^7 P% @+ c8 D2 F
微信图片_20240229163222.png
1 e5 K/ Q, }8 K) R/ n3 ~1 K2 |
: a  j+ i5 M0 K% d% C4 R如上图所示,程序运行在断点处停下来了,接下来你可以单步调试 Secure 工程了。这是一种完全没有破坏现场的调试方法,适合当出现问题后,直接去查看出现问题的代码行。当然在调试 Non Secure 工程时,你也可以按此方法来配置。也可以达到不破坏现场的效果。
. M- y" U# V; x$ b1 U4 o8 V  X% G& E: H/ M, @" a
4.4.3. 在其它 IDE 中进行 DA 调试3 q1 N; V7 A. H$ `* r6 q4 r
由于其它 IDE 当前最新版本还并未将 DA 过程集成到 IDE 中,因此,需要利用 STM32CubeProgrammer 进行 DA 认证通过之后,才可以用 IDE 进行调试。
* o$ Y) c0 t) g  n6 H! K1 C8 V% [  R' n
接下来我们将使用 STM32CubeProgrammer 通过 DA 来重新打开调试口。
5 l5 P, R8 T, }) o$ O  ?# e  ~6 V9 @! ^/ m5 a
微信图片_20240229163219.png
" Y# S6 J" b2 }. F# w
3 D5 I2 T* A7 H' ]在断开连接的情况下,在 STM32CubeProgrammer 中,选择 DA 选项卡,然后点击 Discover…
5 ~- o9 |2 _/ h9 L0 ?
4 c" K7 P6 I  Q0 ` 微信图片_20240229163215.png
% n/ X0 j- I8 n3 Y# v1 i. J/ c9 ~4 c: m' i3 B# i
与 3.5 节类似,在上图中,选择之前生成好的私钥文件 C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pem,以及证书文件 C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\cert_root.b64,然后点击 Continue 按键…
- u# S5 p  K7 [/ G3 p% i) y
% Z) f. \0 l7 B" j+ |) p 微信图片_20240229163212.png
3 n' G4 X1 T( A' @. V% ~! j/ r) D/ `* K/ H+ @. P
如上图所示,在下面新显示的内容中选择 Non-Secure Intrusive Debug(Level 1),然后点击 Execte 按键… - ^# S1 K0 ?& R) [
8 B6 j7 i3 _9 |% ^( W! g
微信图片_20240229163209.png 0 R5 M8 D/ e* Z6 @* i3 Y6 c

1 W; j  G9 l- N* M  I: C' |如上图所示,表示 DA 已经成功,调试口已经重新打开。然后断开 STM32CubeProgrammer 的连接。
& S: z  r( X1 ?! q+ }+ X7 m
# C0 A* a: B% Z# j2 n7 e7 m
接下来就可以选择你所使用的 IDE(如 Keil、IAR)调试 NS 工程了,如下图使用 IAR 调试 :) D/ ]3 O+ y4 E

6 R0 _2 y5 W0 O5 n; D- u 微信图片_20240229163206.png 5 s) U% I6 g+ e+ Z7 J
* {' k% H) k) f+ I; x1 X
如上图所示,选择 Attach to Running Target 可直接 attach 上去查看当前运行的代码行。当然在之前 DA 步骤中,你也可以选择调试 S 工程 …% s8 N2 A5 D% _5 Z- i

7 O7 n/ A- d: n% g$ E6 D  b0 F/ B 微信图片_20240229163203.png
, F- I9 R" ?/ ^! O
/ Z- U6 _; g! K/ G4 M4 H. {如上图所示, 在下面新显示的内容中选择 Secure Intrusive Debug(Level 1), 然后点击 Execte 按键…$ J2 o8 X- w& H6 V! V+ o0 b

( W" ^) r( c. l/ C1 _; H) B: r 微信图片_20240229163158.png
, I5 C) ~; w+ h$ r" H. }; u! a7 A7 g/ V. Q1 ]3 @( J
如上图所示,表示 DA 已经成功,调试口已经重新打开。然后断开 STM32CubeProgrammer 的连接,接下来就可以选择你所使用的 IDE(如 Keil、 IAR)调试 NS 工程了。
  T/ W! Y& ^- ]2 q9 `
/ o2 {' ~$ ~5 J2 Q2 F$ m1 s
$ v, Y1 z0 o. r+ P; j- {
五、还原
/ j) k; z4 d' N, E0 b8 S$ z+ H还原的过程参考 3.5 节,步骤完全一致。最终还原成功后,全片 Flash 内容已经擦除。最后,将 TZEN 直接修改为 0xC3。
; i$ R. ~0 y: l4 C
' s: ~# p/ y( j6 W. U7 `  G( \ 微信图片_20240229163155.png
6 c/ l: C' o: c" _' ~( e- H
: Y& w: p- a8 _" c2 E/ K至此,芯片完全恢复成原始状态。另外,DA 回退过后,之前预配置的内容也自动清空了, 因此,后续还需要重新进行预配置 (provisioning)。8 ]! A9 v: O  L% G8 ^

9 P( s7 a- [7 p' [8 M. Z2 m
+ _3 K, l5 Y' N转载自: STM32
: q0 A' j% w% h7 t0 M9 P5 v! t如有侵权请联系删除$ o$ P6 F- N7 t1 b

' _& E, \4 c( g
+ \7 p; h; Z  S/ i* ]1 m) c$ n
1 收藏 评论2 发布时间:2024-2-29 16:53

举报

2个回答
xu@xupt 回答时间:2024-3-3 12:31:34

值得收藏

小可s 回答时间:2024-8-30 15:03:11

按照操作指南操作,disconver后卡死无法disconver使用DA回退,这可能是什么原因导致的

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版