STMCU小助手
发布时间:2024-2-29 16:02
|
01前言 本文档通过一个动手实验, 详细演示了如何在 STM32H563 上运行一个 OEMiROT 的功能. 旨在针对那些 OEM 想自己实现一个基于 STM32H563 上的 iROT 功能而又不知如何开始的开发者. # e6 V9 V0 ]1 L: Y 02准备工作 , i$ D: O# ^: w5 X
3 \6 ]. s. b9 d* j 软件包 : STM32Cube_FW_H5_V1.1.0 7 b T# a0 v3 P & \. ^- i* |1 [ 工具: • STM32CubeProgrammer v2.14.0* Z% x3 s0 Q1 x) w& T7 M) R( U2 G3 { • Tera Term 串口终端显示) [1 T3 ~2 ~+ {* y$ M • Trust Package Creator(安装 STM32CubeProgrammer 时一并安装, 注意勾选)( C1 }2 X4 p0 D, I* C9 Z4 f% @1 C: [ 8 a" S2 _# ~( O IDE: STM32CubeIDE v1.13.0 03烧录 OEMiROT 固件并运行 3.1. 脚本环境配置板编程基础 本动手实验基于 STM32CubeH5 固件包, 此包必须位于一个没有中文且没有空格的路径下, 于是我们将此包拷贝到 C:\workspace 目录, 在此包路径 \STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning 目录下有一个 env.bat 文件, 用文本编辑器(如记事本)打开此文件: # z1 \& E9 f- Y3 n- |8 e0 | 4 v7 Y$ _- x! K, Q* v8 G
检查上面两行, STM32CubeProgrammer_CLI.exe, 以及 STM32TrustedPackageCreator_CLI.exe 这两个工具的安装路径是否跟你电脑中的安装路径符 合, 如果不符, 则需要进行相应的修改. 3.2. 运行 OEMiROT 预配置(provisioning)脚本 再进入到 cube 包下的目录 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEOH563ZI\ROT_Provisioning\OEMiROT 目录下, 有一个名为 provisioning.bat 的脚本, 双击运行它:/ `7 a0 C3 A" V. D 2 b, _$ Q/ i- W$ p
% ]# N/ H# k4 f" {3 b7 G 如上图, 系统会自动打开一个 DOS 命令终端窗口, 在此动手实验过程中, 如无特别说明, 此窗口将一直保持, 我们将通过此窗口的提示信息进行每一步的操作. $ \; r- o* W P5 V ~$ Q0 @ 5 {$ X/ P4 n, x( Y 如上图, 信息提示我们打开TrustedPackageCreator 工具, 生成 OEMiROT_Config.obk 文件.& ^: [) X; a* I! E6 L/ \) y % t" }9 \3 K( ]) s 3.3. 生成 OEMiROT_Config.obk$ J, g1 r8 ~6 z 打开 TrustedPackageCreator 工具:! X) g. u% d' ~" C, V, _ : n# X* B# ^1 `6 v2 t& a
5 i. t" {& P9 M4 w C8 n 如上图, 在最左边 ①处点击 “H5”, 然后在②处选项”OBKey”, 接下来在③处选择STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Config 目录下的 OEMiRoT_Config.xml 文件, 此文件为生成 OEMiROT 对应 obk 文件的配置文档. 然后下面会显示 3 个密钥对, 从上到下分别为 :; ^! e) j# J' I • OEMiRoT_Authentication_S.pem: Secure APP 对应的认证密钥(使用公钥); w( h. ?! w& L+ e* a& X • OEMiRoT_Authentication_NS.pem: Non Secure APP 对应的认证密钥(使用公钥) • OEMiRoT_Encryption.pem : Secure APP+Non Secure APP 固件加密密钥对应的解包密钥(使用私钥)5 ^( V! L, `9 z" D( n 这三个密钥其实都是成对的, 即公钥私钥对. 位于 Keys 目录下. STM32CubeH5 包下已经自带了默认的密钥对, 如果你不想使用默认的, 则可以点击上图中的4中的 “Regenerate” 重新生成这三个密钥对. 一旦重新生成, 则需要注意保存这三个密钥对. 接下来就要生成 OEMiROT 对应的 obk 文件了, 在右边的输出路径下, 选择一个路径, 比如Binary 目录. 最后点击生成. 则将在 Binary 目录下生成 OEMiRoT_Config.obk 文件. 3.4. 生成 DA 对应的 obk 文件 回到脚本终端窗口, 输入回车键 : 8 [9 ] g7 Y+ }8 m: ]; V
C8 I. D# p' l+ M( g# q# K$ o 如上图, 提示你通过 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 目录下, 这些文件均可直接使用, 所以这里不再重复讲述它们的生成过程.4 Q2 U' u; t. g1 [: T9 w / ~( O5 P- e: G: o/ n 直接按下回车键.. 8 R6 P0 S) W8 F; e- D7 A$ K" [6 K 3.5. 编译 OEMiROT_Boot 工程 7 }( |( G7 s% e7 |6 F) j/ X4 w
2 j+ p S N$ M2 Q5 E% Q % H; B6 z7 \2 P2 E- b 如上图, 提示用户打开 OEMiROT_Boot 工程并编译. ! X! }* q- s6 x1 b$ [7 m 2 Z! z/ K) R n2 E" C/ l. m 于是用 STM32CubeIDE 打开工程, 路径为: STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Applications\ROT\OEMiROT_Boot\STM32CubeIDE 目录下, 编译过后,会在工程下的 Binary 目录下生成 OEMiROT_Boot.bin 文件. 3 ?1 C4 N8 i, k* \- h& O 再回到终端窗口按下回车键…& C' ~: i1 G8 |9 | 3.6. 编译 OEMiROT_Appli_TrustZone 工程3 q" ~( O" d" {" z% i9 a. P 用 STM32CubeIDE 打开工程: STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Applications\ROT\OEMiROT_Appli_TrustZone\STM32CubeIDE* `4 \+ d2 B; i$ N9 e 6 P m6 E' ]% \1 v4 ^ + V6 ?# g, [+ j 此工程下有两个子工程 :9 u4 N, f+ ~6 w/ S( w/ }2 M8 Y# h ' z( z( \1 Q7 B1 f$ J' s+ G1 z1 z
+ a7 g) E" v7 l& B 如上图所示, 先编译 Secure 工程, 再编译 NonSecure 工程. 编译通过后, postbuild 脚本会在Binary 目录下生成原始 bin 文件和加密后的固件.) |: d4 T7 f9 H1 {' h
1 s& ^$ J0 @) Y& G; }6 \( S % {7 B' Q/ Y# d# e- A$ g+ p 原始 bin 文件是用来初始安装的, 而加密后的固件是用来做升级的. 加密和签名过程正是postbuild 脚本来实现的, 其对应的固件加密密钥是此次编译过程中脚本随机产生的密钥. 此密钥会通过 3.3 节中所产生的 OEMiRoT_Encryption.pem 对应的公钥来进行打包并放入 header 中.而签名所用的私钥并正是 3.3 节中所产生的 OEMiRoT_Authentication_S.pem 私钥, 它对应Secure 工程签名, OEMiRoT_Authentication_NS.pem 则对应 Non Secure 工程签名.% J# _" G) r& d* g # X3 u+ p/ i* b% F 3.7. 手动生成加密且签名的映像文件(可选)0 M* v3 K! r: Y/ J* Z) b) m 除了通过 postbuild 脚本来自动生成固件加密且签名的映像文件外, 你也可以通过手动的方式来生成它.如下图, 我们可通过 TPC 手动将原始 bin 文件加密且签名.
如上图, 打开 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 脚本会自动完成, 所以, 这一步骤并不是必须的.) l* i& ^& f% v4 d( S5 C" H) V8 l . X- B7 y2 y( Q' p+ ? r$ o# t/ R 此外需要注意地是, 在 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Images 目录下还有其它几个用来手动生成加密签名映像的配置文件, 如下图所示 :
3 ]" \) _( T" |. I6 f 通过这几个文件名, 顾名思义, 分别对应着 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). 3.8. 生成加密签名的数据映像(可选)4 v/ |! P$ k/ }; p 回到终端窗口按下回车键, 如下所示 :
* j" v5 P. I0 H4 D% t6 n 3 Q& Q3 X- u- D) [) q( G 提示我们通过 TPC 手动生成加密数据映像. 工程中默认是未定义任何 Data image 的(flash_layout.h 头文件):
2 j1 p r1 K$ ~" @" J+ f1 | 因此, 此步骤默认我们是可以跳过. 如果工程中此宏修改成 1, 则需要手动通过 TPC 来生成加密的数据映像. 方法类似于 3.6 节的手动生成环节, 只不过配置文件换成 xxx_Data_Image.xml.6 J2 T9 e$ ~7 N2 { ( R9 x/ l6 V* M4 S 这一步骤, 我们直接在终端窗口中按下回车键…2 s! d* ~6 E H: I3 w' S3 L ; j1 {! C$ `' F3 Z: n
接下来再次提示生成 NS APP 对应的 Data Image, 同理, 在工程中默认宏中是没有配置的, 因此直接按下回车键…. x! l% ]. A }$ G! e+ O : d9 c. i+ Y# n* q0 J1 n4 r 3.9. 预配置(provisioning)
在做预配置之前, 提示你是否已将 BOOT0 引脚拉低. 确认 NUCLEO-H563ZI 板上的 BOOT0引脚没有连到 VDD(CN4 的 BOT0 引脚未接任何东西即可). 确认后按下回车键… 8 `/ ^( ]5 t0 [7 I* b7 j . N3 J2 }0 @/ ]0 k* ^
4 N6 d# y' O+ G U& z 如上图, 这此过程中, 脚本会自动烧录 boot, S APP, NS APP 三个 bin 文件, 以及配置 option bytes, 接下来提示你输入芯片最终的 product state, 这里我们输入”CLOSED”…(千万别设置为 LOCKED 状态!) + G! A/ p6 S( V" P; K6 N5 R9 p
) K( y+ F2 K; O0 {2 Y, W+ f 4 J$ H) j* a2 w9 X2 p; s 如上图所示, 在此过程中, 脚本会先将芯片的 product state 切换到 provisioning 状态, 然后再做预配置, 这里会预配置 OEMiROT 的 obk 文件,以及 DA 的 obk 文件, 然后最终将芯片的product state 设置为你上一步输入的最终芯片状态. 最后系统提供已完成. 到这一步, 脚本的整个流程结束. 接下来, 我们验证下烧录后的芯片是否工作正常. u/ }1 c# d3 B$ U1 c& y. J7 N 3.10.检查程序运行状态 打开 Tera Term, 设置串口波特率为 115200 bps, 然后复位板子, 查看打印信息…
如上图所示, 当打印信息显示 User App #A 时, 表示 NS APP 已经运行成功, 所有程序运行结果均正常!' {9 H1 M2 n* s- d ! b$ U% y! B9 t" K4 U" D( X; E 04固件更新, k9 M& v3 N) n* J" S M 接下来, 我们将演示通过 NS APP 触发程序跳转到内置的 bootloader 中, 并通过串口下载新的加密固件, 复位后并安装它. % G2 F; M& l. z7 a9 A( t8 Z 4.1. 修改代码, 并重新编译工程; Y3 h3 A# g5 G" v 打开 NS APP 的工程, 在 main.c 文件中将 NS APP 的版本号从 “A”改成”B”:) F0 |# _1 A8 p @& w1 J" f
0 e. r9 p9 D& v b0 c$ ~/ H$ I. W 然后重新编译 NS APP 工程.! V {( J$ Q0 r Postbuild 脚本将重新生成 S APP 和 NS APP 的加密固件 :
. y U# p- `# G9 M 如上图所示, 这四个文件均将重新生成. 接下来我们将升级 APP 固件. 2 ]: O5 l" y/ U' B7 y( R9 ^# ] : J+ r7 C% {2 r7 @3 J* X' r# m 4.2. 跳转到 loader 程序 0 J7 b8 ]# ?! l 在串口终端中我们输入”1”:' C/ F2 e0 W: w' v0 { $ ^" c* B4 m: ` k6 T) E( b! j
如上图所示, 输入 1 后, 程序跳转到芯片内置的 bootloader 中.7 e4 i; h: P5 p% Y! w4 U$ R; r k# p! }3 t& E) C) H 断开 Tera Term 的串口连接 : ) I7 s8 F$ V: K1 a0 w ]$ O
& V" y7 T6 q* c; b: Y: t( F 1 b+ |" M2 s) S' g 4.3. 通过 STM32CubeProgrammer 下载新固件, c% u/ H3 y1 t L q0 { 打开 STM32CubeProgrammer, 并通过串口模式连接芯片:' J) e4 f/ `$ ]! e3 }) h$ \ + g) E0 _+ \. H$ N* G$ Z9 b9 X - {. ~ P' Y. [4 M0 I
, r# Y& k, H5 U* ^$ j& @ 将新生成 NS APP 的加密后的固件 rot_tz_ns_app_enc_sign.hex 拖入到STM32CubeProgrammer 中 :" ]! V+ d G7 v. {) K
如上图点击下载. 同样的, 也可以将 S APP 的加密固件 rot_tz_s_app_enc_sign.hex 拖入STM32CubeProgrammer 中并下载 :7 n% G% y2 m; g5 [5 ^ 3 q' k7 {) c$ s+ ` + m* a$ J9 }; q' X$ Z& Y
" W1 X* P& a. J + ^. h D+ i( `7 O 下载成功后, 断开 STM32CubeProgrammer 的串口连接, 并使 Tera Term 重新连接串口 , 然后再重启 NUCLEO-H563ZI 板, 于是可以看到如下打印信息 :% r+ k5 j( `* M8 ?0 w : l3 s! A- O) W3 B7 ~
' I5 Z. H: V: A6 s0 D. O6 {! F : v" U4 |, Y* X7 z; n0 H7 k/ e N9 g 如上图所示, NS APP 的版本打印信息从 “A”已经改成”B”了, 这说明固件(加密且签名的)已经更新成功. 05还原 5.1. DA 回退0 Q; i( J; A! U+ A4 K 打开 STM32CubeProgrammer, 采用 ST-Link 模式, 在未连接的情况下,在左边选择盾牌图标, 然后再选择”DA”选项卡, 再点 Discover 按键…. / C0 x5 f' {$ n/ R0 i
界面变成如下所示 : , d2 }! j6 R4 y. S7 D3 Z- f; i
; x" M: g7 a. s# u) L3 r 如上图所示, 第一个红框内输入 DA 私钥文件 : STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pem,5 t+ _2 T2 Q4 f5 r 第二个红模式内输入证书 : STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\ cert_root.b64. d5 [/ r! T+ O' H; G% t2 j- g# w 然后击点 continue 按键, 然后界面变成如下所示 : 2 f5 o$ a# m$ I8 a2 Z! Z1 m
- M, ? G5 M/ r9 Q5 ^ 如上图所示, 在左边选择”Full Regression”, 然后再点击 Execute 按键… " N! z' X9 U2 p) [" G
然后如上图所示, DA 回退成功. 此时,查看 option bytes 值 , product state 已经变成Open(0xED), TZEN 依然使能(TZEN=0xB4) :. s+ |, b3 f" @- Q0 \ : A F4 q( l4 v5 W6 m
5.2. 关闭 trustzone5 i. x, H" q) x. G9 q. Z& d5 J/ |; g 如果需要也可以将 TZEN 关闭(TZEN=0xC3, 可直接修改, 这点与U5必须伴随 RDP回退操作不同), 这样芯片就完成恢复成原始状态了. 3 r) e$ G. c y* x- z 5 }) ^ @4 {; o' m$ L$ }( ^
+ {7 V6 J9 l/ r8 C. k" Z s 转载自: STM32单片机 如有侵权请联系删除' c2 \* r1 V( Y( \, j: ^9 q 0 g1 `" P3 ~! E% N# |5 | |
【STM32H5 评测】1、开发板资源和程序开发
NUCLEO-H5E5ZJ 以太网(Ethernet)移植记录
【STM32H5 评测】1、移植记录(LED / Shell)
H5E5开发板评测-1
H5E5评测-4
H5E5评测-3
H5E5评测-2
【NUCLEO-H533RE评测】-01-开箱及资料准备
【STM32H503评测】+基于STM32CubeMX生成工程点灯
实战经验 | LAT1585 STM32H5在使能TrustZone下实现High-Cycle的数据存储
微信公众号
手机版
值得收藏