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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:53
一、前言& N! i) w4 G! T" s# _
STM32H5 是 ST 2023 年新推出的产品系列,与以往 MCU 不同的是, STM32H5 推出新的 product state 功能特性以替代以往的 RDP 功能。
/ P- n! r; z- [$ m( s5 x& X
/ o9 P4 e! n! B 微信图片_20240229165316.png
7 A2 r) h* d, F( ^6 o4 q
' s0 c- I6 J$ @$ |7 k( O
如上图所示,product state 有如下状态 :
" j$ f. C6 n, ]  S3 a! }$ {) ^
: z& W% [. [7 h0 v* ~( l
Open(0xED) : 完全 open 状态,相当于以前的 RDP0。
2 j  Q; c4 O1 m4 E: i" ]: q7 r7 ]
. @% L4 W% a5 G1 q. u/ c) m
Provisioning(0x17) : 此状态是专门用来做预配置的。 % R7 e& p$ O' M1 Z7 Z
' D0 |2 L- p- ]+ X$ V* h) U$ N0 D
iROT-Provisioned(0x2E) : 用于 STiROT 或 OEMiROT。
) B# f/ C5 k* M- `3 ]

! g7 T5 V0 j9 ?# d8 F, H) @TZ-Closed(0xC6): Secure 区域关闭, 相当于 RDP0.5(仅在 TZEN=0xB4 时有效)。
5 v% c) @& {. z/ z& M2 g5 ~& z2 p; n1 S" M* W: e/ G
Closed(0x72): S 和 NS 区域均受到保护,这点有些类似于 RDP1,此时调试口没法对其直接访问,但可通 过 DA 打开调试口或回退,这一点有点类似于 STM32U5 上的可带密码回退的 RDP2。
% R2 S& h/ F! p0 S( B0 w% u" b  R1 {3 ?
Locked(0x5C): 完全关闭芯片的外部访问,相当于以往 STM32 芯片的 RDP2 保护等级。2 \- T5 @3 r* c" U- `  }
9 ^5 i- [* t$ J- Z/ Y
整体如下图所示:
0 n5 w) ^1 \2 C( w) Q; W, Q
' `5 y. Y+ O- B- [4 r8 W* t/ t$ \4 { 微信图片_20240229165313.png . q3 c: S/ i& I5 k# n' Y
/ V6 _3 d; ^  Y1 ?; v
其状态切换如下图所示 :
, S, D" o2 R: z! x3 C
2 ]0 _5 V. Z3 u5 X6 E" Y6 f 微信图片_20240229165309.png ! [) Z, a$ G6 \: U

# K4 Y9 |" ?" I6 G如上图所示,product state 从 open->provisioning->iROT-Provisioned->TZ-Closed->Closed 如此从左到右是可切换的,但是,要从右到左如此回退,则必须要经过 DA[Debug Authentication]过程。如上图所示,经过 DA 后,要么完全回退到 Open 状态,要么部分回退到 TZ-Closed 状态。# X9 e  c- k/ I2 j# ^4 W

! ^; L% Y6 T. x9 M5 Y所谓的 DA,就是通过向芯片提供证书(STM32H503 是提供密码),通过芯片的身份认证后,允许向 芯片发起 product state 状态回退,或者重新打开调试口请求(仅当 TZEN=0xB4 时)。
9 O! n6 {; m/ `# G0 S5 r

( H7 i: `6 O" n! M由于新的 product state 和 DA 的引入,所有 STM32H5 开发者都必须掌握 DA 的用法。因此,本 文档针对 STM32H5 初学者,演示当 TZEN=0xB4 时, 使用证书来完成 DA 过程。/ {2 }) Z, Y8 ^/ w2 E8 I0 R
3 K* _% P9 Z; n" e) u$ V
二、准备工作
" C, {; v  e6 r- T+ j开发板 : NUCLEO-H563ZI ! ?" y* d' r6 v* P% j+ t6 e
* c2 ?) ^7 b$ ]+ g) u' ~
微信图片_20240229165305.jpg 7 \; e, O; H2 i4 R; z1 K# R  b! f

, |- R* u0 R7 V9 X; K软件包 : STM32Cube_FW_H5_V1.1.0) U( ^4 n$ R$ J: D- Z

7 B5 Q* {# J/ ]工具:- ~! }# }& z5 E2 E. A& K0 r* L, f
STM32CubeProgrammer v2.14.0
5 Z4 N% K/ p  p$ G( hTera Term 串口终端显示" ]! @0 p, u) |6 M( a% R- Z
Trust Package Creator(安装 STM32CubeProgrammer 时一并安装, 注意勾选)  P2 |8 X* H* P! ^$ t* g
IDE: STM32CubeIDE v1.13.0
  C6 w9 [% o! y' c: w- s) P: j2 S
STM32CubeH5 包我们需要将其放到一个没有空格没有中文的路径下,在本动手实验中,我们 默认将其放在路径 C:\workspace\目录下。/ z7 z+ Q3 S! m$ H3 [2 u1 \

9 h6 W/ b6 o0 g5 X, L9 ?3 j三、生成 OBK 并测试
7 @+ d7 P$ d, _; X( s: A; J9 H在 STM32CubeH5 包下的路径 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEOH563ZI\ROT_Provisioning\DA,在此目录下,已经包含了自带的默认 obk,密钥以及证书。其实 我们可以直接使用这些 obk 以及对应的证书和密钥,这里我们将重新生成一套,并测试它是否 OK。
8 q( l9 r' \5 h

- W1 S' N; i# q; w( r1 i3.1. 重新生成密钥对打开 TPC(TrustedPackageCreator)工具 2 G% b4 ^* {3 q" b. v1 K: }, O6 }, _

) S2 _- x$ A3 w) k3 s" r. o% _9 S/ F+ { 微信图片_20240229165302.png
# B: y( Q8 h. e& b+ r, F
( J$ I% C2 e/ L+ B) y5 S在 xml file 处,导入 DA_Config.xml 文件 :, d0 k4 v3 L0 n/ t3 r
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Config/DA_Config.xml$ p7 n$ N* r5 z( Y$ y7 l
如上图,在导入 DA_Config.xml 文件后,点击 Regenerate 按键后,将在 Keys 目录下重新生成公钥私钥对 :
0 k' x. P2 ]4 n3 ^  c% n5 c; v+ q6 W
微信图片_20240229165259.png - `$ z% ^& J0 J+ v" ^: e' c  G
' T' O1 L% \0 i6 Y! m
这组密钥对就是接下来需要使用到的密钥对了。2 z4 A+ ?5 r' o  g7 t5 f
其中 :: D0 h) i4 V" B* r' [
Key_1_root.pem 为私钥
) b7 V* e8 Z6 ~2 a- D9 S5 O. v4 |Key_1_root_pub.pem 为公钥
9 a# p% _* b' P* D4 E. C6 n9 t* @& o, Q: T; p7 ~. e
3.2. 生成 DA OBK 文件
5 [: b$ Z3 y+ o0 h: \接下我们将创建 DA 的 obk 文件 :
; B8 J) H2 q- v! J) g4 O8 B. T) E0 G. k3 y4 s: P
微信图片_20240229165245.png
6 `( B( h7 M8 e: x3 x. A% T3 J( Q

9 |" {  X; l& w7 X* ~8 Z1 A如上图所示,继续在 TPC 工具中,在 Permission Mask 下,激活允许的操作许可,被激活的就是 DA 认证通过后,允许的操作. 然后在 Output File 处选择输出文件。我们使用默认即可。然后点击 Generate OBKey 按键,则在 Binary 目录下生成 DA_Config.obk 文件 :% `4 F$ x! s4 u& W

; d6 i9 s% s% b1 g2 R" @0 G+ m 微信图片_20240229165240.png 4 n. C/ B  p* H4 q5 k$ p
) U' x3 u0 ]: s5 `# u
这个 obk 文件就是我们后续将来做 DA 预配置(provisioning)的 obk 文件了。1 [, Z, l: |5 n+ m" Q. ]

* M6 @- B& _0 \' F! z2 d2 E
7 ]0 V5 V; ^8 t
3.3. 生成证书
+ C0 e/ c# Z" @; B' ?接下来我们继续用 TPC 工具生成证书。
. ]( C* P& F6 T5 r% @* K, Y! \+ d* ?9 l6 A' q
微信图片_20240229165237.png 3 \! m' h8 c4 P3 `; L
  \6 f+ V- N. v  R
如上图所示,在 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
% w* P  i: Y; U+ Y
& v) P. L7 o5 Y, g2 ^1 E! s
: j! K9 u) o# d1 h9 d7 A
而在Root Public Key处则选择之前生成的公钥文件:C:/workspace/STM32Cube_FW_H5 _V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Keys/key_1_root_pub.pem8 x4 B- s' c! m2 {# Y9 v9 f
# z# O3 Z+ u0 ~5 L6 Q4 C
然后在 Permission Mask 处选择此证书所允许的操作许可。我们将 Full 回退 to TZ,以及Secure/Non Secure 下的 Level 1~3 的 Debug 权限许可全部打开。3 C6 g9 \7 @" H* P4 S/ @. h3 M
# T: Y- \3 P4 x  k/ X
在 Certificate file 处选择输出文件,我们选择C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/cert_root.b64
8 Q, ^+ A" P+ U8 x即在 Certificates 目录下生成 cert_root.b64 文件,最后再点击右下角的 Generate Certificate 按键,最终在 Certificates 生成了 cert_root.b64 文件。
" e% ~5 @( w' C! ^" q
- f# K* F7 d# K; X( w' A& N0 M' h 微信图片_20240229165233.png
; G5 q- s5 }2 I9 p

; [; s  q( p$ U: t如上图所示,在 Certificates 目录下将同时生成两个文件 : cert_root.b64, cert_root.cert。
4 _6 a! U! @( t4 n, q4 Y, o. N其中 cert_root.b64 就是我们需要的证书文件了,它就是根证书。它将在后续步骤中进行 DA 时将会用到。而另一个生成的文件 cert_root.cert,我们并未用到它。
, C; l6 H0 E& L( U( n" q; t# u+ Q4 c2 N5 ?
( p! g& ?2 u7 t1 _/ \1 K
3.4. DA 预配置 (provisioning)3 @7 f2 S" z/ ?8 m
接下来我们将做 DA 预配置,在此之前我们确保使能 Trust Zone 功能,即 TZEN=0xB4。7 b3 v5 I3 |; P' w9 H* v

4 Z, Z' o# N; b 微信图片_20240229165229.png
4 ~0 b  r3 V' {% I) m1 H

6 s+ O6 S5 h8 a5 I如上图所示,使用 STM32CubeProgrammer 连接芯片,并将 TrustZone 打开。/ M3 e$ w# y+ M* q) L% J. l
然后将 Product State 切换到 Provisioning 状态 :  g0 O+ t) z  N& b# }% }. d
' ?' o* P$ |( L8 G4 x8 d# n) R
微信图片_20240229165226.png
# \4 [! U. n! v1 S8 `) i3 X# @3 l2 w' n; q3 f! \( M
接下来正式做 DA 预配置…. a9 O9 s; v8 ?8 D2 b" O3 X; ^% M9 V- v

8 [) ~" S; H% ]* E) s 微信图片_20240229165223.png
5 z: @; n9 J' j& R% p4 O( }1 }
5 [6 g% b. T" i' z" X2 Y; I: o如上图所示,在 STM32CubeProgrammer 左边选择盾牌图标,然后在上方选项卡处选择PROV,接着在 OBKey file path 处选择之前生成的 DA_Config.obk 文件 :
) R, b. p$ y, T! I. b; a2 P$ U# ^
) h- }1 f8 c7 l8 r( B# L0 _- ]
C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Binary\ DA_Config.obk. U# L" X& q5 q! R+ R! @5 @# A2 n* u8 K
, R$ K. W% E  ]$ ]) x
- {9 Y8 y( r7 j( H* |. e6 n
最后点击 Start Provisioning 按键…+ j! m8 T1 o& g8 M& h% d
3 P, o6 @' S# V% Z0 B! G
微信图片_20240229165219.png
3 y, ^' Z  I; D) ]5 Q" Z1 v( l$ ~5 Z2 ]" W9 a, J# k
成功时,将弹出消息提示成功。此时表示,DA obk 文件已经预配置到芯片内部并且已经成功了。然后断开 STM32CubeProgrammer 的连接…! ]. `' G2 V( o+ t! @

: d. V; d3 F) t% _+ V, |$ W- S: V 微信图片_20240229165211.png
1 g! |7 _$ }5 X8 ?) _; Y4 D4 C2 L: D( v1 J  p
如上图所示,点击 Disconnect 按键,确保 STM32CubeProgrammer 已经断开连接。接下来我们将尝试用证书做 DA 回退… - W+ `. ^" [) W* ]7 k# K. t
( D$ v' b- H% |- x2 s

6 S- @6 X% S2 x6 z4 b* ]& M; D' l8 A3.5. DA 回退. k% l! }( e1 X9 }/ N9 C) J0 Q. f

! W4 c- [3 T  x: f: Q8 S 微信图片_20240229165207.png 6 F- u* X; n9 c& k; S
" g, N4 B' K( z  s0 k
如上图所示,在确保 STM32CubeProgrammer 断开连接的情况下,左边还是选择盾牌图标,上方选项卡处选择 DA,然后在界面中点击 Discover 按键… 7 O! G9 k. E  z+ V3 l5 r* _, q
6 U2 F* y, ]! C" h& A
微信图片_20240229165204.png
1 A. V6 |* R. t( Y8 i$ s
9 L- |' e8 g  C1 n9 B- O
如上图所示,在接下来的界面中,在 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
2 R+ Y0 f7 B) m0 I* ~# Z+ v" n/ [7 Q5 T: Z( ~7 s* F' ]: M
如上图所示,在接下来的界面中,在 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
: ]1 w; \. A# c; V2 r. p, j  b3 w2 C& Y, {; x8 F# ?) s2 G
在 Certificate File Path 处选择之前生成的证书 cert_root.b64:C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\cert_root.b6; i( v5 R" [0 v3 ?
3 O1 F- ]( H9 U
然后点击右边的 Continue 按键…
# m+ l" J+ e' O9 @% O8 j& q- O# I( c9 f6 X
微信图片_20240229165158.png
4 \! Z: B$ g; s# S- x# r4 P  I5 S- D' Z
$ D: ^9 U3 A; _, q  {, B9 h如上图所示,在下方新显示出来的界面内容中,在左边选择 Full Regression, 即你想要的操作,然后点击右边的 Execte 按键…
6 r' M$ @9 c7 f7 C1 y3 S" o
# \0 u" E+ H: b4 O
微信图片_20240229165152.png
0 M3 l4 j: `& V- _
- c2 s. T) j# E2 u, C+ y8 [2 S+ b/ H
如上图所示,弹出界面显示 DA 成功。5 G$ _7 E$ X( J1 `" b% N
5 F! g3 j! ^& x6 C) n
这也就表示,之前生成的私钥文件 key_1_root.pem + 证书文件 cert_root.b64 正是匹配之前生成的 obk 文件 DA_Config.obk 的。
/ _/ Z1 {0 @6 N9 C+ {- i9 p5 }  G
; K  B1 [  h, g' B其中 DA_Config.obk 文件和固件 hex 文件是要给工厂烧录芯片用的。而私钥文件 key_1_root.pem + 证书文件 cert_root.b64 则是需要保留,将来工程师需要它们来做 DA 回退和 DA 调试用的。
4 B& x3 [4 v) M/ _( B2 ?. Z+ Y7 ]; m( i) @7 V% C  h
这里需要注意地是,如果上述 DA 回退未成功,则表示证书+私钥与之前预配置的 DA obk 不匹配,需要重新执行 3.1~3.5 节。直到 DA 回退成功为止,否则切记不要进入到下一步骤,不然很可能会由于证书不对无法回退导致芯片废掉(除非用户代码可以执行回退)。
" L8 a6 D7 {# [4 O, W1 o0 _# D! M! R! a, `/ C2 @3 z

, u* Z4 y% r' H# z0 h& G四、运行一个程序并 DA 调试$ w$ S; a% Z1 b; c
4.1. 在 Open 状态下运行一个示例程序

: x! u4 ]7 e; u! q8 f5 v6 V使用 STM32CubeProgrammer,确保 product state =Open, TZEN=0xB4:3 x/ k, a8 m( k8 d) _, Z

7 v5 T$ f; ^4 y3 N% o 微信图片_20240229165146.png
$ u8 \' Z( p3 T/ ]/ m4 e
9 h0 Z* B+ E6 V5 A5 O7 U1 m并确保:SECWM1_PSTRT=0x0 SECWM1_PEND=0x7F, SECWM2_PSTRT=0x7F SECWM2_PEND=0x0:
. m: W- m5 P' j) h1 w% V/ }" K' {% m5 ]0 x; I( U$ K. L
微信图片_20240229165142.png % u+ f/ f" K8 P

7 Z# ^. u1 C8 [% c然后使用 STM32CubeIDE 编译 STM32CubeH5 包下的示例工程:STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Examples\GPIO\GPIO_IOToggle_TrustZone\STM32CubeIDE 分别先后编译 S 和 NS 工程并烧录对应程序,并复位运行。正常情况下,可以看到板子上 LD5(橙色), LD6(绿色)两盏灯在来回闪动。即表示测试程序运行 OK。0 a' P; Z( C  ?" j2 n
' ^& c% D' B3 i7 z4 Z+ z. n* O. p( O

5 d* c+ R2 P8 F$ W+ g4.2. DA 预配置
. y% i; [  l7 b1 j* i, d# N接下来我们参照之前的 3.4 节,将 product state 切换到 provisioning 状态, 然后进行 DA 预配置。 % c% K' n# B9 q; l( w2 `
5 _, ]: y3 Q( A. h/ ^
微信图片_20240229165137.png 4 I# W* c2 ^* ?" g" x3 Q0 g% r
) a  S5 w8 r: H8 Y3 Y# I" q
如上图,切换到 provisioning 状态。 5 Y# f& P1 X- B6 E- h

( B1 h# {( g" N4 _+ v+ |/ O 微信图片_20240229165132.png
5 O) [# _. y) U7 n0 F4 {. D
. N3 R  @' g. T& |$ z如上图所示,导入之前生成的 DA_Config.obk 文件,然后点击 Start Provisioning 按键,进行预配置。
, A& I* u2 g4 d* t( o5 N
3 Q) A" `0 O* f5 G. { 微信图片_20240229165128.png & j, o* j( c5 V" B& ~5 E

- V7 l9 g8 ?- _" ^8 L弹出上面显示模式,则表示预配置已经成功。% Q% r( V! k: U3 j* v6 D& w- x0 C

0 M1 u! R5 x& F' P$ r6 d

) f1 G9 F. \4 B9 l9 E% l7 @4.3. 修改状态到 Closed 状态 % W0 `: ?: A& Y) Y" k: {9 t3 {3 C
2 `6 p# n* J) ?* ?, X8 Z# ], [
微信图片_20240229165124.png 2 f4 ~+ P! R1 y7 }- k

" \  c* w" ~5 W3 @2 T& ^6 S如上图所示,接下来将 product state 修改为 Closed 状态。此时 ST-Link 连接会自动断开,表示芯片内部调试口已经自己关闭了。
3 P) a! z$ Z5 p" R5 w1 y1 P2 m6 `此时查看板子,LD5、LD6 两灯依旧来回闪烁,说明程序在 Closed 状态下运行正常。只不过此时调试口是连接不上了。
1 {7 N6 u% Z$ E) \+ f2 i: b, S# H# ^5 v  Q. l- P8 X# V$ Z9 p: Z; o( v
4.4. DA 调试
3 P% v- y+ z- h5 a2 x4.4.1. 使用 STM32CubeIDE 调试 NS 工程

3 W7 x; C1 k! j  \" y( g& B在 STM32H563 处于 Closed 状态下时,SWD 口默认是关闭的,此时是无法调试代码的,若想调试代码,必须得通过 DA 认证重新打开调试端口,好在这一功能已经集成在 STM32CubeIDE 中了。接下来我们将使用 STM32CubeIDE 调试 NS 工程,在 NS 工程的 Debug Configuration 中, 在 Debugger 选项卡下 : # O% b2 f9 a! W8 @% s4 b  ^

8 p. J" v6 I* y# \8 B; K! f 微信图片_20240229165121.png & X" E3 Z2 h0 y7 r% r
* ]& C2 j; N/ g/ Y; A
如上图所示,在 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 按键… ' m$ p! g+ o* V( ?' H9 [1 G4 ?) J
2 }! P* M) Q) o! c2 n) ^2 V
微信图片_20240229165116.png
5 n5 m: h) [2 N( O; R; a5 H1 y$ L2 G8 h2 D4 D$ k& H" ^7 l
如上所示,程序在运行在 NS 工程的 main 函数开始处则停下来了,接下来你可以选择单步调试...) ?- D0 s* p* j0 ]2 U6 L. B

( ?" Z' I" l- }* `/ U
4.4.2. 使用 STM32CubeIDE 调试 S 工程
" f! A6 Q) j2 _* C6 ?$ |( n/ {S 工程的调试配置有些许差异。
# \. m$ o4 `. n% o& `: C5 }8 N6 f/ y5 U
微信图片_20240229163237.png
5 z* ], T( @6 n: s8 U" P3 f4 ~" @9 H8 }
如上,Reset behaviour Type 为 None,同样在 Debug Authentication 下设置之前生成的私钥和证书,Permission 变为 Debug Secure L1。
$ t8 a+ |0 m. a$ I7 N6 S8 U# b$ a2 z% P9 v5 D. p* W
微信图片_20240229163234.png
: t6 i* l! v6 R+ h1 V
; `9 \9 v, D, N# e/ Y& R/ w然后拖下来将 Verify flash download 之前的勾去掉(如上图所示)。
  w6 C1 Q1 W7 U
7 ~( N$ U8 @: y0 k* W& u 微信图片_20240229163232.png
7 R+ K8 X( S3 {7 v
4 L8 i+ `3 B0 B) d2 v如上图所示,在 Startup 选项卡下,在 Load Image and Symbols 列表中选择当前工程的 Image,然后点击右边的 Edit…按键,然后在弹出的对话框中将 Download 前的勾去掉。点击 OK、Apply、并 Closed、关闭当前窗口。接下来在 S 工程中的源文件中的 xxx_it.c 源文件中的 systick 中断入口处设置一个断点, 如下图所示:2 H7 {! ]9 J4 b4 m: D# f  B' Z
' L0 [* d: @8 W+ \+ g6 J" I4 u7 d
微信图片_20240229163228.png ; K! `/ G1 n, `) [

2 F. G6 Y# b; u/ m 微信图片_20240229163225.png
0 w1 e* E7 E1 [& |6 V4 v3 z$ x, }
微信图片_20240229163222.png
' k! k4 E9 |- C$ ^4 n% O- d
( z9 {0 g: }0 Z) H如上图所示,程序运行在断点处停下来了,接下来你可以单步调试 Secure 工程了。这是一种完全没有破坏现场的调试方法,适合当出现问题后,直接去查看出现问题的代码行。当然在调试 Non Secure 工程时,你也可以按此方法来配置。也可以达到不破坏现场的效果。3 I$ y% [7 r' g: c; B9 s4 l" D( j

) T& O! y3 i# d* y; s& A+ n4.4.3. 在其它 IDE 中进行 DA 调试. ~3 k* {; L. `. f- }: M
由于其它 IDE 当前最新版本还并未将 DA 过程集成到 IDE 中,因此,需要利用 STM32CubeProgrammer 进行 DA 认证通过之后,才可以用 IDE 进行调试。3 K0 G1 ?9 a; x& S2 |
4 q# v6 T9 D7 Q  |: I) K" x7 u
接下来我们将使用 STM32CubeProgrammer 通过 DA 来重新打开调试口。  v" d1 V8 I# _. _3 C0 K
" \* J7 o% u2 ~( ^0 n
微信图片_20240229163219.png
: l$ ^6 o, y3 `- q$ {. j* r; k+ ~" O% P6 Z3 @$ `! L
在断开连接的情况下,在 STM32CubeProgrammer 中,选择 DA 选项卡,然后点击 Discover…
3 {. ~6 X* O9 H' T! j# |" D$ ]5 o; b# a3 a. Q, K
微信图片_20240229163215.png , C# J( a- Q; U2 G

  z" l+ [: l$ Y4 h0 O* s与 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 按键…
( m& n8 K! u; D: F$ G4 w# |6 ^/ s' I( U" o) J2 \
微信图片_20240229163212.png
$ K! i2 b9 U5 x4 u- B3 s) ?0 @5 Y! K/ }% w5 I3 U8 r2 S0 {6 e
如上图所示,在下面新显示的内容中选择 Non-Secure Intrusive Debug(Level 1),然后点击 Execte 按键… 0 b* G9 n3 p! `; ?) l* V
& p) h0 L9 M- ^; `( x4 G
微信图片_20240229163209.png
2 D" T, ~( P# l' Q

! T7 `& M! P6 k  j如上图所示,表示 DA 已经成功,调试口已经重新打开。然后断开 STM32CubeProgrammer 的连接。
2 Q1 r7 u5 G9 C9 N
& |1 g) k8 C# x9 D) K
接下来就可以选择你所使用的 IDE(如 Keil、IAR)调试 NS 工程了,如下图使用 IAR 调试 :
$ @7 p; T( ^; V5 E
3 [! P. E* [, [* _  o 微信图片_20240229163206.png
- _( J+ {) `# S" Q' d8 ]; P: z+ c; m6 c* z3 U' g. |: c
如上图所示,选择 Attach to Running Target 可直接 attach 上去查看当前运行的代码行。当然在之前 DA 步骤中,你也可以选择调试 S 工程 …
- Z, [( S- f4 j5 e
' @+ N- a. a; R: i+ P; @7 W& N* z 微信图片_20240229163203.png
; }; ~6 H- L; l$ D
1 a/ K6 R  t% ^" M. G如上图所示, 在下面新显示的内容中选择 Secure Intrusive Debug(Level 1), 然后点击 Execte 按键…& s% V# F" m6 t. c: F. f/ ]
$ Y2 N/ y7 O8 f5 e& T
微信图片_20240229163158.png 6 m% N5 h# j& S8 I7 W( n' n

6 L" d3 I# B1 D. `+ t$ M2 C' U如上图所示,表示 DA 已经成功,调试口已经重新打开。然后断开 STM32CubeProgrammer 的连接,接下来就可以选择你所使用的 IDE(如 Keil、 IAR)调试 NS 工程了。
& t' U- ~* c; u# T, s0 v2 o& C0 }& W2 \1 i7 Y

- }( S9 ^% s6 l$ U五、还原
4 X8 r1 m4 g8 ?$ v8 o% w; n还原的过程参考 3.5 节,步骤完全一致。最终还原成功后,全片 Flash 内容已经擦除。最后,将 TZEN 直接修改为 0xC3。' _' P& Z( ~( V. `" H

) T2 |' w8 z, f" d- S% ?! s$ K+ k 微信图片_20240229163155.png ) t* u- k; \: @5 S

, ?) u) H# C2 \+ E5 I至此,芯片完全恢复成原始状态。另外,DA 回退过后,之前预配置的内容也自动清空了, 因此,后续还需要重新进行预配置 (provisioning)。" x0 I( s0 }! Z) r+ m) F. h( s
: V4 ^4 W5 p  s" B  o
1 Y, i5 ~# S/ i* s" n1 d
转载自: STM32* z- B* ]2 n; S' L0 U/ }
如有侵权请联系删除
* G) X  C2 Q7 T$ I  S4 Q. n6 j2 n' J* n* d: [2 s5 M
8 \3 O6 g& `& M, V8 J
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版