STMCU小助手
发布时间:2024-2-29 16:53
|
一、前言 C4 X% C3 Z Y8 z STM32H5 是 ST 2023 年新推出的产品系列,与以往 MCU 不同的是, STM32H5 推出新的 product state 功能特性以替代以往的 RDP 功能。
如上图所示,product state 有如下状态 :: A3 n0 B1 s! h+ k, A' M, ~1 { Open(0xED) : 完全 open 状态,相当于以前的 RDP0。 ( I8 L9 I9 [" H6 M5 ~ Provisioning(0x17) : 此状态是专门用来做预配置的。 iROT-Provisioned(0x2E) : 用于 STiROT 或 OEMiROT。 5 K+ r+ Z* H" M( `7 t# y TZ-Closed(0xC6): Secure 区域关闭, 相当于 RDP0.5(仅在 TZEN=0xB4 时有效)。 Closed(0x72): S 和 NS 区域均受到保护,这点有些类似于 RDP1,此时调试口没法对其直接访问,但可通 过 DA 打开调试口或回退,这一点有点类似于 STM32U5 上的可带密码回退的 RDP2。 Locked(0x5C): 完全关闭芯片的外部访问,相当于以往 STM32 芯片的 RDP2 保护等级。 整体如下图所示:$ L4 x, A& C$ D
其状态切换如下图所示 :* q+ d* x; L* f. Q: W. C, V) u
如上图所示,product state 从 open->provisioning->iROT-Provisioned->TZ-Closed->Closed 如此从左到右是可切换的,但是,要从右到左如此回退,则必须要经过 DA[Debug Authentication]过程。如上图所示,经过 DA 后,要么完全回退到 Open 状态,要么部分回退到 TZ-Closed 状态。: a; x! ]# F: [; Z: F; }/ f8 B( a 所谓的 DA,就是通过向芯片提供证书(STM32H503 是提供密码),通过芯片的身份认证后,允许向 芯片发起 product state 状态回退,或者重新打开调试口请求(仅当 TZEN=0xB4 时)。 k0 s" \+ S* i; |, A: M 0 Y; p% D8 D1 ~ T! E 由于新的 product state 和 DA 的引入,所有 STM32H5 开发者都必须掌握 DA 的用法。因此,本 文档针对 STM32H5 初学者,演示当 TZEN=0xB4 时, 使用证书来完成 DA 过程。' x! }: e/ m2 p. |" I! g; A- { 二、准备工作/ M! v9 L; c$ ~$ w g# Z7 | 开发板 : NUCLEO-H563ZI 1 Y3 ~9 d$ Q4 C, n
- v" U( ~ C. ] 软件包 : STM32Cube_FW_H5_V1.1.0 工具:. M/ c1 h. |! Z STM32CubeProgrammer v2.14.0" ], s2 s6 H; u2 p6 V' N Tera Term 串口终端显示" }+ X- r9 p2 {+ D2 { Trust Package Creator(安装 STM32CubeProgrammer 时一并安装, 注意勾选) IDE: STM32CubeIDE v1.13.0 STM32CubeH5 包我们需要将其放到一个没有空格没有中文的路径下,在本动手实验中,我们 默认将其放在路径 C:\workspace\目录下。 三、生成 OBK 并测试 I0 U1 N2 Z5 H$ P: q- L 在 STM32CubeH5 包下的路径 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEOH563ZI\ROT_Provisioning\DA,在此目录下,已经包含了自带的默认 obk,密钥以及证书。其实 我们可以直接使用这些 obk 以及对应的证书和密钥,这里我们将重新生成一套,并测试它是否 OK。( M4 g% y9 v, P5 n l 3.1. 重新生成密钥对打开 TPC(TrustedPackageCreator)工具
; b. V$ S5 { b; {( \9 D' I* m& H- a4 t 在 xml file 处,导入 DA_Config.xml 文件 :" J. x5 S5 N2 c; W) H. I C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Config/DA_Config.xml 如上图,在导入 DA_Config.xml 文件后,点击 Regenerate 按键后,将在 Keys 目录下重新生成公钥私钥对 :
; s5 F* u+ T! d7 A7 ~# g 这组密钥对就是接下来需要使用到的密钥对了。+ n3 g$ T3 p4 P7 L! V. _+ C 其中 :( K+ I: H& V% S* |8 C Key_1_root.pem 为私钥 Key_1_root_pub.pem 为公钥 3.2. 生成 DA OBK 文件 接下我们将创建 DA 的 obk 文件 :! H# ?* W; n% K0 b8 Q% \* g. ]
如上图所示,继续在 TPC 工具中,在 Permission Mask 下,激活允许的操作许可,被激活的就是 DA 认证通过后,允许的操作. 然后在 Output File 处选择输出文件。我们使用默认即可。然后点击 Generate OBKey 按键,则在 Binary 目录下生成 DA_Config.obk 文件 :: k. O8 l% E' i; R3 z & L8 x/ g5 P0 x8 U2 v) ~" m; J& f
这个 obk 文件就是我们后续将来做 DA 预配置(provisioning)的 obk 文件了。 - V2 v! b5 I) Z# { 3.3. 生成证书 接下来我们继续用 TPC 工具生成证书。( T( m0 p0 P0 c& L) Z % S# o8 K6 _0 E/ q- d0 K6 F
) q- M0 m; Z1 h7 K D; }& Q) Z 如上图所示,在 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 而在Root Public Key处则选择之前生成的公钥文件:C:/workspace/STM32Cube_FW_H5 _V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Keys/key_1_root_pub.pem 然后在 Permission Mask 处选择此证书所允许的操作许可。我们将 Full 回退 to TZ,以及Secure/Non Secure 下的 Level 1~3 的 Debug 权限许可全部打开。 7 [+ g( F g; f 在 Certificate file 处选择输出文件,我们选择C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/cert_root.b64; {% g( u2 j- i! L8 `( I, H( J& M 即在 Certificates 目录下生成 cert_root.b64 文件,最后再点击右下角的 Generate Certificate 按键,最终在 Certificates 生成了 cert_root.b64 文件。 : y* s3 O: `- _
如上图所示,在 Certificates 目录下将同时生成两个文件 : cert_root.b64, cert_root.cert。7 K- e4 S# H+ I9 r$ e, k! E2 ] 其中 cert_root.b64 就是我们需要的证书文件了,它就是根证书。它将在后续步骤中进行 DA 时将会用到。而另一个生成的文件 cert_root.cert,我们并未用到它。2 V" Q+ s& X5 K5 T; t& U, O% A0 o 3.4. DA 预配置 (provisioning) 接下来我们将做 DA 预配置,在此之前我们确保使能 Trust Zone 功能,即 TZEN=0xB4。
w( O1 i2 J. |) S 如上图所示,使用 STM32CubeProgrammer 连接芯片,并将 TrustZone 打开。& E. E; J, @# O9 S4 i 然后将 Product State 切换到 Provisioning 状态 :6 V2 r1 x8 ?8 g- s . i: e) @' J$ i9 L/ [- y2 }& x& y
# ]* k% J5 n0 Y/ M3 S 接下来正式做 DA 预配置… / l5 E2 G/ z6 g9 f' {
如上图所示,在 STM32CubeProgrammer 左边选择盾牌图标,然后在上方选项卡处选择PROV,接着在 OBKey file path 处选择之前生成的 DA_Config.obk 文件 :! h( ]" g* I! E8 R C6 t* N( D 4 X: z2 z( p2 M3 Y C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Binary\ DA_Config.obk ! p& p' C* ?' P g2 { 最后点击 Start Provisioning 按键…) G4 {* q9 l. ?# R5 R# x/ H$ } 9 ? c8 b g, y; x$ p
成功时,将弹出消息提示成功。此时表示,DA obk 文件已经预配置到芯片内部并且已经成功了。然后断开 STM32CubeProgrammer 的连接…
1 L# l9 E" v+ q' p' |! w) m+ L 如上图所示,点击 Disconnect 按键,确保 STM32CubeProgrammer 已经断开连接。接下来我们将尝试用证书做 DA 回退… 7 o# \* W4 X( \+ Q9 [ 8 X! o: t P, r 3.5. DA 回退 9 Z% t/ C4 X( q1 }
如上图所示,在确保 STM32CubeProgrammer 断开连接的情况下,左边还是选择盾牌图标,上方选项卡处选择 DA,然后在界面中点击 Discover 按键… 5 ^: r# _+ ]+ d/ b 7 r( s' h) k* B3 z6 L
& a# ^! N, `* h2 w6 |$ 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.pe 如上图所示,在接下来的界面中,在 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.pe3 U; V e: c) A( h/ L " w) o1 b4 r, m8 Q* A4 d 在 Certificate File Path 处选择之前生成的证书 cert_root.b64:C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\cert_root.b6% E/ Z2 J) |, K/ I2 x3 S4 w( O/ M ! n5 n8 j6 G- K- |4 v# X% |+ B 然后点击右边的 Continue 按键… {! @9 J& m0 ?0 j
5 C1 L% t0 X# x8 j9 e8 K 如上图所示,在下方新显示出来的界面内容中,在左边选择 Full Regression, 即你想要的操作,然后点击右边的 Execte 按键…
如上图所示,弹出界面显示 DA 成功。: k% X! K2 w0 T. _) R 2 o0 b6 f0 _# A) ]4 w 这也就表示,之前生成的私钥文件 key_1_root.pem + 证书文件 cert_root.b64 正是匹配之前生成的 obk 文件 DA_Config.obk 的。& v8 N+ [/ w; ~# k* O& S # {% ]1 j/ A. P. i0 \# J2 c 其中 DA_Config.obk 文件和固件 hex 文件是要给工厂烧录芯片用的。而私钥文件 key_1_root.pem + 证书文件 cert_root.b64 则是需要保留,将来工程师需要它们来做 DA 回退和 DA 调试用的。 O5 a6 M5 ]: T: r5 y / T5 K7 M2 _, a l( w 这里需要注意地是,如果上述 DA 回退未成功,则表示证书+私钥与之前预配置的 DA obk 不匹配,需要重新执行 3.1~3.5 节。直到 DA 回退成功为止,否则切记不要进入到下一步骤,不然很可能会由于证书不对无法回退导致芯片废掉(除非用户代码可以执行回退)。& n6 J. Z. ]. n4 ^: s: K5 X! C$ B & m6 Z; [1 o& ]! e9 k 3 u9 _( y3 Z; r3 x* U# A1 [ 四、运行一个程序并 DA 调试 4.1. 在 Open 状态下运行一个示例程序 ; g7 _( c0 u% I4 p9 W: Y 使用 STM32CubeProgrammer,确保 product state =Open, TZEN=0xB4:2 C* ~! J0 G/ K' X# d% t9 P( ?
并确保:SECWM1_PSTRT=0x0 SECWM1_PEND=0x7F, SECWM2_PSTRT=0x7F SECWM2_PEND=0x0:
然后使用 STM32CubeIDE 编译 STM32CubeH5 包下的示例工程:STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Examples\GPIO\GPIO_IOToggle_TrustZone\STM32CubeIDE 分别先后编译 S 和 NS 工程并烧录对应程序,并复位运行。正常情况下,可以看到板子上 LD5(橙色), LD6(绿色)两盏灯在来回闪动。即表示测试程序运行 OK。 4.2. DA 预配置 A3 ?: g+ g$ `3 J* C 接下来我们参照之前的 3.4 节,将 product state 切换到 provisioning 状态, 然后进行 DA 预配置。
如上图,切换到 provisioning 状态。 " a% l- e1 i; d5 j# V* X
! E* n+ y" b6 | _% `& u7 } 如上图所示,导入之前生成的 DA_Config.obk 文件,然后点击 Start Provisioning 按键,进行预配置。 - |( g! q# f6 ?( i6 E
& m" Y5 w4 L v2 F" } 弹出上面显示模式,则表示预配置已经成功。 & l, t9 f' }" c+ a Q 4.3. 修改状态到 Closed 状态 , z( ]& C3 I% B4 L0 @ F9 o" Y7 }, u/ K. P
: e% W3 ]% _4 W/ h4 `" Z$ f- g 如上图所示,接下来将 product state 修改为 Closed 状态。此时 ST-Link 连接会自动断开,表示芯片内部调试口已经自己关闭了。 此时查看板子,LD5、LD6 两灯依旧来回闪烁,说明程序在 Closed 状态下运行正常。只不过此时调试口是连接不上了。 ' I$ ^8 a& a, @7 e7 Y2 q5 V 4.4. DA 调试 6 G8 A: U# x& x% P4 l& c: S" h0 r% E 4.4.1. 使用 STM32CubeIDE 调试 NS 工程 在 STM32H563 处于 Closed 状态下时,SWD 口默认是关闭的,此时是无法调试代码的,若想调试代码,必须得通过 DA 认证重新打开调试端口,好在这一功能已经集成在 STM32CubeIDE 中了。接下来我们将使用 STM32CubeIDE 调试 NS 工程,在 NS 工程的 Debug Configuration 中, 在 Debugger 选项卡下 : 8 c& {; K# q" L: }: D+ X , `) x. O7 B$ K) |
如上图所示,在 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 按键… 3 W' |: N0 ]" c& {! v
如上所示,程序在运行在 NS 工程的 main 函数开始处则停下来了,接下来你可以选择单步调试... * a9 U5 n4 K5 E. H 4.4.2. 使用 STM32CubeIDE 调试 S 工程 S 工程的调试配置有些许差异。
如上,Reset behaviour Type 为 None,同样在 Debug Authentication 下设置之前生成的私钥和证书,Permission 变为 Debug Secure L1。 |) F: J2 s/ |4 w& @5 O
然后拖下来将 Verify flash download 之前的勾去掉(如上图所示)。 & w" i+ L& g; a$ e7 t
& v$ Z- F& j7 M3 I$ ? 如上图所示,在 Startup 选项卡下,在 Load Image and Symbols 列表中选择当前工程的 Image,然后点击右边的 Edit…按键,然后在弹出的对话框中将 Download 前的勾去掉。点击 OK、Apply、并 Closed、关闭当前窗口。接下来在 S 工程中的源文件中的 xxx_it.c 源文件中的 systick 中断入口处设置一个断点, 如下图所示: J9 l/ e! _5 L
b- v! Z8 d+ a; O* U/ O, X1 @ 如上图所示,程序运行在断点处停下来了,接下来你可以单步调试 Secure 工程了。这是一种完全没有破坏现场的调试方法,适合当出现问题后,直接去查看出现问题的代码行。当然在调试 Non Secure 工程时,你也可以按此方法来配置。也可以达到不破坏现场的效果。2 W0 @0 {, x, y2 B/ o0 u5 W + \4 c; m: R) ` 4.4.3. 在其它 IDE 中进行 DA 调试( O' ~! Q! o. `2 A0 { 由于其它 IDE 当前最新版本还并未将 DA 过程集成到 IDE 中,因此,需要利用 STM32CubeProgrammer 进行 DA 认证通过之后,才可以用 IDE 进行调试。8 z3 ]! U/ o* |$ s3 n , B& y, A- t9 _6 H: X6 ~1 } 接下来我们将使用 STM32CubeProgrammer 通过 DA 来重新打开调试口。 0 I: |+ m) Y2 X
8 y7 e# r7 O5 Z 在断开连接的情况下,在 STM32CubeProgrammer 中,选择 DA 选项卡,然后点击 Discover…
% ^6 H) X( Y3 J! w 与 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 按键… : J8 `( _" e3 V) o9 a S# _ . G# c. s3 i, r5 m d
如上图所示,在下面新显示的内容中选择 Non-Secure Intrusive Debug(Level 1),然后点击 Execte 按键… / r# D2 |2 g9 g% O3 O0 \% m+ b
4 x' k) L+ h* M# T, ~( p 如上图所示,表示 DA 已经成功,调试口已经重新打开。然后断开 STM32CubeProgrammer 的连接。 接下来就可以选择你所使用的 IDE(如 Keil、IAR)调试 NS 工程了,如下图使用 IAR 调试 :
8 C2 M- d6 M2 @; f! c6 G 如上图所示,选择 Attach to Running Target 可直接 attach 上去查看当前运行的代码行。当然在之前 DA 步骤中,你也可以选择调试 S 工程 …
0 y1 ^* T% f1 d 如上图所示, 在下面新显示的内容中选择 Secure Intrusive Debug(Level 1), 然后点击 Execte 按键…
如上图所示,表示 DA 已经成功,调试口已经重新打开。然后断开 STM32CubeProgrammer 的连接,接下来就可以选择你所使用的 IDE(如 Keil、 IAR)调试 NS 工程了。2 U5 F! Q# ]! E 1 G2 p( z: e! o6 ?( k( k( g/ Z 五、还原5 ?! B, w5 z: d/ h- k6 \9 p 还原的过程参考 3.5 节,步骤完全一致。最终还原成功后,全片 Flash 内容已经擦除。最后,将 TZEN 直接修改为 0xC3。
3 ]! l( q) U' l1 H0 i' } 至此,芯片完全恢复成原始状态。另外,DA 回退过后,之前预配置的内容也自动清空了, 因此,后续还需要重新进行预配置 (provisioning)。 ) O( r/ y0 B7 Z& f: a , q! b6 R9 W- \; E 转载自: STM32 如有侵权请联系删除 * P+ M+ v' m+ v) a9 k |
【STM32H5 评测】MNIST 数字识别
【STM32H5 评测】3、STM32H5 Lwip 移植、官方例程和UDP发送数据
【STM32H5 评测】+开发板拆箱介绍
【STM32H5 评测】4、移植CoreMark
【STM32H5 评测】ADC 电压表
【STM32H5 评测】基础硬件加密与随机数性能 - STM32H5E5实测硬件AES加解密、HASH运算、TRNG真随机数输出速率与稳定性
【STM32H5 评测】基于NUCLEO_H5E5ZJ+Zephyr数字电源
【STM32H5 评测】NUCLEO-H5E5ZJ 使用 TrustZone 安全分区系统实践测试
【STM32H5 评测】CPU核心性能 - STM32H5E5跑 RTOS,观察任务切换速度、中断响应快慢
【STM32H5 评测】内存读写性能 - STM32H5E5实测Flash,SRAM读写速度,用DMA搬运大块数据
微信公众号
手机版
值得收藏
按照操作指南操作,disconver后卡死无法disconver使用DA回退,这可能是什么原因导致的