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

STM32F72xxx和STM32F73xxx微控制器上的专有代码读取保护

[复制链接]
STMCU小助手 发布时间:2022-7-12 23:02
前言: T9 [; B  A0 `/ d( p. k! Z+ {7 f
软件提供商开发了复杂的中间件解决方案(知识产权代码,或IP-code), 保护它们对于微控制器而言至关重要。, m8 V, x4 ^( S( g
为了应对这一重要需求,STM32F72xxx和STM32F73xxx微控制器具有以下功能:
- F  u7 \  o, F; N• 读保护(RDP):防止进行读取操作
; n& @1 m1 g6 M• 写保护:防止进行不需要的写入或擦除操作
" ~3 P! W$ v# L% Y* F' ]" {+ j• 专有代码读取保护:防止进行读写操作8 ~* ?5 t: I1 q) M: W
本应用笔记对这些闪存保护技术进行了说明,重点是STM32F72xxx和STM32F73xxx微控制器上的专有代码读取保护,并提供了PCROP保护的基本示例。
+ q- a& O  K" }6 x% j" R本文档随附的X-CUBE-PCROP嵌入式软件包包含了PCROP示例的源代码,以及运行示例所需的所有嵌入式软件模块。; h# u# k* v0 x4 a1 ^4 {
本应用笔记必须同STM32F72xxx和STM32F73xxx 基于ARM®的高级32位MCU的参考手册(RM0431)一起阅读,数据手册可以在www.st.com上获取。7 h* L, \9 ], w' W& x
1 _7 u% D% H' V& Q: r; V) w
4 u$ T3 }7 }! J0 `1 @' }" X
1 存储器保护说明
" P  d* x1 F; g$ m4 P/ A% R6 Q; L1.1 读保护(RDP)6 g' m8 e' F* w% |& b( l5 `
读取保护是全局闪存读保护,可保护嵌入式软件代码,避免复制、逆向工程、使用调试工具读出或其他方式的入侵攻击。该保护必须在二进制代码载入嵌入式闪存后,由用户进行设置。
1 T; f6 y, T! x/ y( f7 B7 D以下章节中对三个RDP级别(0,1和2)进行定义和描述。
  G: G1 h2 }! Q& P& _# b6 [/ P
1.1.1 读保护级别09 @3 x: x' |& l) I, j! o. @
级别0是默认级别,闪存完全打开,可在所有引导配置(调试功能,从RAM、从系统内存引导加载程序或从闪存启动)下进行全部内存操作。这种模式下,没有保护,该模式用于开发和调试。
- H6 W: n' c  j: C- N+ g* r
" \0 R1 C6 U7 `7 p
, r1 y; t+ V( \
1.1.2 读保护级别1$ S4 n  x2 m! `
激活读保护级别1时,即使是从SRAM或系统内存引导加载程序来启动,也不能使用调试功能(如串行线路或JTAG)访问(读取,擦除和编程)闪存或备用SRAM。4 ^: `$ R  q5 {1 e8 j
但是,当从闪存启动时,允许用户代码访问Flash存储器和备用SRAM。
1 ?+ H7 O( {3 C: N  T将RDP选项字节重新编程为级别0,可禁用RDP级别1保护,这会导致批量擦除。9 X8 A) u5 p" N

* p1 [# [4 o6 x  R% M: d
% m1 E, z6 K/ [4 _+ c- ^: e! T- L5 R  }
1.1.3 读保护级别2; g+ _- }8 r# P# I$ _( T8 G
激活RDP级别2时,级别1所支持的所有保护均有效,芯片受到全面保护。RDP选项字节和所有其他选项字节都会被冻结,不能再修改。JTAG、SWV(单线查看器)、ETM 和边界扫描被禁用。
6 }0 n2 V: u3 @6 t. |从闪存启动时,用户代码可以访问内存内容。但是,不再能从SRAM或从系统内存引导加载程序启动。
5 v5 t9 @, Y5 o1 b& O9 O" c3 I这种保护是不可逆的(JTAG熔断),所以不能回到保护级别1或0。
2 r' r0 H$ `% |& U0 [表 1描述了从内部闪存启动,或在调试,或从SRAM或系统内存引导加载程序启动时,对闪存、备用SRAM、选项字节和一次性可编程字节(OTP)的不同访问。
6 S4 X; j' x8 V6 w" y: ], \: D; h
, I+ e' i# ~2 Y* r7 \6 D  b' n; D

( L/ y4 }4 X3 i) `4 S 3AHBSF%Y176JIO(JIYYN5YE.png ' J4 x. t: E: i
4 ]8 F# @$ R: o5 y
1.1.4 STM32F72xxx和STM32F73xxx RDP保护下的内部闪存内容更新
6 v- o" }& }5 O9 e# h当RDP保护激活时(级别1或级别2),内部闪存内容不能通过调试进行更新,当从SRAM或系统内存引导加载程序启动时也不能更新。
! p" R+ v. Z0 W& P对最终产品的一个重要要求就是,能够将内部Flash存储器中的嵌入式软件升级为新的软件版本,添加新功能并修正潜在问题。# O+ U+ N8 j- }
可通过实施用户专用嵌入式软件执行内部闪存应用内编程(In-Application Programming,IAP)来解决此需求。IAP使用通信协议(如USART)来实现重编程过程。
( g4 s; D/ C" h0 Q有关IAP的更多详细信息,请参阅www.st.com上提供的STM32使用USART进行应用内编程应用笔记(AN3965)。$ E+ E1 ^  N2 T8 {

1 s& }2 b# d1 b! G# y
1.2 写保护
( I) q/ D( H" ~! L写保护用来保护指定扇区内容,避免代码更新或擦除。这种保护可应用于扇区。) ?% a2 X& E  H9 M" R
任何写请求都会产生一个写保护错误。如果要擦除/编程的地址属于闪存中处于写保护状态的区域,则通过硬件将WRPERR标志置位。$ v* j4 ]- e2 \/ B4 Y; o
例如,如果闪存中至少有一个扇区是写保护的,则不能对其进行批量擦除,并且WRPERR标志置位。
* E. V( @; Z- N7 E" U% e要激活每个闪存扇区 i 的写保护,可使用一个选项位nWRPi。当设置扇区 i(选项位nWRPi = 0)为写保护时,该扇区不能被擦除或编程。8 @. t4 X' ~" O1 h0 P; @" e- b
可通过嵌入式用户代码或使用STM32 ST-Link Utility软件和调试接口,进行使能或禁用写保护管理。; b) K4 P# h/ t4 h
8 A+ l/ O3 n+ c3 \
1.3 专有代码读保护(Proprietary Code Read Out Protection,PCROP)
1 m+ n- Y9 ^3 [1.3.1 PCROP保护概述! D3 q' Z& {3 M6 h
PCROP是闪存中IP-code的读写保护。PCROP应用于扇区(0至7),保护专利代码不被最终用户代码、调试器工具或RAM Trojan代码修改或读取。! ]# [( J5 P( R5 R# ^
通过ITCM或A**线对PCROP扇区的任何读访问(获取操作除外)都会触发:0 O8 f+ X# X# j
• 给定总线上出现总线错误
5 ^( r3 c; e$ B. H) t• FLASH_SR状态寄存器中RDERR标志置位。如果FLASH_CR寄存器中读错误中断使能位(Read Error Interrupt Enable,RDERRIE)置位,也会生成一个中断。. ~3 i0 H- l/ {0 [  A
任何对PCROP扇区的编程/擦除操作都会触发WRPERR标志错误。8 s5 F7 g( Y* s3 g) |: o2 y
受保护的IP-code可以很容易地被最终用户应用程序所调用,并且仍能受到保护,不可直接访问IP-code本身。PCROP不会阻止执行受保护的代码。
5 \. @5 @0 \+ L+ u* d3 m
8 B; j+ T' B  o7 U3 W2 L
注意: ; h- l* W# k* ]7 R+ @% x( Z$ L, _! \
虽然对PCROP扇区的读访问会产生总线错误,但读错误中断可被硬故障错误中断或总线故障错误中断所屏蔽。要使用读错误中断,必须将总线故障错误中断优先级使能为低于读错误中断优先级。8 P. z6 S3 S$ h# l2 b) i8 @
* G1 f- s- C% s

4 l) `# A! u; v4 h G}}XI4Q6BZJOMM%1_3{RSP1.png 7 t: y! ?/ M3 k; ~  P
% H4 \" \; ]5 y- K8 ^8 J1 [; d
1.3.2 如何使能PCROP保护2 b. _8 J6 c  i
PCROP保护是逐扇区激活的,因此每个扇区可以单独作为PCROP扇区,并可以对附加扇区进行保护(当RDP设置为级别0或级别1时)。# @5 `# M% L0 O4 Q) n: y# }
PCROP保护通过FLASH_OPTCR2寄存器中的选项位PCROP来激活:& j+ v3 `1 }, Y" p; W8 Z* e
• PCROP = 0:扇区i(i = 0,...,7)上的PCROP保护不被激活4 k- z$ R! z, s8 O/ E1 g& h
• PCROP = 1:扇区i(i = 0,...,7)上的PCROP保护被激活" ~2 U2 F  [8 |- W. \6 k; B
为了提高PCROP扇区的安全级别,在执行PCROP扇区中的代码时,所有调试事件都会被屏蔽。
7 a7 k; E" u1 P& c6 O) i/ S另有一个选项位(PCROP_RDP = PCROP1ER [15])可用来选择在RDP保护从级别1变为级别0时PCROP区域是否被擦除。
5 Z  f  n) Z7 a: t8 Y+ H- p用来激活PCROP保护(PCROPi)的位和用来激活写保护nWRPi的其他位是独立的,因此可以同时存在一个写保护扇区和一个PCROP扇区。表 2显示了根据WRPi和PCROPi位的值,扇区i上会设置何种保护。

4 i. ]7 h0 B) n8 D' r
, \) ?: ?+ U5 F
" z: _" t+ Y7 r* U9 c
KKISLII5$L]7VS9~R}7RY.png
9 f* b- e( {( i; n

9 {+ q: Y4 N  j! \0 {注: 关于实现PCROP使能的更多详细内容,用户必须参考所提供的FW包(STEP1-ST_Customer_level_n project main.c文件)中所述的PCROP_Enable()函数。
) {+ E: u1 E8 i6 p& P# H
7 T& `  o. r$ v* }$ a0 X( ]% l1 ]8 O
1.3.3 如何禁用PCROP保护. G, y5 Z2 w# ^" q, d
根据RDP级别,如果RDP级别为1或0,则PCROP保护可被禁用,但是如果RDP设置为级别2,PCROP不能被禁用。当RDP设为级别2,所有选项字节都会被冻结,不能修改。因此,PCROP保护的扇区不能再被擦除或修改,这样就成为永久性保护。禁用受保护扇区上PCROP的唯一方式是:
9 C- |# p/ d% `( f* x• 清除对应扇区的PCROPi位(多个扇区可同时可进行)8 [0 [) v1 [6 x. b* f, x
• 实现从级别1退回到级别0
4 }- k& `! R  |2 \' p• 将PCROP_RDP位置位3 g  G. _8 P) w
如果PCROP_RDP位被置位,则执行主闪存的批量擦除,并根据PCROPi值,对应扇区的PCROP保护保持使能或禁用。9 ?& H, c) U& H% z! k
如果PCROP_RDP位被清零,则完全批量擦除由部分批量擦除所代替,该部分页面擦除是对PCROP激活的存储区内进行连续页面擦除(PCROP保护的页面除外)。这样做是为了保持PCROP代码。
. V6 e9 p& A. ]3 G# `% z! ]' w  D

" U- p) B0 }2 k. c/ r2 P1 m# g注: 允许从级别1退回级别0与修改PCROP_RDP位同时进行由于完全或部分批量擦除在选项修改前启动,所以使用的是当前PCROP_RDP位,而不是被编程的新PCROP_RDP位。$ U' B8 t% V, Z. V9 R

; D9 G- s& j; D0 [7 i$ a% `使用STM32-Link Utility0 A1 h$ ?" B2 q. E, f$ o2 L
应用程序开发过程中,用户可能需要禁用PCROP或全局RDP保护,而不必花时间开发或禁用保护功能。STM32 ST-LINK Utility工具是一个非常简单的禁用或使能保护的方式,利用调试接口如JTAG或SWD即可实现,而无需开发专门的功能。图 2显示如何修改选项字节。

; q4 h" Q, O/ O; ~9 M: s9 t
/ w( n/ T' u. g/ [

2 [+ E6 j, J1 K1 ^; O W677STG__B{${T}9NP_MI3O.png
- ~3 e: d' K! k3 U+ d3 _9 ], b, v) @/ N
关于如何使用STM32 ST-LINK Utility软件的更多详细信息,用户须参考STM32 ST-LINK实用软件说明用户手册 (UM0892),可从www.st.com上获取。
8 z- e' v, Z1 @3 t9 P/ |

5 t5 C0 I, g" G2 q4 E
1.3.4 存放和执行PCROP的IP-code
6 _1 N. d3 ]' {! m如前所述,PCROP不会阻止执行受保护的IP-code,并且其函数可方便地被用户代码所调用。

7 v; ~: t0 t' V. GPCROP保护的扇区不被D-code总线读访问,这里重点指出,只允许进行代码执行(通过 Icode总线取指令),而禁止读取数据。因此,受保护的IP-code无法访问存储在同一区域的相关数据值(如文字池、分支表或常量,执行过程中它们通过D-code总线从闪存中取出)。# u) X, P. E& g6 w  p
PCROP的代码必须是只可执行的代码,不能包含任何数据。
% d  V; P: J3 K1 ~* C用户必须配置编译器来生成只可执行的IP-code,并且避免任何数据读取,所需编译器配置在第 2节中有详细说明。

+ g! T. w. J2 D/ N
& b* h* L4 H4 g
不可激活向量表扇区的PCROP保护
6 g$ v/ ^8 c; k* e/ c7 x4 k中断向量表包含了每个中断处理程序的进入点地址,它们可由CPU通过D-code总线进行读取。通常中断向量表位于首地址0x08000000的第一个扇区(例外是在某些情况下,它会被重新定位到其他区域,如SRAM)。& P% Y. L4 c5 w' o, W
将代码置于闪存中进行保护时,必须遵守以下规则:+ N6 t& Q8 o. O8 G1 k0 L
• 向量表所在的第一个闪存扇区不能是PCROP保护扇区& G( z+ Y2 M* `0 n# @0 z
• PCROP保护的代码不能位于第一个扇区中。

8 V$ J3 H' Z- T! D  T- M) M
- [- R* B/ G, R
PCROP的IP-code依赖关系6 L2 H3 _1 c# `: g. B
受保护的IP-code可以从位于用户代码区域中以及PCROP保护区之外的库中调用函数。这种情况下,IP-code中包含了相关函数地址,允许PC(程序计数器)在执行IP-code时跳转到这些函数。一旦IP-code被PCROP保护,则这些地址不能更改。因此,每个调用函数必须位于(PCROP保护区域之外)PCROP保护IP-code中写入的相应固定地址,否则PC跳转到无效地址,IP-code无法正常工作。; S* l" i. E# l
要完全独立,受保护IP-code必须与其所有关联函数放在一起。
% L( @- @- P" V% x% P* V, e图 3显示一个示例,其中PCROP保护的Function_A()调用位于PCROP保护区域之外的固定+ A/ |  H2 l) @. U6 n
地址的Function_B()。 1 j( u- V  P) U! x" ]

  x3 d: [- C, ~
4@OO][5M[B7384CI{ZVS1.png
. h5 b7 L8 U" F' \/ k% O3 N( Y/ ?) m, j' b$ s, t

( S- c" K: W. Y6 h+ Z2 M) J5 ?完整版请查看:附件
( m( m; v1 r) x+ w: h' V  C

DM00346619_ZHV1.pdf

下载

1.26 MB, 下载次数: 2

赞 收藏 评论0 发布时间:2022-7-12 23:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版