
01前言( A( `' W3 Z$ ? X4 _ m6 n# b, A 本文档通过一个动手实验, 详细演示了如何在 STM32H563 上运行一个 OEMiROT 的功能. 旨在针对那些 OEM 想自己实现一个基于 STM32H563 上的 iROT 功能而又不知如何开始的开发者. 02准备工作# ~3 Z; _/ l- ?# s$ i3 o u & Z1 n) G+ m* w" Y3 l ![]() ; A; u0 q5 O' n/ y 软件包 : STM32Cube_FW_H5_V1.1.0 / S/ \6 d) B/ M/ d3 a7 a3 b 工具: • STM32CubeProgrammer v2.14.0) d6 s+ A7 z' x • Tera Term 串口终端显示% H) C( O u# t9 i* T. q4 ~* N • Trust Package Creator(安装 STM32CubeProgrammer 时一并安装, 注意勾选)- {% W: z7 m l; L + z7 q. g2 c* u) V8 r# p# r IDE: STM32CubeIDE v1.13.0 - u! n( x; x. G$ T% e 03烧录 OEMiROT 固件并运行 3.1. 脚本环境配置板编程基础 本动手实验基于 STM32CubeH5 固件包, 此包必须位于一个没有中文且没有空格的路径下, 于是我们将此包拷贝到 C:\workspace 目录, 在此包路径 \STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning 目录下有一个 env.bat 文件, 用文本编辑器(如记事本)打开此文件: j+ t6 ~1 j% [( k- ] ![]() 4 |* e. x0 v6 Z U 检查上面两行, STM32CubeProgrammer_CLI.exe, 以及 STM32TrustedPackageCreator_CLI.exe 这两个工具的安装路径是否跟你电脑中的安装路径符 合, 如果不符, 则需要进行相应的修改./ P x) Z6 G! ]; c" x# h2 I6 G" S 3.2. 运行 OEMiROT 预配置(provisioning)脚本 f( w+ o4 Z$ l2 K+ L : H( A; O, u* G0 t% Z7 [ 再进入到 cube 包下的目录 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEOH563ZI\ROT_Provisioning\OEMiROT 目录下, 有一个名为 provisioning.bat 的脚本, 双击运行它:, I: z [: R% E; t ; ?9 \) }% Y/ _8 a ![]() 如上图, 系统会自动打开一个 DOS 命令终端窗口, 在此动手实验过程中, 如无特别说明, 此窗口将一直保持, 我们将通过此窗口的提示信息进行每一步的操作. 如上图, 信息提示我们打开TrustedPackageCreator 工具, 生成 OEMiROT_Config.obk 文件.; ~/ |+ a: G& g/ [ 3.3. 生成 OEMiROT_Config.obk# n- r5 q% J/ i6 o9 ?' I 打开 TrustedPackageCreator 工具:8 s6 O/ I: U! f' B) T) E ![]() 如上图, 在最左边 ①处点击 “H5”, 然后在②处选项”OBKey”, 接下来在③处选择STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Config 目录下的 OEMiRoT_Config.xml 文件, 此文件为生成 OEMiROT 对应 obk 文件的配置文档. 然后下面会显示 3 个密钥对, 从上到下分别为 :) u: V, U" ?" z& T% A • OEMiRoT_Authentication_S.pem: Secure APP 对应的认证密钥(使用公钥) • OEMiRoT_Authentication_NS.pem: Non Secure APP 对应的认证密钥(使用公钥) • OEMiRoT_Encryption.pem : Secure APP+Non Secure APP 固件加密密钥对应的解包密钥(使用私钥)5 _6 u+ |! K+ ]% Z6 D/ h # O0 A2 U7 t# P# w' { 这三个密钥其实都是成对的, 即公钥私钥对. 位于 Keys 目录下. STM32CubeH5 包下已经自带了默认的密钥对, 如果你不想使用默认的, 则可以点击上图中的4中的 “Regenerate” 重新生成这三个密钥对. 一旦重新生成, 则需要注意保存这三个密钥对.- E3 j# J2 t% [ ) R. n8 ^) g W/ N- ]& ?7 a - v5 o% U* S( C! E9 ^9 A 接下来就要生成 OEMiROT 对应的 obk 文件了, 在右边的输出路径下, 选择一个路径, 比如Binary 目录. 最后点击生成. 则将在 Binary 目录下生成 OEMiRoT_Config.obk 文件. ) f4 a* A, K* y4 w: N$ _/ q+ L, d 3.4. 生成 DA 对应的 obk 文件 回到脚本终端窗口, 输入回车键 : c" U5 z2 a) z, W, i ![]() 如上图, 提示你通过 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 目录下, 这些文件均可直接使用, 所以这里不再重复讲述它们的生成过程.2 r) h' u0 r0 ~, a! z5 a% z1 h: h ' |5 c, P. N. r7 A 直接按下回车键.. : J# ~% x: S/ @3 y8 F 3.5. 编译 OEMiROT_Boot 工程 ![]() . j( n( w# S5 V) j 如上图, 提示用户打开 OEMiROT_Boot 工程并编译. ) `+ X* O( N; V; s7 Q& D 于是用 STM32CubeIDE 打开工程, 路径为: STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Applications\ROT\OEMiROT_Boot\STM32CubeIDE 目录下, 编译过后,会在工程下的 Binary 目录下生成 OEMiROT_Boot.bin 文件. 再回到终端窗口按下回车键… : ~, Z7 i3 T' d. g1 F 3.6. 编译 OEMiROT_Appli_TrustZone 工程 用 STM32CubeIDE 打开工程: STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\Applications\ROT\OEMiROT_Appli_TrustZone\STM32CubeIDE: P ? f5 `( n# b, o) A- i 此工程下有两个子工程 :1 k7 [8 b' w s8 a3 Y" W# l ![]() 7 T8 s4 k0 ?5 c9 R6 ]9 D( [9 b 如上图所示, 先编译 Secure 工程, 再编译 NonSecure 工程. 编译通过后, postbuild 脚本会在Binary 目录下生成原始 bin 文件和加密后的固件. % N8 k! z) X4 ~3 T6 F4 F8 W' E: ` 4 M" g8 A, Z; N) W& l& u ![]() 1 c4 R6 g" r6 e% {6 c ; ]/ h! s! ^: x6 d1 ~ 原始 bin 文件是用来初始安装的, 而加密后的固件是用来做升级的. 加密和签名过程正是postbuild 脚本来实现的, 其对应的固件加密密钥是此次编译过程中脚本随机产生的密钥. 此密钥会通过 3.3 节中所产生的 OEMiRoT_Encryption.pem 对应的公钥来进行打包并放入 header 中.而签名所用的私钥并正是 3.3 节中所产生的 OEMiRoT_Authentication_S.pem 私钥, 它对应Secure 工程签名, OEMiRoT_Authentication_NS.pem 则对应 Non Secure 工程签名. : ?2 z! K% Z# P: L1 w" j 3.7. 手动生成加密且签名的映像文件(可选) g' C0 @- q [. T- T 除了通过 postbuild 脚本来自动生成固件加密且签名的映像文件外, 你也可以通过手动的方式来生成它.如下图, 我们可通过 TPC 手动将原始 bin 文件加密且签名.* Y* l. i6 @' ^8 O a3 d6 i, j5 B- b* U/ [8 A ![]() ! m g" ~3 M( T- `- ^' l. ~. ?4 v 9 j: Z# @( H( j, y ^; W9 v8 x 如上图, 打开 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 脚本会自动完成, 所以, 这一步骤并不是必须的.0 B7 U0 X1 Z P' i * q d Y6 U9 X' h; ]1 s/ _ 此外需要注意地是, 在 STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\OEMiROT\Images 目录下还有其它几个用来手动生成加密签名映像的配置文件, 如下图所示 : 5 [3 ?8 R9 c' ~* U% v u( y ! h2 p5 n) n' }$ l ![]() 通过这几个文件名, 顾名思义, 分别对应着 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 ]! v3 @! G1 r8 Y7 w 3.8. 生成加密签名的数据映像(可选) 回到终端窗口按下回车键, 如下所示 :, o2 f4 I+ k, P4 \, T4 I 5 ]6 ~. q y+ |8 p! q: T7 w) ~ ; Q7 ]/ W& O! Y+ o6 |; I5 N9 D; A ![]() 提示我们通过 TPC 手动生成加密数据映像. 工程中默认是未定义任何 Data image 的(flash_layout.h 头文件):/ l/ ^9 Y" `& S* t0 ]! H 9 e/ [' d5 x, X. E ![]() 5 p$ N' X# W; T; k6 z6 y 因此, 此步骤默认我们是可以跳过. 如果工程中此宏修改成 1, 则需要手动通过 TPC 来生成加密的数据映像. 方法类似于 3.6 节的手动生成环节, 只不过配置文件换成 xxx_Data_Image.xml.& Y* ?* X, |, ?, Q 这一步骤, 我们直接在终端窗口中按下回车键… ![]() ! Z$ P0 z) I" X/ r/ @# B& C( o 接下来再次提示生成 NS APP 对应的 Data Image, 同理, 在工程中默认宏中是没有配置的, 因此直接按下回车键…4 h! |. k( h z! w $ z& I6 B; o& V5 {3 T$ z6 T 3.9. 预配置(provisioning) 3 ]' b' L) D% |' z! K2 F. _$ H ![]() 在做预配置之前, 提示你是否已将 BOOT0 引脚拉低. 确认 NUCLEO-H563ZI 板上的 BOOT0引脚没有连到 VDD(CN4 的 BOT0 引脚未接任何东西即可). 确认后按下回车键…! l# n& d0 E, h/ }& ] # p5 F% V; l6 v5 n+ T ![]() ; k& Y% A" X6 T" I9 [, w( r$ x 如上图, 这此过程中, 脚本会自动烧录 boot, S APP, NS APP 三个 bin 文件, 以及配置 option bytes, 接下来提示你输入芯片最终的 product state, 这里我们输入”CLOSED”…(千万别设置为 LOCKED 状态!) ! G! W/ [! m' |" S9 k% r9 R1 Z . G- F- u q4 n% H- K" u0 f9 b8 J ![]() # g) O* Z: l* U 如上图所示, 在此过程中, 脚本会先将芯片的 product state 切换到 provisioning 状态, 然后再做预配置, 这里会预配置 OEMiROT 的 obk 文件,以及 DA 的 obk 文件, 然后最终将芯片的product state 设置为你上一步输入的最终芯片状态. 最后系统提供已完成. 到这一步, 脚本的整个流程结束. 接下来, 我们验证下烧录后的芯片是否工作正常.! s, y5 ~* b1 K. l4 {9 P 3.10.检查程序运行状态; Y$ [7 {8 C3 i+ P: o- A 打开 Tera Term, 设置串口波特率为 115200 bps, 然后复位板子, 查看打印信息…7 `4 O( r# \4 [) P ![]() 如上图所示, 当打印信息显示 User App #A 时, 表示 NS APP 已经运行成功, 所有程序运行结果均正常!6 y" i! {+ b9 m' o% N# g$ m: n 04固件更新) d. e1 r6 x; L# m7 H3 M 接下来, 我们将演示通过 NS APP 触发程序跳转到内置的 bootloader 中, 并通过串口下载新的加密固件, 复位后并安装它. 4.1. 修改代码, 并重新编译工程 打开 NS APP 的工程, 在 main.c 文件中将 NS APP 的版本号从 “A”改成”B”:, j9 P- e: f9 W0 ~4 Q4 i , C0 g+ O" `& | ![]() ! ~# p2 Y0 P) w0 E* { 然后重新编译 NS APP 工程. 9 M( t! S9 a/ i3 K Postbuild 脚本将重新生成 S APP 和 NS APP 的加密固件 :# _; n( |5 {+ R6 e ; y! Y' X2 A! W! o# S# k ![]() - E! ~3 D$ e, I) ~ 如上图所示, 这四个文件均将重新生成.8 Q, d$ r0 M) x# c% e4 b3 u: O $ q8 d% ?1 e. x# F" z 接下来我们将升级 APP 固件.6 {5 M7 U% H8 ?% A$ s . q$ k. j b- V5 i! m- [ 4 |! l( }: L- Q' o' N 4.2. 跳转到 loader 程序 % [! ?/ u5 a( _8 ]2 ~+ ~* A# v' ~ 在串口终端中我们输入”1”:9 D4 s) W) w/ u S ; o6 Z6 `! B1 a" n& V( _! D6 z ![]() " V* S( ^# `& [$ T5 E 如上图所示, 输入 1 后, 程序跳转到芯片内置的 bootloader 中. 断开 Tera Term 的串口连接 :8 H' V3 N8 {: g$ o( {- W7 E7 [ ) P5 L. K, A. u, C/ M ![]() 4 G7 Z; c. Z/ D# d 4.3. 通过 STM32CubeProgrammer 下载新固件 打开 STM32CubeProgrammer, 并通过串口模式连接芯片: 1 D! a: [, c* V8 }2 w0 n ![]() 将新生成 NS APP 的加密后的固件 rot_tz_ns_app_enc_sign.hex 拖入到STM32CubeProgrammer 中 : B" ~( f5 E- _" }! _ ![]() , u: N8 F3 C6 `/ C 如上图点击下载., e3 S1 n& }2 w6 E 9 i- \4 H) Y7 ~- l 0 Z- k9 y5 W/ ~% }! u6 V 同样的, 也可以将 S APP 的加密固件 rot_tz_s_app_enc_sign.hex 拖入STM32CubeProgrammer 中并下载 :5 [, |" ^3 Q" V2 g, {4 K8 X5 r 7 X) s5 [0 F1 F) f/ w3 ]2 v7 Q ![]() # e( n3 L- E+ F 下载成功后, 断开 STM32CubeProgrammer 的串口连接, 并使 Tera Term 重新连接串口 , 然后再重启 NUCLEO-H563ZI 板, 于是可以看到如下打印信息 : 6 h! o: z5 ?! `7 o" q- h1 {3 b ![]() % C) R$ N4 A1 s * N* P3 Z. R, F* H! Q/ j. h4 b9 M 如上图所示, NS APP 的版本打印信息从 “A”已经改成”B”了, 这说明固件(加密且签名的)已经更新成功. 05还原- \. [1 _6 a- B 5.1. DA 回退 打开 STM32CubeProgrammer, 采用 ST-Link 模式, 在未连接的情况下,在左边选择盾牌图标, 然后再选择”DA”选项卡, 再点 Discover 按键….$ e1 J+ Z* {" \+ b8 `2 l5 M ' ]( \3 @" ~5 o6 P/ K8 M0 q 7 C3 j& o8 {% T- z1 y( z* h ![]() + k6 Z& O: O0 b3 @* R 界面变成如下所示 : ![]() 3 a- v& s7 q# K 8 J- m, k3 _; J. T' | 如上图所示, 第一个红框内输入 DA 私钥文件 :5 m& X/ r6 T$ m3 o6 p STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Keys\key_1_root.pem, 9 X/ c7 H1 g9 G# |. h 0 n$ h A) @" E 第二个红模式内输入证书 : STM32Cube_FW_H5_V1.1.0\Projects\NUCLEO-H563ZI\ROT_Provisioning\DA\Certificates\ cert_root.b64/ h8 S4 g/ B; `% f " U8 a' N; H3 ]3 j/ U 然后击点 continue 按键, 然后界面变成如下所示 : , g2 D8 Z1 Z+ ^% V ![]() # S! k& S: R0 G% @ 如上图所示, 在左边选择”Full Regression”, 然后再点击 Execute 按键… ![]() + W' I# w: l$ X5 X( W, L 3 n/ s, O7 ^) Q/ A7 _9 |7 n8 ? 然后如上图所示, DA 回退成功. 此时,查看 option bytes 值 , product state 已经变成Open(0xED), TZEN 依然使能(TZEN=0xB4) : / o7 p/ \& x4 P! _5 p5 U# E5 M/ E2 [ + {* {% [ Q( l3 R! y ![]() , b( b( Y7 f: j- T( x4 y& D6 S 5.2. 关闭 trustzone 如果需要也可以将 TZEN 关闭(TZEN=0xC3, 可直接修改, 这点与U5必须伴随 RDP回退操作不同), 这样芯片就完成恢复成原始状态了. 1 N3 ?8 v4 L D3 L- y ( H! m. p1 m3 P7 W: H ![]() 转载自: STM32单片机- g( @2 ~6 ~3 }" r. l 如有侵权请联系删除! g2 r% {; q6 F) o2 P* x$ P& f m. I6 S9 }/ m3 D! f o: U" Z9 v # m1 ~6 ~! R- s: Q( R* z |
STM32H7的TCM,SRAM等五块内存基础知识
STM32H7的TCM,SRAM等五块内存基础知识
简单了解一下STM32H7的BDMA
NUCLEO-H563ZI刷入Micropython固件并点亮LED灯
【NUCLEO-H533RE评测】+点亮小灯
【NUCLEO-H533RE评测】+09 低功耗测试
【NUCLEO-H533RE评测】+08 初识FreeRtos
【NUCLEO-H533RE评测】+07 IIC调试
【NUCLEO-H533RE评测】+06 ADC调试
【NUCLEO-H533RE评测】+05 调试PWM
值得收藏