STMCU小助手
发布时间:2024-2-29 16:02
|
01前言+ }! R3 |- ]) Y1 f* P: ^9 P2 R 本文档通过一个动手实验, 详细演示了如何在 STM32H563 上运行一个 OEMiROT 的功能. 旨在针对那些 OEM 想自己实现一个基于 STM32H563 上的 iROT 功能而又不知如何开始的开发者. 02准备工作4 N& a% y* u$ D- I
软件包 : STM32Cube_FW_H5_V1.1.0 / m/ b" L* c- x1 g- V6 h% C: |! { 工具: • STM32CubeProgrammer v2.14.0 • Tera Term 串口终端显示 • Trust Package Creator(安装 STM32CubeProgrammer 时一并安装, 注意勾选)6 S( ^/ x6 L/ A1 m IDE: STM32CubeIDE v1.13.0 . Z- c& R# q* H* }0 t 03烧录 OEMiROT 固件并运行+ ?, C/ R8 ~: J0 E 3.1. 脚本环境配置板编程基础 本动手实验基于 STM32CubeH5 固件包, 此包必须位于一个没有中文且没有空格的路径下, 于是我们将此包拷贝到 C:\workspace 目录, 在此包路径 \STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning 目录下有一个 env.bat 文件, 用文本编辑器(如记事本)打开此文件: 3 o3 R5 E0 R% o3 n ; ~3 a7 |6 B. l1 m3 Q2 G% }7 D
$ x X5 u- C$ y ; C' |+ V' y0 d 检查上面两行, STM32CubeProgrammer_CLI.exe, 以及 STM32TrustedPackageCreator_CLI.exe 这两个工具的安装路径是否跟你电脑中的安装路径符 合, 如果不符, 则需要进行相应的修改. 3.2. 运行 OEMiROT 预配置(provisioning)脚本 再进入到 cube 包下的目录 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEOH563ZI\ROT_Provisioning\OEMiROT 目录下, 有一个名为 provisioning.bat 的脚本, 双击运行它: : v9 L) e3 C; l; H9 o) x
" L0 r7 E; V) g 如上图, 系统会自动打开一个 DOS 命令终端窗口, 在此动手实验过程中, 如无特别说明, 此窗口将一直保持, 我们将通过此窗口的提示信息进行每一步的操作. 如上图, 信息提示我们打开TrustedPackageCreator 工具, 生成 OEMiROT_Config.obk 文件. : H3 F2 z+ h+ ~; Q8 l$ I6 ` 3.3. 生成 OEMiROT_Config.obk q) n2 H8 J* ~ f+ x 打开 TrustedPackageCreator 工具:" @) C' D$ r" Z$ N! s- k/ z( e
- X+ l7 Q* U+ N$ D2 J0 S% j) o ; N, C2 ^3 a' b 如上图, 在最左边 ①处点击 “H5”, 然后在②处选项”OBKey”, 接下来在③处选择STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Config 目录下的 OEMiRoT_Config.xml 文件, 此文件为生成 OEMiROT 对应 obk 文件的配置文档. 然后下面会显示 3 个密钥对, 从上到下分别为 :4 X- L6 F( l, ?$ ] Y& C • OEMiRoT_Authentication_S.pem: Secure APP 对应的认证密钥(使用公钥) • OEMiRoT_Authentication_NS.pem: Non Secure APP 对应的认证密钥(使用公钥)6 {4 G5 Z# {2 y& V • OEMiRoT_Encryption.pem : Secure APP+Non Secure APP 固件加密密钥对应的解包密钥(使用私钥)0 C5 V5 n0 z- I) j+ x r ' a* i! _9 d7 v/ r- H+ c6 \ 这三个密钥其实都是成对的, 即公钥私钥对. 位于 Keys 目录下. STM32CubeH5 包下已经自带了默认的密钥对, 如果你不想使用默认的, 则可以点击上图中的4中的 “Regenerate” 重新生成这三个密钥对. 一旦重新生成, 则需要注意保存这三个密钥对.# t5 }# Q8 R8 c* A& z( B5 S 3 I1 I3 a, p) q0 y/ U 接下来就要生成 OEMiROT 对应的 obk 文件了, 在右边的输出路径下, 选择一个路径, 比如Binary 目录. 最后点击生成. 则将在 Binary 目录下生成 OEMiRoT_Config.obk 文件.: E* C& ^5 A3 d! S3 Y7 P 3.4. 生成 DA 对应的 obk 文件 回到脚本终端窗口, 输入回车键 :, F( R( l. n, X, p( i0 Q; l 5 E( \8 ~2 D- W( |7 ^8 Q6 z / C1 ?; @- I7 h, d4 d
如上图, 提示你通过 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 目录下, 这些文件均可直接使用, 所以这里不再重复讲述它们的生成过程.- k* V: o( i. P! o, \8 @ ( a5 }8 T$ T6 s) Q0 a 直接按下回车键..- h, S O o- L6 z! ] : h) P& N6 K4 K9 U 3.5. 编译 OEMiROT_Boot 工程5 N3 S9 U( g% d6 Y / \, e9 |8 J( E) |
' L+ U K& O$ s/ ]' w- \2 o 如上图, 提示用户打开 OEMiROT_Boot 工程并编译. 3 B; l6 y' M$ M ) v8 k5 D6 o' w7 [ 于是用 STM32CubeIDE 打开工程, 路径为: STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Applications\ROT\OEMiROT_Boot\STM32CubeIDE 目录下, 编译过后,会在工程下的 Binary 目录下生成 OEMiROT_Boot.bin 文件.. V0 v% x# o9 @7 ~1 U 8 }- j: {7 }, @" @) K) K 再回到终端窗口按下回车键…4 l$ ~$ {8 _- w+ o a; I; W0 ]0 T+ X$ c Y% M3 E 3.6. 编译 OEMiROT_Appli_TrustZone 工程 用 STM32CubeIDE 打开工程: STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Applications\ROT\OEMiROT_Appli_TrustZone\STM32CubeIDE( w% H/ T3 _: H* K) J1 n: v ) D* a, r8 f8 |& n# [" X3 K 此工程下有两个子工程 :" |, q, T$ G4 T" N 0 \0 `: r% C" C- ^. J4 l* E( |, I
如上图所示, 先编译 Secure 工程, 再编译 NonSecure 工程. 编译通过后, postbuild 脚本会在Binary 目录下生成原始 bin 文件和加密后的固件. 7 ]( |0 d+ J8 e0 r
, L- ?7 m- f: j! n5 J , q& ^# a; J" [! x7 K& r 原始 bin 文件是用来初始安装的, 而加密后的固件是用来做升级的. 加密和签名过程正是postbuild 脚本来实现的, 其对应的固件加密密钥是此次编译过程中脚本随机产生的密钥. 此密钥会通过 3.3 节中所产生的 OEMiRoT_Encryption.pem 对应的公钥来进行打包并放入 header 中.而签名所用的私钥并正是 3.3 节中所产生的 OEMiRoT_Authentication_S.pem 私钥, 它对应Secure 工程签名, OEMiRoT_Authentication_NS.pem 则对应 Non Secure 工程签名.# g2 {# u- I" d7 t! Q 3.7. 手动生成加密且签名的映像文件(可选) 除了通过 postbuild 脚本来自动生成固件加密且签名的映像文件外, 你也可以通过手动的方式来生成它.如下图, 我们可通过 TPC 手动将原始 bin 文件加密且签名., A% w/ ^$ s# H, {% v z + S1 F, U( {% F Y$ \4 b3 V
如上图, 打开 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 脚本会自动完成, 所以, 这一步骤并不是必须的.3 _; b' m3 |1 b& p3 O ?) I# O l5 y" y" K. Q( x7 N 此外需要注意地是, 在 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Images 目录下还有其它几个用来手动生成加密签名映像的配置文件, 如下图所示 : & X+ a4 a4 z4 ]/ h- [9 `; l
2 z6 \8 f; Z( d7 V2 B9 `, S 通过这几个文件名, 顾名思义, 分别对应着 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). % O$ D' N: F j' j! l% V. g 3.8. 生成加密签名的数据映像(可选)2 m: g! i3 j2 c 回到终端窗口按下回车键, 如下所示 : # x$ m" K/ K, h ]* C3 h6 h
1 V) B1 C1 N/ }% i 提示我们通过 TPC 手动生成加密数据映像. 工程中默认是未定义任何 Data image 的(flash_layout.h 头文件): , K8 r! }# _0 {! s; i- F* D( ^
4 M$ M2 Z$ U/ S$ C3 d. m0 [. e- n 因此, 此步骤默认我们是可以跳过. 如果工程中此宏修改成 1, 则需要手动通过 TPC 来生成加密的数据映像. 方法类似于 3.6 节的手动生成环节, 只不过配置文件换成 xxx_Data_Image.xml.' W7 g& v5 {) t7 Y6 Y# Q* Q; x 这一步骤, 我们直接在终端窗口中按下回车键…3 I& e) Z3 D" }- {2 z/ | : V$ R. J$ T7 k/ f# `1 k: } 3 q0 R2 h n( V8 W4 S& D K" q
$ l, e# d y' q: g 接下来再次提示生成 NS APP 对应的 Data Image, 同理, 在工程中默认宏中是没有配置的, 因此直接按下回车键… $ [# N6 k% i$ S9 _& \3 r 3.9. 预配置(provisioning): @: {# X3 L" |/ [. s ! ]: n+ T6 @: d4 @+ @$ L
1 K( b! U) w: F# r, W 在做预配置之前, 提示你是否已将 BOOT0 引脚拉低. 确认 NUCLEO-H563ZI 板上的 BOOT0引脚没有连到 VDD(CN4 的 BOT0 引脚未接任何东西即可). 确认后按下回车键…, @ e% c L; [3 D$ M ; p; K/ Q: h1 g9 A6 r. e, T
7 o% @+ y! Q6 G u9 Z& l5 g, t f5 g$ V; t7 U/ r) n 如上图, 这此过程中, 脚本会自动烧录 boot, S APP, NS APP 三个 bin 文件, 以及配置 option bytes, 接下来提示你输入芯片最终的 product state, 这里我们输入”CLOSED”…(千万别设置为 LOCKED 状态!)' ?+ y3 \1 l$ ]8 G7 T o9 s
) ^% y9 p0 W/ U1 c5 ^ f" \: t 3 C. I4 v$ f: P 如上图所示, 在此过程中, 脚本会先将芯片的 product state 切换到 provisioning 状态, 然后再做预配置, 这里会预配置 OEMiROT 的 obk 文件,以及 DA 的 obk 文件, 然后最终将芯片的product state 设置为你上一步输入的最终芯片状态. 最后系统提供已完成. 到这一步, 脚本的整个流程结束. 接下来, 我们验证下烧录后的芯片是否工作正常.2 q4 z* F+ |/ Q& V, I) M 3.10.检查程序运行状态 Q; n- E0 _: d7 k5 g$ P4 l. s6 r 打开 Tera Term, 设置串口波特率为 115200 bps, 然后复位板子, 查看打印信息…
9 V7 W+ U1 v" H& f+ I # P& f' `! m9 h' T: b; U 如上图所示, 当打印信息显示 User App #A 时, 表示 NS APP 已经运行成功, 所有程序运行结果均正常! 04固件更新3 ^9 S- q |7 X) m2 o 接下来, 我们将演示通过 NS APP 触发程序跳转到内置的 bootloader 中, 并通过串口下载新的加密固件, 复位后并安装它. - K+ E% _; Z: W$ G2 H 4.1. 修改代码, 并重新编译工程 打开 NS APP 的工程, 在 main.c 文件中将 NS APP 的版本号从 “A”改成”B”: # A$ M0 Q6 m0 X: l 6 _% d! r) N+ {* d+ _+ |
5 N3 C% t2 F/ Z4 h, k 然后重新编译 NS APP 工程.- a# x4 o7 N3 Q- H! c! d1 }/ ? Postbuild 脚本将重新生成 S APP 和 NS APP 的加密固件 :( Z1 i) b6 H0 U+ O) W ( H* [; O9 v" V4 A . |/ H* b% W( e8 Q' f+ e" @
如上图所示, 这四个文件均将重新生成.( I: z/ F6 f' f- e+ M 接下来我们将升级 APP 固件. l; D2 [2 G% `& b* T2 T& L 4.2. 跳转到 loader 程序6 y- T" F, C# P8 n; w m7 \ 在串口终端中我们输入”1”: ( W2 h/ ^; m4 T. s8 q* w4 @* a& U
5 w" x' @0 r: e' X1 R1 s! r" W 如上图所示, 输入 1 后, 程序跳转到芯片内置的 bootloader 中. 断开 Tera Term 的串口连接 :4 K7 m" d. \4 t* y7 d X3 j, W ( n% U$ l o) j5 z& R0 ?% I6 y
6 ~3 h3 u) I/ g: F0 r/ Q 4.3. 通过 STM32CubeProgrammer 下载新固件( _1 r4 V( Y; C# p% Y2 [ 打开 STM32CubeProgrammer, 并通过串口模式连接芯片: # S' b- I O) {
( S$ V2 P8 F) p2 z9 E" S9 t 将新生成 NS APP 的加密后的固件 rot_tz_ns_app_enc_sign.hex 拖入到STM32CubeProgrammer 中 :9 ~& Q2 u) u& ?2 Y/ ` : n' [% a; x: A( u
" e+ V6 B/ V- D 1 g, c3 M" Q' I4 V) } 如上图点击下载. 同样的, 也可以将 S APP 的加密固件 rot_tz_s_app_enc_sign.hex 拖入STM32CubeProgrammer 中并下载 :' z* C1 G/ E$ ]% n' P* V) {, a : u9 s0 E1 D. O$ Y7 Q _ ) H1 l# I. w: G! {
下载成功后, 断开 STM32CubeProgrammer 的串口连接, 并使 Tera Term 重新连接串口 , 然后再重启 NUCLEO-H563ZI 板, 于是可以看到如下打印信息 :3 l9 T3 e y4 Z7 G- I- z) e ! V6 X% I7 y3 X5 [& C# T1 J5 A6 R
如上图所示, NS APP 的版本打印信息从 “A”已经改成”B”了, 这说明固件(加密且签名的)已经更新成功.9 t. h# Q# u4 R! e( F7 q 05还原 5.1. DA 回退 打开 STM32CubeProgrammer, 采用 ST-Link 模式, 在未连接的情况下,在左边选择盾牌图标, 然后再选择”DA”选项卡, 再点 Discover 按键…. # x, i; ?% A6 `4 J9 h$ t
/ ~1 o9 u5 M$ P% `+ A 界面变成如下所示 :/ r- Z, _- j, V: [ 1 Q% W/ m" ]( y3 ?7 g1 z
7 Y" r5 |% n q7 [ 如上图所示, 第一个红框内输入 DA 私钥文件 :6 T2 C4 X# l3 m2 F 1 F3 J3 L0 B" d8 S4 ~ : g% h; U- a7 l0 j% s; x+ ] STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pem," Z8 F3 @& E. a 6 Q: q# k( P) q3 q9 u8 K. y 6 {* ~7 B% `) S* s; s) B 第二个红模式内输入证书 : STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\ cert_root.b64" g. o- S) Y D * d0 ^5 W. p7 ]. G 然后击点 continue 按键, 然后界面变成如下所示 : 9 ?" M" L) X& ]' V! U
- }0 h+ Q* [$ n7 ^% D 4 K6 x( `1 U) x6 C* W, Y+ I9 l* X8 s 如上图所示, 在左边选择”Full Regression”, 然后再点击 Execute 按键…% M' ]" \0 |- Z
7 V4 u- p% H0 A. T) o+ z# P 然后如上图所示, DA 回退成功. 此时,查看 option bytes 值 , product state 已经变成Open(0xED), TZEN 依然使能(TZEN=0xB4) : ) W$ ~& w9 R' ~% n- \
7 w. P( t& R( @ Q6 ~% I' R 5.2. 关闭 trustzone 如果需要也可以将 TZEN 关闭(TZEN=0xC3, 可直接修改, 这点与U5必须伴随 RDP回退操作不同), 这样芯片就完成恢复成原始状态了., S( O' f3 Z2 a) I+ p }9 M
G) P6 H( u! M / |# B1 ?( m2 y* w9 P 转载自: STM32单片机 如有侵权请联系删除: b+ K+ A% Q* I. |! u: N+ ? ! `2 `3 |4 z; |' a( ?1 x* r 9 C: d2 h Z. ?( ^/ H1 U5 k8 L |
【NUCLEO-H533RE评测】-01-开箱及资料准备
【STM32H503评测】+基于STM32CubeMX生成工程点灯
实战经验 | LAT1585 STM32H5在使能TrustZone下实现High-Cycle的数据存储
详解STM32单片机的堆栈
STM32大神笔记,超详细单片机学习汇总资料
小白也能明白的STM32的低功耗与唤醒机制
STM32芯片命名规则
STM32 引脚到底有多少?为什么一个引脚能当好几个用?
STM32时钟详解
经验分享 | STM32H563 SPI DMA应用演示
微信公众号
手机版
值得收藏