你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

实战经验 | 进一步认识STM32H5的OBK

[复制链接]
STMCU-管管 发布时间:2025-2-26 11:12
01
! ~9 f9 Q% @6 @/ D) k9 @前言4 y$ D) `, @0 s" p& A' ~9 Q. X

7 v; Q, l! O5 I% y/ F1 c, M7 T; M$ NSTM32H5引入一个新的名词OBK。OBK是Option byte key的意思,本意用来存储密钥,也可以用来存储数据。传统STM32开发与量产需要考虑应用程序以及选项字节,对于STM32H5,则还需要考虑OBK。本文在STM32H5官方文档的基础上带领读者进一步认识一下OBK。1 ~  e8 k& l- A' b& Z, S

- B1 Z8 D1 P2 ^9 {* A( a$ x02
0 o9 f& C7 n7 g+ X; S1 UOBK存储区的几个疑问0 {: W3 Q& T6 z# N. R: z
2.1. OBK是STM32H5系列都有的吗?: x" W( e! T. }% N4 x7 R0 R- g# ^
并不是所有的STM32H5系列都存在OBK。在STM32H503上相应的DA【调试认证】功能是借助OTP来完成的,也就是说,STM32H503并没有OBK。
, D9 ^- L5 k6 m% ~
: o6 W) B' v7 B2 S2.2. OBK区是使用STM32H5必需的吗?
- e; R. u% c9 U3 S9 \8 p" L如果用户开发STM32H5应用,是否可以不使用OBK?可以。
6 w' W+ N; }/ O0 q: N& WSTM32H5引入了新的芯片生命周期概念,其Open状态类似于传统STM32的读保护RDP 0级别。如果你的产品从来没考虑过读保护RDP,那么意味着你过去使用STM32都是在默认级别读保护RDP0。在这种需求下,产品量产时只需要关心应用程序和选项字节,不需要理会生命周期概念,自然也不需理会OBK。
" G5 p* C, E, e. _% X0 Y另外,如果用户希望在产品发布后SWD/JTAG都不能被访问,那么只需要将STM32H5设置成Close或者Lock状态,也不用理睬OBK。
, p5 l' C- s# @, G8 h% w  X% Z
8 x/ C1 V6 T0 y5 ?- F. O. {2.3. 不使用OBK区会不会是一种技术上的浪费?) o' b0 t( m# ]% N7 G7 R0 e6 S* [( D
如果在用户Flash使用已经紧张的情况下,不使用OBK确实是一种浪费。OBK总的大小有8K之多,可以写入任何数据。如果用户Flash空间紧张,即使不考虑任何安全保护的需求,理论上也可以考虑使用OBK。不过OBK的读写受到OBK存储区规则的限制,尽管有8K这么大,是否可以完全使用这8K,依赖于特定的应用需求是否和OBK-HDPL规则相匹配。; s) X% d; z) w1 L; c+ i' }# Z
, w- E% r( ?- x# r) Y4 S  ^# {
2.4. 什么情况下一定需要使用OBK区?( k8 t0 ]# c4 c4 f8 c: O  b
STM32H5的优势之一是引入芯片生命周期管理,例如支持将产品状态设置到Close状态。在Close状态,除非用户能提供相应的密码和证书作为凭证进行DA认证,否则通过SWD/JTAG不能访问应用代码,也意味着代码得到了外部访问保护。在这种情况下,若需要使用OBK存储DA认证的相关的信息,这个时候OBK就必须使用。
( A5 B5 Z' n$ S( |0 _换句话说,你是否在脱离Open/Provisioning状态后还希望通过SWD/JTAG访问 STM32H5,则建议使用OBK区。
, a. [4 e5 r9 O" s, N8 s( q6 M  @) X1 \$ s8 w* v9 B
03
- K- n3 V7 ~- _" \OBK文件
9 y. D/ A0 ?4 G; |
& S$ g. E! g2 O) H3 I+ U% E& ^3.1. OBK 文件的格式   g9 x8 H2 e3 ^: ^, i) U
OBK存储区既可以用来存放密钥也可以存放数据,即OBK的内容可以和应用有关。也就是说OBK不仅仅可以用来做DA认证,也可以作为应用程序的数据区。如果OBK用来做DA认证,则OBK的格式要符合DA认证的要求;如果OBK用来做应用程序的数据区,则OBK的格式要符合应用程序的要求。而应用程序需求千差万别。因此,OBK烧录时,并没有定义它的内容符合什么样的要求,而只关心三个方面:
  n, w& X' j  R....uint32_t.destAddress:烧在哪个地址
' j6 j$ E. k0 Y! c/ F$ u9 ], t9 C# G....uint32_t.OBKeySize:大小是多大
1 l/ f, Z) |3 t....uint32_t.doEncryption:存储在MCU中是否需要加密
, r0 t6 v: K6 y8 a% l( x上位机的OBK文件相比较OBK存储区的实际内容就多了一个头部,头部的内容就是以上三项。头部信息的存在是为了告诉烧录程序,如何处理OBK文件中的payload负荷,头部信息本身在OBK存储区中并不存在。: h6 I, p1 K) d
OBK文件中的payload负荷如果没有在头部指定加密的情况下,可以和存储区中的相应位置的数据一一对应。如果在头部指定加密,相应的STM32H5支持硬件加密,那么OBK文件依然是明文,但是OBK存储区则是密文。
8 o, m2 N3 O4 n. s  Z" t这也说明,对于OBK烧录工具,不管是证书,密码,还是数据,都会一样被处理。
4 a( w; G, x. A* d/ J4 x9 A
% E* ^) G( Y  e, Q! m# z2 h
3.2. OBK 文件生成的方法
& j5 f) g/ I6 D' Y' o( GSTM32 Trusted Package Creator可以用来生成DA以及应用需要的OBK文件。它的输入是xml文件,可通过图形界面或者文本进行编辑。对于没有在图形界面上显示的配置项目,可通过编辑xml让它在图形界面上显示,也可以直接编辑XML,然后再加载XML来进行OBK生成。
* ?5 d0 e" \, D) K' Y' {6 d& b生成基于密码的DA OBK界面如下。注意,这里输入的密码会被Hash放入OBK文件中,也就是说从OBK文件是无从得知用于DA的密码是什么。因为DA认证也需要后期主机输入凭证对MCU进行解锁,这个界面也同时会生成password.bin。password.bin内容则包含密码明文。非开发阶段,用户要注意对password.bin的保密。% J6 t2 v0 V" |7 o# a$ |
12.png
生成基于证书的DA OBK界面如下。
$ K) B; w# ^, Z' f1 `! R
13.png
生成STiRoT的数据OBK界面如下。
# T$ }9 d, s3 H- B8 _5 N
14.png
生成OEMiRoT的数据OBK如下。7 K, P5 }3 J- F# w* D7 T. s
15.png
04& [: m# D; A8 b, r$ G, B
OBK烧录方法 ; E5 j2 d* W' @2 f- \' W+ y
& z4 O$ r6 C5 ~% A
4.1. 使用RSSLIB
$ O. ]0 Y8 O7 C% \/ }! m7 [  w4 SSTM32H5提供RSSLIB支持OBK烧录。最典型的用法存在于STM32CubeProgrammer中,它使用运行在MCU上的RSSLIB的函数进行OBK的烧录。
0 N1 U2 X* T- M" [# E: `+ I% U+ j在Product state为Provisioning时,烧录OBK的界面如下:" J1 H) I+ e) j9 {1 m
16.png
注意,一般情况下,STM32H5要求烧录OBK要使用Provisioning状态,这是综合考虑多种OBK内容的需求,并不意味着对于特定的OBK就不可以使用其他状态。! Z6 p- @0 ?( Z  R# h4 |; m) }- J
对于STM32H563等产品,它们不支持硬件加密OBK,这个时候在其他状态烧录OBK,是可行的。
# U* D/ X# Y- s选择Nucleo-H563ZI开发板,选择Open状态。打开STM32CubeProgrammer,这个时候,选择同样的OBK烧录操作,我们会得到如下警告,告知我们OBK无法进行烧录。
$ V* Z# O) Q! g7 C- ~
17.png
如下图所示,我们将boot0管脚同VDD连接在一起,进入到bootloader模式,我们依然会得到前述的错误。: q$ s1 p3 T6 |# K8 L
18.png
但是这个错误是由图形界面给出的。如果我们使用命令行,则会获得不一样的结果。命令行如下:% v- `3 h+ k1 u  E  g5 k& }
STM32_Programmer_CLI.exe -c port=swd mode=hotplug -sdp
* P2 W, |5 N4 \+ j% B  i8 D/ ?! b' _DA_ConfigWithPassword.obk
0 M* M7 r' L  H这个时候我们可以停留在或者退出bootloader模式,使用STM32CubeProgrammer,我们可以看到OBK区域已经被成功烧录。
( ^1 A4 B1 B. R$ B  K1 Q
19.png
通过这种方式,可以确认你烧录的OBK内容。如果你的OBK不需要被MCU加密, 这种方式相对于Provisioning状态意味着有一个确认的优势。
6 F% }, L: l6 J2 Z2 M4 h' K2 ~不过,如果你没有拉高boot0管教,即使你使用STM32CubeProgrammer命令行进行烧录,也会给你返回失败的log。
0 T& g- p7 b: a8 O: h# u3 S0 E
20.png
4.2. 直接使用寄存器操作 8 s/ L8 n/ b9 M4 u7 @
STM32提供了HAL库,让MCU用户可以在应用程序里对OBK使用寄存器进行读写。STM32Cube软件包提供了相应的例程,举个例子:2 K. C1 y3 j2 b/ M
  1. STM32Cube\Repository\STM32Cube_FW_H5_V1.1.1\Projects\NUCLEO H563ZI\Examples\FLASH\FLASH_OBK_EraseProgram
复制代码
这里就包含了一个完整的OBK烧录例程。
: F& Q( h  L/ ~: x值得注意的是,当在支持OBK加密的STM32H5系列上,Open状态使用例程进行OBK得到的结果并不正确,原因在于Open状态会导致和产品发布状态例如Closed的密钥不一致。5 K; K  e) @) H- s" w; Q
这个例程也可以用来理解OBK-HDPL的概念。2 _; b, V% e6 Y+ U( c$ T
同样,使用寄存器直接编程,在Open状态进行OBK烧录具有OBK明文确认的优势。7 g2 f3 m& Y# A9 X8 [
1 k* S' @; I! v# w9 A/ j" W
05
) f- n' t( R. f: U" C: d# l" ~小结
- r/ a0 T3 K) E0 o通过本文,希望用户在STM32H5正式文档的基础进一步了解,OBK的用处, OBK与OBK文件的差异,OBK的生成工具,OBK的烧录方法,适合STM32H5的用户在实践中进行参考。
3 N& B  X+ G' Z) v9 X3 f7 z LAT1429_进一步认识STM32H5_OBK_v1.0.pdf (848.01 KB, 下载次数: 0)
收藏 评论1 发布时间:2025-2-26 11:12

举报

1个回答
lugl 回答时间:2025-2-26 22:15:43

感谢管管大大,普及OBK的知识。

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版