STMCU小助手
发布时间:2024-2-29 16:02
|
01前言) H7 K, I/ q* H6 Y- _. j# H+ d 本文档通过一个动手实验, 详细演示了如何在 STM32H563 上运行一个 OEMiROT 的功能. 旨在针对那些 OEM 想自己实现一个基于 STM32H563 上的 iROT 功能而又不知如何开始的开发者. 02准备工作; O' F1 N8 D- J/ b! a
0 Y9 s/ J$ C* k" D, o" e- z) ^, \6 ~ 8 Z o% n1 R: O0 t. v# J 软件包 : STM32Cube_FW_H5_V1.1.08 z1 N `0 J+ B+ Q8 f# } - x1 q# X0 I2 I" w4 e9 ? 工具:# P3 `. x0 q+ Z • STM32CubeProgrammer v2.14.0 • Tera Term 串口终端显示8 ^8 y5 g. z& K • Trust Package Creator(安装 STM32CubeProgrammer 时一并安装, 注意勾选) IDE: STM32CubeIDE v1.13.0 03烧录 OEMiROT 固件并运行6 h8 o% Y# z4 N$ @* S 3.1. 脚本环境配置板编程基础 本动手实验基于 STM32CubeH5 固件包, 此包必须位于一个没有中文且没有空格的路径下, 于是我们将此包拷贝到 C:\workspace 目录, 在此包路径 \STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning 目录下有一个 env.bat 文件, 用文本编辑器(如记事本)打开此文件:
$ x1 ^! v( a: `# y" B# k9 V) T ' O7 M/ q$ |2 u6 u- T7 D 检查上面两行, STM32CubeProgrammer_CLI.exe, 以及 STM32TrustedPackageCreator_CLI.exe 这两个工具的安装路径是否跟你电脑中的安装路径符 合, 如果不符, 则需要进行相应的修改.. ~; H! e& R8 C; { 3.2. 运行 OEMiROT 预配置(provisioning)脚本! Z9 ^. e& U# Y% F' }6 O 再进入到 cube 包下的目录 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEOH563ZI\ROT_Provisioning\OEMiROT 目录下, 有一个名为 provisioning.bat 的脚本, 双击运行它: ; B1 a w8 i% ?, @- y9 V
如上图, 系统会自动打开一个 DOS 命令终端窗口, 在此动手实验过程中, 如无特别说明, 此窗口将一直保持, 我们将通过此窗口的提示信息进行每一步的操作. 9 a0 g4 f; w0 {# L, C' f 如上图, 信息提示我们打开TrustedPackageCreator 工具, 生成 OEMiROT_Config.obk 文件. 1 n/ Q, b$ N# B) b$ I! \ 3.3. 生成 OEMiROT_Config.obk 打开 TrustedPackageCreator 工具:' h& D/ o( S+ G/ ~ 2 O2 r( l8 `7 c# S1 N
' S! O2 B* P5 O0 z2 i 如上图, 在最左边 ①处点击 “H5”, 然后在②处选项”OBKey”, 接下来在③处选择STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Config 目录下的 OEMiRoT_Config.xml 文件, 此文件为生成 OEMiROT 对应 obk 文件的配置文档. 然后下面会显示 3 个密钥对, 从上到下分别为 : • OEMiRoT_Authentication_S.pem: Secure APP 对应的认证密钥(使用公钥) • OEMiRoT_Authentication_NS.pem: Non Secure APP 对应的认证密钥(使用公钥)( M7 c0 O* I: D7 b# p( o. m: t • OEMiRoT_Encryption.pem : Secure APP+Non Secure APP 固件加密密钥对应的解包密钥(使用私钥) 4 i" `' `4 b8 I0 L 这三个密钥其实都是成对的, 即公钥私钥对. 位于 Keys 目录下. STM32CubeH5 包下已经自带了默认的密钥对, 如果你不想使用默认的, 则可以点击上图中的4中的 “Regenerate” 重新生成这三个密钥对. 一旦重新生成, 则需要注意保存这三个密钥对.2 |& z! t" P4 k0 v0 _ & `$ Y/ q& X* b% ~) e. h - i3 z1 a; o0 j" ]$ m+ v2 P 接下来就要生成 OEMiROT 对应的 obk 文件了, 在右边的输出路径下, 选择一个路径, 比如Binary 目录. 最后点击生成. 则将在 Binary 目录下生成 OEMiRoT_Config.obk 文件.4 B6 Y$ Q" g9 \1 F + n2 y" H) B3 V! t, { 3.4. 生成 DA 对应的 obk 文件+ N+ |4 d/ w# ^+ Y* B) E 回到脚本终端窗口, 输入回车键 : 1 S' g9 k* z% I+ F3 l
如上图, 提示你通过 TPC 工具生成 DA_Config.obk 文件. 有关如何生成 DA_Config.obk 文件,之前已有其它文档讲述, 且 STM32CubeH5 包下STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Binary 此目录中已经有现存的 DA 对应的 obk 文件, 其对应的私钥和证书分别位于上一级目录下的 Keys 目录和 Certificates 目录下, 这些文件均可直接使用, 所以这里不再重复讲述它们的生成过程. / G8 s8 d, z2 f1 R6 o8 z# S' D 直接按下回车键..! z( ?* G- I8 Q" L # \! g# g3 m$ J/ y 3.5. 编译 OEMiROT_Boot 工程 M# Q7 W. X# C% R5 B7 o! S * P6 y9 k1 }# a1 E& m% b; n + [( |* W# n! i/ }) z Y
$ h2 H; A0 n3 F4 ]7 a2 Y ' }8 [) B, N0 U6 f0 O 如上图, 提示用户打开 OEMiROT_Boot 工程并编译.* E2 B% m2 ^0 T 1 e- a }2 D4 k5 W8 W5 J9 |) } 于是用 STM32CubeIDE 打开工程, 路径为: STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Applications\ROT\OEMiROT_Boot\STM32CubeIDE 目录下, 编译过后,会在工程下的 Binary 目录下生成 OEMiROT_Boot.bin 文件.5 Y8 W5 E j7 n : r: K+ ~8 y. i: R6 \ 再回到终端窗口按下回车键… 3.6. 编译 OEMiROT_Appli_TrustZone 工程7 m# Z& J% N/ `$ }# N 8 w. z# {& p# Y' K8 v1 q# k 用 STM32CubeIDE 打开工程: STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Applications\ROT\OEMiROT_Appli_TrustZone\STM32CubeIDE2 X' W. T% i1 Y 8 r2 P3 }6 R0 c+ X* E 此工程下有两个子工程 :# t& a6 V( a0 X* S 1 Z! p8 m/ }8 M& Q7 C
) m$ E% k- n9 N; ~9 w- d1 f1 P 如上图所示, 先编译 Secure 工程, 再编译 NonSecure 工程. 编译通过后, postbuild 脚本会在Binary 目录下生成原始 bin 文件和加密后的固件.
原始 bin 文件是用来初始安装的, 而加密后的固件是用来做升级的. 加密和签名过程正是postbuild 脚本来实现的, 其对应的固件加密密钥是此次编译过程中脚本随机产生的密钥. 此密钥会通过 3.3 节中所产生的 OEMiRoT_Encryption.pem 对应的公钥来进行打包并放入 header 中.而签名所用的私钥并正是 3.3 节中所产生的 OEMiRoT_Authentication_S.pem 私钥, 它对应Secure 工程签名, OEMiRoT_Authentication_NS.pem 则对应 Non Secure 工程签名. 3.7. 手动生成加密且签名的映像文件(可选)- i$ `- ~, z- G$ l& H 除了通过 postbuild 脚本来自动生成固件加密且签名的映像文件外, 你也可以通过手动的方式来生成它.如下图, 我们可通过 TPC 手动将原始 bin 文件加密且签名.
( i4 H3 Z Z c3 ~; _+ R 如上图, 打开 TPC, 左边①处选择 “H5”, 然后在②处选择”Image Gen”, 在③处输入配置文件 : STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Images\ OEMiROT_S_Code_Image.xml. 然后在Firmware area size 处保持默认的 0x6000, version :1.0.0, Firmware binary input file 处导入S App 生成的明文固件映像. Image Out File 处即可生成的加密且签名的固件。加密的密钥是随机的, 它通过打包进 header 中, 如之前描述. 这就是手动生成加密且签名的固件映像方法. 由于App 工程的 postbuild 脚本会自动完成, 所以, 这一步骤并不是必须的.4 K3 H& ~. {5 k( h 此外需要注意地是, 在 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Images 目录下还有其它几个用来手动生成加密签名映像的配置文件, 如下图所示 :' ^4 U, G$ \4 Q; |& `% Y " v5 t, u4 f: A$ f) K* j' h
" r7 O) c5 w1 k5 | 通过这几个文件名, 顾名思义, 分别对应着 Secure App 的固件, 数据, NonSecure App 的固件,数据映像, 如果需要手动生成这四种加密且签名的映像文件, 则通过 TPC 手动导入对应的 xml配置文件. 在 Firmware binary input file 输入原始 bin 文件, 在 Image Out File 处输入导出文件, 然后点击 Generate Image, 生成最终的加密且签名的映像文件(如rot_tz_s_app_enc_sign.hex, 或者 rot_tz_ns_app_enc_sign.hex).4 s% h0 W! ^0 _2 D: M 3.8. 生成加密签名的数据映像(可选)3 {3 L3 Y) ~/ q 回到终端窗口按下回车键, 如下所示 :' s% |: Q1 W! ?7 j# X + S1 F0 A1 q0 |' C/ L, o0 E , ^9 s3 ^" A- ]( }8 k
! Q! m! k8 X: K' c& x# a: [% _% U% ~) p 提示我们通过 TPC 手动生成加密数据映像. 工程中默认是未定义任何 Data image 的(flash_layout.h 头文件):
因此, 此步骤默认我们是可以跳过. 如果工程中此宏修改成 1, 则需要手动通过 TPC 来生成加密的数据映像. 方法类似于 3.6 节的手动生成环节, 只不过配置文件换成 xxx_Data_Image.xml.9 Y% B! B0 j) U( `. z* ^5 q. L / ^( A& I) o! j" D/ C, s( o4 ~ 这一步骤, 我们直接在终端窗口中按下回车键…# r% d+ P0 S+ K8 X* m: J 0 ^0 { k: ^8 m
4 Q Q7 M4 M2 I5 K 接下来再次提示生成 NS APP 对应的 Data Image, 同理, 在工程中默认宏中是没有配置的, 因此直接按下回车键… 3.9. 预配置(provisioning); i# b! T9 i: c/ i/ {* X 9 A9 v( i8 C; {5 Q ) L1 E Y7 @5 ?; W1 T
在做预配置之前, 提示你是否已将 BOOT0 引脚拉低. 确认 NUCLEO-H563ZI 板上的 BOOT0引脚没有连到 VDD(CN4 的 BOT0 引脚未接任何东西即可). 确认后按下回车键…+ p# b; q5 L* f. {9 k2 ] ! b, r6 Y) G9 {, B5 k$ p8 [9 m
如上图, 这此过程中, 脚本会自动烧录 boot, S APP, NS APP 三个 bin 文件, 以及配置 option bytes, 接下来提示你输入芯片最终的 product state, 这里我们输入”CLOSED”…(千万别设置为 LOCKED 状态!)2 T, @* h9 ?& v% ~0 f/ Z( v$ M ^! @" k5 M, ], @
5 V4 [" H6 ?7 z: _# M 如上图所示, 在此过程中, 脚本会先将芯片的 product state 切换到 provisioning 状态, 然后再做预配置, 这里会预配置 OEMiROT 的 obk 文件,以及 DA 的 obk 文件, 然后最终将芯片的product state 设置为你上一步输入的最终芯片状态. 最后系统提供已完成. 到这一步, 脚本的整个流程结束. 接下来, 我们验证下烧录后的芯片是否工作正常. ) H$ w. D. Y6 K6 H2 R) } 3.10.检查程序运行状态) r6 N$ J: \0 @7 K+ ~/ o 打开 Tera Term, 设置串口波特率为 115200 bps, 然后复位板子, 查看打印信息…$ b/ }% R6 Z9 M, I- P+ h8 D
3 a; ?( Y. [2 n3 u* w 如上图所示, 当打印信息显示 User App #A 时, 表示 NS APP 已经运行成功, 所有程序运行结果均正常!4 s/ b" ?3 y0 ~. P 04固件更新 接下来, 我们将演示通过 NS APP 触发程序跳转到内置的 bootloader 中, 并通过串口下载新的加密固件, 复位后并安装它. 4.1. 修改代码, 并重新编译工程; S8 K: o3 z7 N& H# W7 z 打开 NS APP 的工程, 在 main.c 文件中将 NS APP 的版本号从 “A”改成”B”:5 H5 |4 G4 `, }5 R 6 p* f, j+ L/ K9 b1 c
然后重新编译 NS APP 工程.; f) b, q0 x1 S/ E5 G5 [& H 9 E) M: L% u& ?; Z5 F" T6 u Postbuild 脚本将重新生成 S APP 和 NS APP 的加密固件 :' N3 U% g7 c5 F" q& ]* O * t; N/ ~: p+ b$ p
3 P1 N# I t1 K' A: q7 s4 s 如上图所示, 这四个文件均将重新生成.3 i( b9 ^( W3 f* k( G, g; m 接下来我们将升级 APP 固件.' d7 i6 W& Q4 s6 X8 C2 J0 j ; p* ]$ d5 g, N3 p0 s' ^( n4 [ ' l2 l: u+ [1 |: i5 j$ N- v- g 4.2. 跳转到 loader 程序, t/ H1 q* ^# I% ^. K 在串口终端中我们输入”1”:) \! O4 g7 X9 r
( c7 a4 y; o( l" Y" w9 l% k 如上图所示, 输入 1 后, 程序跳转到芯片内置的 bootloader 中. 1 {7 d# Q2 P! F% v2 V 断开 Tera Term 的串口连接 :$ P! ]# |- }+ V) i
9 U4 a8 v+ s# O& g, y 4.3. 通过 STM32CubeProgrammer 下载新固件' `+ h" [1 e; }! h 打开 STM32CubeProgrammer, 并通过串口模式连接芯片: 7 B3 m0 \6 Y, b) [6 i: {. F ' a" Y% b! O. e5 X* q6 a( h
% i7 `& A0 j: Q) [8 s 将新生成 NS APP 的加密后的固件 rot_tz_ns_app_enc_sign.hex 拖入到STM32CubeProgrammer 中 : " U4 a5 h, Z, O: M3 z' O # t$ G2 j: Z' [& O1 b7 D U
) r! A& s* b# `& e1 S$ z 如上图点击下载.5 h& f; m; L6 B4 x- |! t0 O5 C 同样的, 也可以将 S APP 的加密固件 rot_tz_s_app_enc_sign.hex 拖入STM32CubeProgrammer 中并下载 :- |# {' V6 u- I& s9 B ; `9 L u* b8 i1 E2 n B: t3 }4 @
2 V& m6 `" G% I+ A) S+ A% s 下载成功后, 断开 STM32CubeProgrammer 的串口连接, 并使 Tera Term 重新连接串口 , 然后再重启 NUCLEO-H563ZI 板, 于是可以看到如下打印信息 : 6 Z4 L2 F7 R1 o6 W' ?8 }- A# u
) x' z6 K6 O; c1 p% t5 A 如上图所示, NS APP 的版本打印信息从 “A”已经改成”B”了, 这说明固件(加密且签名的)已经更新成功.% d3 g; v8 @9 _) H4 k% z' K9 j 05还原 5.1. DA 回退 打开 STM32CubeProgrammer, 采用 ST-Link 模式, 在未连接的情况下,在左边选择盾牌图标, 然后再选择”DA”选项卡, 再点 Discover 按键….2 q$ Z7 T; C9 p6 f5 u 9 r/ U( T! t3 T1 Z& _" Z
界面变成如下所示 :) X& _8 Y, w. z& O
& I3 b. r3 t3 v0 K 如上图所示, 第一个红框内输入 DA 私钥文件 :' e1 K! t) b% V a) t % f) f! D/ V9 R% [% b5 ~; E& N . U- [9 _0 m- I( i0 v STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pem,6 f) h& r+ @3 e 第二个红模式内输入证书 : STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\ cert_root.b64 / \( |9 p, X1 N: Z; x3 U * r% g, n, x0 I: d1 H9 H 然后击点 continue 按键, 然后界面变成如下所示 :4 L- ^: i2 c9 J8 R9 g3 N/ g$ n+ z
) c p6 L- p; G; G, }! V+ K 如上图所示, 在左边选择”Full Regression”, 然后再点击 Execute 按键…% l* C" q# \* U ) I: N4 M2 ]/ ~+ L1 Z; e4 Q/ [% _ 6 y# Y) a, t( w- w$ `+ b- J
然后如上图所示, DA 回退成功. 此时,查看 option bytes 值 , product state 已经变成Open(0xED), TZEN 依然使能(TZEN=0xB4) :" \9 k$ [3 f8 ?7 F 3 i# N' n2 a; } z; G! ]8 E
, A# H: g# P& Q" a) A& ^& ^ 5.2. 关闭 trustzone 如果需要也可以将 TZEN 关闭(TZEN=0xC3, 可直接修改, 这点与U5必须伴随 RDP回退操作不同), 这样芯片就完成恢复成原始状态了.$ b* I7 V- i; G1 C5 ] 7 v8 R3 s \! W8 Z3 { 2 n5 v8 G& O# p+ {5 W- M
s$ @+ K0 l( d) n% V 6 @ P& |/ @7 z# X; o/ i 转载自: STM32单片机+ y2 G! A; E0 v2 J: E/ |0 H' ]! M 如有侵权请联系删除, K' ]- ^: H5 T* c6 c ; `: ]% @8 _- @1 u! a |
【NUCLEO-H533RE评测】-01-开箱及资料准备
【STM32H503评测】+基于STM32CubeMX生成工程点灯
实战经验 | LAT1585 STM32H5在使能TrustZone下实现High-Cycle的数据存储
详解STM32单片机的堆栈
STM32大神笔记,超详细单片机学习汇总资料
小白也能明白的STM32的低功耗与唤醒机制
STM32芯片命名规则
STM32 引脚到底有多少?为什么一个引脚能当好几个用?
STM32时钟详解
经验分享 | STM32H563 SPI DMA应用演示
微信公众号
手机版
值得收藏