一、前言 STM32H5 是 ST 2023 年新推出的产品系列,与以往 MCU 不同的是, STM32H5 推出新的 product state 功能特性以替代以往的 RDP 功能。 8 R( Q. p3 \! b. t 如上图所示,product state 有如下状态 :5 T, L2 s9 S d6 d 9 n6 ]7 G* [: C4 \1 t; T+ C Open(0xED) : 完全 open 状态,相当于以前的 RDP0。 l4 r- `8 k( N) I6 g' F Provisioning(0x17) : 此状态是专门用来做预配置的。 / U/ d- O- E6 g" U iROT-Provisioned(0x2E) : 用于 STiROT 或 OEMiROT。 TZ-Closed(0xC6): Secure 区域关闭, 相当于 RDP0.5(仅在 TZEN=0xB4 时有效)。 : i- L6 j, s! d Closed(0x72): S 和 NS 区域均受到保护,这点有些类似于 RDP1,此时调试口没法对其直接访问,但可通 过 DA 打开调试口或回退,这一点有点类似于 STM32U5 上的可带密码回退的 RDP2。 Locked(0x5C): 完全关闭芯片的外部访问,相当于以往 STM32 芯片的 RDP2 保护等级。 * N" T. X, k3 _/ Y 整体如下图所示:/ u) O" `( ]8 \* G3 r 其状态切换如下图所示 :5 V/ Y+ x3 B: G8 A" u 如上图所示,product state 从 open->provisioning->iROT-Provisioned->TZ-Closed->Closed 如此从左到右是可切换的,但是,要从右到左如此回退,则必须要经过 DA[Debug Authentication]过程。如上图所示,经过 DA 后,要么完全回退到 Open 状态,要么部分回退到 TZ-Closed 状态。 / W) [% @, B% r( |" S1 g9 A 所谓的 DA,就是通过向芯片提供证书(STM32H503 是提供密码),通过芯片的身份认证后,允许向 芯片发起 product state 状态回退,或者重新打开调试口请求(仅当 TZEN=0xB4 时)。* f, |% S. Y0 j' }% Z- J 3 Y: N) p+ f1 \) B0 }, n# M Z 由于新的 product state 和 DA 的引入,所有 STM32H5 开发者都必须掌握 DA 的用法。因此,本 文档针对 STM32H5 初学者,演示当 TZEN=0xB4 时, 使用证书来完成 DA 过程。* F4 f0 \1 J. D" _ |6 [3 ?1 _, P) m2 B9 h 二、准备工作 开发板 : NUCLEO-H563ZI , m. F- \$ U$ a+ a 软件包 : STM32Cube_FW_H5_V1.1.05 c: Z3 x. K4 N8 s; d, z ; o- C, o/ X z" c 工具:: K' j; I0 c5 N& z# c STM32CubeProgrammer v2.14.0 Tera Term 串口终端显示 Trust Package Creator(安装 STM32CubeProgrammer 时一并安装, 注意勾选) IDE: STM32CubeIDE v1.13.0 STM32CubeH5 包我们需要将其放到一个没有空格没有中文的路径下,在本动手实验中,我们 默认将其放在路径 C:\workspace\目录下。 三、生成 OBK 并测试 在 STM32CubeH5 包下的路径 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEOH563ZI\ROT_Provisioning\DA,在此目录下,已经包含了自带的默认 obk,密钥以及证书。其实 我们可以直接使用这些 obk 以及对应的证书和密钥,这里我们将重新生成一套,并测试它是否 OK。, u8 i, [9 o5 N9 x 3.1. 重新生成密钥对打开 TPC(TrustedPackageCreator)工具 0 @/ L( p {6 w 2 m: v3 J H) }: D3 \. P- K& F / O# q C: j5 i) f6 M. e 在 xml file 处,导入 DA_Config.xml 文件 : C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Config/DA_Config.xml 如上图,在导入 DA_Config.xml 文件后,点击 Regenerate 按键后,将在 Keys 目录下重新生成公钥私钥对 : 4 u) s7 L2 j1 v" h + y5 _" q: U4 e4 Y 这组密钥对就是接下来需要使用到的密钥对了。 其中 :, ]: z. K, E3 F$ N4 X Key_1_root.pem 为私钥 Key_1_root_pub.pem 为公钥& Y5 g+ q! u0 {: `& }* w 3.2. 生成 DA OBK 文件' ~7 j9 `4 V) p% T* w3 I m 接下我们将创建 DA 的 obk 文件 : 如上图所示,继续在 TPC 工具中,在 Permission Mask 下,激活允许的操作许可,被激活的就是 DA 认证通过后,允许的操作. 然后在 Output File 处选择输出文件。我们使用默认即可。然后点击 Generate OBKey 按键,则在 Binary 目录下生成 DA_Config.obk 文件 :* y/ A4 O+ }! m$ Y& L: L* w : y# Q& y3 s: G7 e. X# E( g 这个 obk 文件就是我们后续将来做 DA 预配置(provisioning)的 obk 文件了。0 J( J! J# L. ^6 t5 a" } 8 R$ ^5 N `% ?" m: `5 R 3.3. 生成证书4 w Q6 b+ m$ C# l$ H% N9 n+ ?! y 接下来我们继续用 TPC 工具生成证书。 如上图所示,在 Microcontroller 处选择 STM32H5-2M,在 Root Private Key 处我们选择之前生成的私钥文件 : C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Keys/key_1_root.pem4 H; q& a0 v) G- {* r$ |$ }3 A # e0 @* t! l; @: [2 F5 u + y( ?/ ?5 M8 V! G+ t; h 而在Root Public Key处则选择之前生成的公钥文件:C:/workspace/STM32Cube_FW_H5 _V1.1.0/Projects/NUCLEO-H563ZI/ROT_Provisioning/DA/Keys/key_1_root_pub.pem6 n7 L3 S$ |2 ^7 p( ]& d6 y & x: r0 G( Q. v* V4 W4 [- z, K 然后在 Permission Mask 处选择此证书所允许的操作许可。我们将 Full 回退 to TZ,以及Secure/Non Secure 下的 Level 1~3 的 Debug 权限许可全部打开。 在 Certificate file 处选择输出文件,我们选择C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/cert_root.b646 V2 t7 r6 W9 A 即在 Certificates 目录下生成 cert_root.b64 文件,最后再点击右下角的 Generate Certificate 按键,最终在 Certificates 生成了 cert_root.b64 文件。# \2 L7 L/ i u3 [ & d, q! O8 f1 t6 b) n' d 如上图所示,在 Certificates 目录下将同时生成两个文件 : cert_root.b64, cert_root.cert。2 c: B5 `! r1 _$ v' \& U 其中 cert_root.b64 就是我们需要的证书文件了,它就是根证书。它将在后续步骤中进行 DA 时将会用到。而另一个生成的文件 cert_root.cert,我们并未用到它。, \; [% F9 k" U 3.4. DA 预配置 (provisioning). y* t" x, F: D3 j/ S4 O 接下来我们将做 DA 预配置,在此之前我们确保使能 Trust Zone 功能,即 TZEN=0xB4。 如上图所示,使用 STM32CubeProgrammer 连接芯片,并将 TrustZone 打开。2 D: t3 l) y3 x, K. r, E6 M- R% h 然后将 Product State 切换到 Provisioning 状态 : # k9 ?- {/ U0 e$ }( M: m- F , V4 h' ?, I. _2 E8 b; U) l" P 接下来正式做 DA 预配置…; v$ `1 i, J4 `8 u/ X0 m% |8 C 如上图所示,在 STM32CubeProgrammer 左边选择盾牌图标,然后在上方选项卡处选择PROV,接着在 OBKey file path 处选择之前生成的 DA_Config.obk 文件 : C:\workspace\STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Binary\ DA_Config.obk O6 ]& b5 X `/ b! w ' ~0 G9 T% ^! J 1 b' C9 o1 @+ ]6 _' q* N; F 最后点击 Start Provisioning 按键… / p2 o& w/ B# B4 B& U. U+ d2 b - \& A) e2 U" A6 } b 成功时,将弹出消息提示成功。此时表示,DA obk 文件已经预配置到芯片内部并且已经成功了。然后断开 STM32CubeProgrammer 的连接…) T/ ^3 A% b) s# I ( B7 Q2 \5 C: h9 O5 h4 B 2 y. I" z1 g. Z' ~; K' o. x 如上图所示,点击 Disconnect 按键,确保 STM32CubeProgrammer 已经断开连接。接下来我们将尝试用证书做 DA 回退… & ?6 @' M6 }, ?( x* ^" D / y' l! _/ J0 P# v1 w* `4 p 3.5. DA 回退$ x( G9 W8 Y7 l; T( p% N$ ] 1 N8 J3 {' b4 R . I. n' ]& z+ n) ~6 e 如上图所示,在确保 STM32CubeProgrammer 断开连接的情况下,左边还是选择盾牌图标,上方选项卡处选择 DA,然后在界面中点击 Discover 按键… . a; }7 @6 {- a ~$ B 2 I2 _2 L L9 T+ H9 ? 如上图所示,在接下来的界面中,在 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.pe $ E' S8 m5 j# P+ \) ?. n# W 在 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$ [0 c( f7 L& k 然后点击右边的 Continue 按键… 3 j/ {7 Y4 P* S# w, U 3 K g* F$ N2 x( `, x 如上图所示,在下方新显示出来的界面内容中,在左边选择 Full Regression, 即你想要的操作,然后点击右边的 Execte 按键… ( j/ G9 x$ t) f% T" {7 J O4 s+ K+ [0 n+ v' ~' h- M0 d A4 V 如上图所示,弹出界面显示 DA 成功。 % n! G @1 ]$ U 这也就表示,之前生成的私钥文件 key_1_root.pem + 证书文件 cert_root.b64 正是匹配之前生成的 obk 文件 DA_Config.obk 的。! q2 d. o8 G% p & l# V" k6 Y7 Q, G" K, J) { 其中 DA_Config.obk 文件和固件 hex 文件是要给工厂烧录芯片用的。而私钥文件 key_1_root.pem + 证书文件 cert_root.b64 则是需要保留,将来工程师需要它们来做 DA 回退和 DA 调试用的。 % Y+ ?3 X7 u. y# c, X6 I; F; l- | 这里需要注意地是,如果上述 DA 回退未成功,则表示证书+私钥与之前预配置的 DA obk 不匹配,需要重新执行 3.1~3.5 节。直到 DA 回退成功为止,否则切记不要进入到下一步骤,不然很可能会由于证书不对无法回退导致芯片废掉(除非用户代码可以执行回退)。% ]2 {" k- q6 |, f$ R. u8 F' J 四、运行一个程序并 DA 调试8 g1 z( ~; g& }' ^; j 4.1. 在 Open 状态下运行一个示例程序 3 o& ~6 t, |% S. I' Q/ l6 ~ 使用 STM32CubeProgrammer,确保 product state =Open, TZEN=0xB4: 5 T5 i4 R+ \9 ~( ?! D \; S; E1 ~ 并确保:SECWM1_PSTRT=0x0 SECWM1_PEND=0x7F, SECWM2_PSTRT=0x7F SECWM2_PEND=0x0: 2 ?5 @+ F: E* p- Y* r9 V 然后使用 STM32CubeIDE 编译 STM32CubeH5 包下的示例工程:STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Examples\GPIO\GPIO_IOToggle_TrustZone\STM32CubeIDE 分别先后编译 S 和 NS 工程并烧录对应程序,并复位运行。正常情况下,可以看到板子上 LD5(橙色), LD6(绿色)两盏灯在来回闪动。即表示测试程序运行 OK。 ) l& p: Q0 V1 u8 D 8 u. X7 j" h- p 4.2. DA 预配置 接下来我们参照之前的 3.4 节,将 product state 切换到 provisioning 状态, 然后进行 DA 预配置。 # y+ G" V7 ?" m $ o8 ]' X2 H/ _ 如上图,切换到 provisioning 状态。 2 I0 E% R9 u9 P+ T" w: {2 p. m+ Z 如上图所示,导入之前生成的 DA_Config.obk 文件,然后点击 Start Provisioning 按键,进行预配置。. c# i p' |2 \/ P {: u/ b- e8 l _ - r( J( L4 d& g5 }& B7 ? 弹出上面显示模式,则表示预配置已经成功。 - S- ~. h" J# q- M0 M" v6 ]! r 4.3. 修改状态到 Closed 状态 2 x" c7 m8 m9 D% f) A 如上图所示,接下来将 product state 修改为 Closed 状态。此时 ST-Link 连接会自动断开,表示芯片内部调试口已经自己关闭了。 此时查看板子,LD5、LD6 两灯依旧来回闪烁,说明程序在 Closed 状态下运行正常。只不过此时调试口是连接不上了。' Y8 s$ V0 d t, y4 U7 R T 4 M" m# v9 v$ E$ R4 j- g( t/ I 4.4. DA 调试 ! d: K8 N8 a, `# _ 4.4.1. 使用 STM32CubeIDE 调试 NS 工程& Q+ ?" v" S0 S" X/ o" ?$ ~! Q 在 STM32H563 处于 Closed 状态下时,SWD 口默认是关闭的,此时是无法调试代码的,若想调试代码,必须得通过 DA 认证重新打开调试端口,好在这一功能已经集成在 STM32CubeIDE 中了。接下来我们将使用 STM32CubeIDE 调试 NS 工程,在 NS 工程的 Debug Configuration 中, 在 Debugger 选项卡下 : 9 w. q7 C; L' U* ^+ t, F% { 如上图所示,在 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 按键… : G$ \4 g4 z0 ?7 z! ]2 E) l 如上所示,程序在运行在 NS 工程的 main 函数开始处则停下来了,接下来你可以选择单步调试.... B0 B+ {5 t$ ^( B. E 4.4.2. 使用 STM32CubeIDE 调试 S 工程 S 工程的调试配置有些许差异。5 V1 A- O1 f2 f $ s% a9 h, _2 S+ N: p& M 如上,Reset behaviour Type 为 None,同样在 Debug Authentication 下设置之前生成的私钥和证书,Permission 变为 Debug Secure L1。 6 C+ {4 D" J6 V) x" T 然后拖下来将 Verify flash download 之前的勾去掉(如上图所示)。( x! `6 J- n4 M+ D. b ! H# N* D: x( p 5 t+ j. v; C! T! D" s( d 如上图所示,在 Startup 选项卡下,在 Load Image and Symbols 列表中选择当前工程的 Image,然后点击右边的 Edit…按键,然后在弹出的对话框中将 Download 前的勾去掉。点击 OK、Apply、并 Closed、关闭当前窗口。接下来在 S 工程中的源文件中的 xxx_it.c 源文件中的 systick 中断入口处设置一个断点, 如下图所示: ; b6 R. ~$ g+ a$ M r 0 p' M3 x( I2 e + P: e C* z4 W( A% V3 R 如上图所示,程序运行在断点处停下来了,接下来你可以单步调试 Secure 工程了。这是一种完全没有破坏现场的调试方法,适合当出现问题后,直接去查看出现问题的代码行。当然在调试 Non Secure 工程时,你也可以按此方法来配置。也可以达到不破坏现场的效果。 ' F5 F3 d% g' a 4.4.3. 在其它 IDE 中进行 DA 调试* K5 m2 c# ?) g$ @3 R$ S0 ? 由于其它 IDE 当前最新版本还并未将 DA 过程集成到 IDE 中,因此,需要利用 STM32CubeProgrammer 进行 DA 认证通过之后,才可以用 IDE 进行调试。0 ^8 H5 w" h5 r' M v ' f" v/ s/ X/ y 接下来我们将使用 STM32CubeProgrammer 通过 DA 来重新打开调试口。 ) l5 L. I8 X2 m2 |- _ 在断开连接的情况下,在 STM32CubeProgrammer 中,选择 DA 选项卡,然后点击 Discover… & ]6 E5 e& E. l4 T/ f 2 M5 z! U2 Q" A2 R, ]1 ^ 与 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 按键… 6 E5 F$ ?* t0 d2 X$ P; s : e* Z& Q" c. Y& f F8 b+ S9 A% | 如上图所示,在下面新显示的内容中选择 Non-Secure Intrusive Debug(Level 1),然后点击 Execte 按键… ) a6 z+ M9 T( k! b* w' D+ e. F 6 h& L; G. c7 W0 ?7 i/ f 如上图所示,表示 DA 已经成功,调试口已经重新打开。然后断开 STM32CubeProgrammer 的连接。 接下来就可以选择你所使用的 IDE(如 Keil、IAR)调试 NS 工程了,如下图使用 IAR 调试 : 8 Q1 y# _8 ~5 i: w8 U5 Q8 X 如上图所示,选择 Attach to Running Target 可直接 attach 上去查看当前运行的代码行。当然在之前 DA 步骤中,你也可以选择调试 S 工程 …( y1 J1 X- h: T% R1 H4 B 8 s3 o( r4 p( b+ a 如上图所示, 在下面新显示的内容中选择 Secure Intrusive Debug(Level 1), 然后点击 Execte 按键… ( h+ o5 B' U3 g' ~, N- d; X( O! n 如上图所示,表示 DA 已经成功,调试口已经重新打开。然后断开 STM32CubeProgrammer 的连接,接下来就可以选择你所使用的 IDE(如 Keil、 IAR)调试 NS 工程了。 , l1 ~' V9 M! V' U# n5 {$ e ' N* G0 r7 t6 ?7 k. E9 U 五、还原 还原的过程参考 3.5 节,步骤完全一致。最终还原成功后,全片 Flash 内容已经擦除。最后,将 TZEN 直接修改为 0xC3。 4 j' E3 l" e/ k3 Z9 ]1 K. f6 G4 p 0 [: w2 ~# o( x! T& L- T 至此,芯片完全恢复成原始状态。另外,DA 回退过后,之前预配置的内容也自动清空了, 因此,后续还需要重新进行预配置 (provisioning)。 $ s8 o' \8 [8 `2 ]+ `- f% i ! P% n: h) U, @& S7 u8 |% q! i8 G 转载自: STM32% X$ o( a' f1 G3 N) P) { 如有侵权请联系删除 ) ~7 i. |0 U: p' l |
STM32H503生成带dead time的互补PWM
实战经验 | STM32H5 USBD Classic驱动 CDC移植
NUCLEO-H563ZI刷入Micropython固件并点亮LED灯
【免费申请】高性能和低成本双Buff加持的NUCLEO H533RE,等你来!
【NUCLEO-H533RE评测】使用双存储区Flash 在不关闭系统的状态下,实现OTA
【NUCLEO-H533RE评测】高性能-全频,硬件加速在电机控制相关应用的速度对比。
【NUCLEO-H533RE评测】HASH对比测试
【NUCLEO H533RE评测分享】高性能和低成本双Buff加持的NUCLEO H533RE
【NUCLEO-H533RE评测】+加载OLED显示部件
【NUCLEO-H533RE评测】+Coremark跑分测试
值得收藏
按照操作指南操作,disconver后卡死无法disconver使用DA回退,这可能是什么原因导致的