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

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

[复制链接]
STMCU小助手 发布时间:2022-7-12 23:02
前言
- x. ?9 n9 v/ v  p软件提供商开发了复杂的中间件解决方案(知识产权代码,或IP-code), 保护它们对于微控制器而言至关重要。. ]1 X; u* F0 L, W7 B" i4 _' u
为了应对这一重要需求,STM32F72xxx和STM32F73xxx微控制器具有以下功能:
( D! m0 ~  h6 v4 R+ Y• 读保护(RDP):防止进行读取操作
) D; m! b) h0 T+ D• 写保护:防止进行不需要的写入或擦除操作
. m& Z& o; D0 e" k• 专有代码读取保护:防止进行读写操作
& o# l* h! E, E7 U7 S& N本应用笔记对这些闪存保护技术进行了说明,重点是STM32F72xxx和STM32F73xxx微控制器上的专有代码读取保护,并提供了PCROP保护的基本示例。7 E- |8 `& }1 M4 ^. D
本文档随附的X-CUBE-PCROP嵌入式软件包包含了PCROP示例的源代码,以及运行示例所需的所有嵌入式软件模块。* E. |5 i* B. g5 R% [/ A
本应用笔记必须同STM32F72xxxSTM32F73xxx 基于ARM®的高级32MCU的参考手册(RM0431)一起阅读,数据手册可以在www.st.com上获取。
0 [  W/ Q8 B7 Y. C3 _
( u5 ]% G8 [4 |. @" y  e
( i8 p6 u; S& X9 E. O8 B3 v) g8 ^2 A1 T
1 存储器保护说明* g7 Q  T$ l5 G; J' Z4 J$ ~  V
1.1 读保护(RDP
  @. n6 C. _' z5 n; x, k读取保护是全局闪存读保护,可保护嵌入式软件代码,避免复制、逆向工程、使用调试工具读出或其他方式的入侵攻击。该保护必须在二进制代码载入嵌入式闪存后,由用户进行设置。
$ y# f; b& Y# D6 d! ?* d( z& v以下章节中对三个RDP级别(0,1和2)进行定义和描述。+ C  @1 n! Q$ S; I4 U8 z7 z0 p
1.1.1 读保护级别0" A8 W  D  e: Q5 z
级别0是默认级别,闪存完全打开,可在所有引导配置(调试功能,从RAM、从系统内存引导加载程序或从闪存启动)下进行全部内存操作。这种模式下,没有保护,该模式用于开发和调试。
# L# I/ F$ T' V* q
3 q% G  i1 ^- S, Z6 d0 }# I

; R0 y8 Q. O/ h$ w( e/ @1.1.2 读保护级别1' P0 W! A; s1 P2 E9 s+ ]* P  Z
激活读保护级别1时,即使是从SRAM或系统内存引导加载程序来启动,也不能使用调试功能(如串行线路或JTAG)访问(读取,擦除和编程)闪存或备用SRAM。
& m$ U  D+ D% e但是,当从闪存启动时,允许用户代码访问Flash存储器和备用SRAM。
4 }3 C1 `6 Q+ \; g& t将RDP选项字节重新编程为级别0,可禁用RDP级别1保护,这会导致批量擦除。2 c! |1 v0 X! ~+ Y0 P% G8 B
" x+ {. R/ h7 z; K2 t) |1 W, w3 q1 v

) m6 B8 N- o+ a2 N& N8 T! W1.1.3 读保护级别2
; P8 w  H" _! Z- q  N激活RDP级别2时,级别1所支持的所有保护均有效,芯片受到全面保护。RDP选项字节和所有其他选项字节都会被冻结,不能再修改。JTAG、SWV(单线查看器)、ETM 和边界扫描被禁用。
; T" ^/ Q% i1 y4 `0 z. h( A5 A从闪存启动时,用户代码可以访问内存内容。但是,不再能从SRAM或从系统内存引导加载程序启动。+ p3 q& V: R1 u/ H8 h( S. H  h1 B
这种保护是不可逆的(JTAG熔断),所以不能回到保护级别1或0。
- q! x0 V, [% }+ s( p1描述了从内部闪存启动,或在调试,或从SRAM或系统内存引导加载程序启动时,对闪存、备用SRAM、选项字节和一次性可编程字节(OTP)的不同访问。& D- M% r% a  ?2 d8 c9 `9 O, X

" [# r# X3 x" E  X9 f6 u

9 P. U; ~/ P% N5 ~ 3AHBSF%Y176JIO(JIYYN5YE.png 2 G" N& G0 w+ i7 ]
  w4 }$ h8 ]* L  R% S' E
1.1.4 STM32F72xxxSTM32F73xxx RDP保护下的内部闪存内容更新 " }" Y  V6 X7 _$ I3 C8 |( L
当RDP保护激活时(级别1或级别2),内部闪存内容不能通过调试进行更新,当从SRAM或系统内存引导加载程序启动时也不能更新。3 S& V- w' U* m- F+ k0 p  n: T0 {" {
对最终产品的一个重要要求就是,能够将内部Flash存储器中的嵌入式软件升级为新的软件版本,添加新功能并修正潜在问题。- N" X; i: R) w) J8 S0 e) P$ F
可通过实施用户专用嵌入式软件执行内部闪存应用内编程(In-Application Programming,IAP)来解决此需求。IAP使用通信协议(如USART)来实现重编程过程。
0 |( M, E% J$ T! s' D9 W有关IAP的更多详细信息,请参阅www.st.com上提供的STM32使用USART进行应用内编程应用笔记(AN3965)。
6 \/ n* f% v7 `+ c" E7 j$ I4 @
9 P5 k* O( f- }, c+ r
1.2 写保护
$ Q: ^/ }( L+ {' T: g: n$ Q+ k写保护用来保护指定扇区内容,避免代码更新或擦除。这种保护可应用于扇区。
% K4 s. M. i3 L! D1 W7 w任何写请求都会产生一个写保护错误。如果要擦除/编程的地址属于闪存中处于写保护状态的区域,则通过硬件将WRPERR标志置位。# ]! F9 X; m1 K6 r- m# Y" z
例如,如果闪存中至少有一个扇区是写保护的,则不能对其进行批量擦除,并且WRPERR标志置位。& A% a3 {% m, I# }" e4 U# u
要激活每个闪存扇区 i 的写保护,可使用一个选项位nWRPi。当设置扇区 i(选项位nWRPi = 0)为写保护时,该扇区不能被擦除或编程。6 E" ]: Y2 ^5 u1 [
可通过嵌入式用户代码或使用STM32 ST-Link Utility软件和调试接口,进行使能或禁用写保护管理。
2 c: W. h% [9 W+ K) [6 S, x4 t& S$ L
1.3 专有代码读保护(Proprietary Code Read Out ProtectionPCROP
0 H' t, Z9 r; p3 ?% g1.3.1 PCROP保护概述# n9 {; W4 h% P2 n9 i& X
PCROP是闪存中IP-code的读写保护。PCROP应用于扇区(0至7),保护专利代码不被最终用户代码、调试器工具或RAM Trojan代码修改或读取。
8 |2 Z% g+ O7 P* N通过ITCM或A**线对PCROP扇区的任何读访问(获取操作除外)都会触发:
# i/ m: R2 b1 l2 m! v2 q给定总线上出现总线错误
1 D* ^/ U  m7 }2 n; s- D* I" yFLASH_SR状态寄存器中RDERR标志置位。如果FLASH_CR寄存器中读错误中断使能位(Read Error Interrupt Enable,RDERRIE)置位,也会生成一个中断。4 H, s) F5 }0 [% w. r, B, T$ M8 K
任何对PCROP扇区的编程/擦除操作都会触发WRPERR标志错误。
" L2 K/ `% k; F9 _6 G, W5 \受保护的IP-code可以很容易地被最终用户应用程序所调用,并且仍能受到保护,不可直接访问IP-code本身。PCROP不会阻止执行受保护的代码。
) t/ w5 e. e0 c! u5 O% T1 S+ G7 S; A/ C4 X3 I( P
注意:
1 `* S, M- L- ~- F" b虽然对PCROP扇区的读访问会产生总线错误,但读错误中断可被硬故障错误中断或总线故障错误中断所屏蔽。要使用读错误中断,必须将总线故障错误中断优先级使能为低于读错误中断优先级。
4 D) t0 T! T+ a$ l' v8 ?5 F; K0 G+ j$ \2 _  F. e
& }8 C7 J4 F/ T0 _8 O
G}}XI4Q6BZJOMM%1_3{RSP1.png * |; r& ~0 t0 N; Y- w

' {, G* m" [2 F! y, E' l5 `3 }1.3.2 如何使能PCROP保护$ N+ G# k% [, C+ E' u, \2 b5 h
PCROP保护是逐扇区激活的,因此每个扇区可以单独作为PCROP扇区,并可以对附加扇区进行保护(当RDP设置为级别0或级别1时)。
9 x* }$ _9 _' H& _+ Z! [* X4 pPCROP保护通过FLASH_OPTCR2寄存器中的选项位PCROP来激活:
- P) b* n8 W' O& vPCROP = 0:扇区i(i = 0,...,7)上的PCROP保护不被激活
/ v  H$ T. |& `3 L7 j2 MPCROP = 1:扇区i(i = 0,...,7)上的PCROP保护被激活
# M, @1 O: g1 z3 l3 J/ L为了提高PCROP扇区的安全级别,在执行PCROP扇区中的代码时,所有调试事件都会被屏蔽。" B' r. z4 ]- ?0 e$ ^
另有一个选项位(PCROP_RDP = PCROP1ER [15])可用来选择在RDP保护从级别1变为级别0时PCROP区域是否被擦除。, n0 d! L: L5 b2 q8 t" i& W
用来激活PCROP保护(PCROPi)的位和用来激活写保护nWRPi的其他位是独立的,因此可以同时存在一个写保护扇区和一个PCROP扇区。表 2显示了根据WRPi和PCROPi位的值,扇区i上会设置何种保护。
% k! x# O" W% z: O" o

5 q2 C9 e0 h! y# A) w; G7 Q

4 B* g2 m* P, }1 G) A9 E0 v8 q KKISLII5$L]7VS9~R}7RY.png 2 W$ I* c$ Y+ F2 m2 s% [8 Q- @

6 v  X: \; R3 p7 q7 g3 O; t$ G注: 关于实现PCROP使能的更多详细内容,用户必须参考所提供的FW包(STEP1-ST_Customer_level_n project main.c文件)中所述的PCROP_Enable()函数。
' Y. v' s7 a& f+ s7 h- u: v

1 v# k3 z$ S/ l2 ^
1.3.3 如何禁用PCROP保护
/ L+ N) S- c# V. v根据RDP级别,如果RDP级别为1或0,则PCROP保护可被禁用,但是如果RDP设置为级别2,PCROP不能被禁用。当RDP设为级别2,所有选项字节都会被冻结,不能修改。因此,PCROP保护的扇区不能再被擦除或修改,这样就成为永久性保护。禁用受保护扇区上PCROP的唯一方式是:/ Q9 {7 \3 i0 N9 W: k
清除对应扇区的PCROPi位(多个扇区可同时可进行)- [8 }! U9 S+ V; |: t' C1 x
实现从级别1退回到级别0 / T' o; c) {6 G5 A
将PCROP_RDP位置位
9 b5 p: }% |9 y& ?2 j如果PCROP_RDP位被置位,则执行主闪存的批量擦除,并根据PCROPi值,对应扇区的PCROP保护保持使能或禁用。
7 z) I9 K: X8 p) z如果PCROP_RDP位被清零,则完全批量擦除由部分批量擦除所代替,该部分页面擦除是对PCROP激活的存储区内进行连续页面擦除(PCROP保护的页面除外)。这样做是为了保持PCROP代码。

8 t$ r6 E3 l2 ?/ p
# p9 g* j& ]8 P( u注: 允许从级别1退回级别0与修改PCROP_RDP位同时进行由于完全或部分批量擦除在选项修改前启动,所以使用的是当前PCROP_RDP位,而不是被编程的新PCROP_RDP位。# ]6 Q' P& [  u0 g

4 x; N+ p, ^1 X- f% U使用STM32-Link Utility- U. [* ~6 G- e( ^* s$ b. P7 b
应用程序开发过程中,用户可能需要禁用PCROP或全局RDP保护,而不必花时间开发或禁用保护功能。STM32 ST-LINK Utility工具是一个非常简单的禁用或使能保护的方式,利用调试接口如JTAG或SWD即可实现,而无需开发专门的功能。图 2显示如何修改选项字节。
: l9 h" [8 _% w! D& H

- G: F% p/ t* x3 R

# s1 w2 U" q5 |' E2 f W677STG__B{${T}9NP_MI3O.png / `7 q8 u9 `! r( R& E6 N
7 H: X' b  L( y* N$ N  D/ d
关于如何使用STM32 ST-LINK Utility软件的更多详细信息,用户须参考STM32 ST-LINK实用软件说明用户手册 (UM0892),可从www.st.com上获取。
& Z# B4 E: q  V4 N

4 ?1 E. o3 h9 _7 Q  |
1.3.4 存放和执行PCROPIP-code0 W- D& k" g3 X- P7 @7 }
如前所述,PCROP不会阻止执行受保护的IP-code,并且其函数可方便地被用户代码所调用。

% s5 x9 w- r& u7 UPCROP保护的扇区不被D-code总线读访问,这里重点指出,只允许进行代码执行(通过 Icode总线取指令),而禁止读取数据。因此,受保护的IP-code无法访问存储在同一区域的相关数据值(如文字池、分支表或常量,执行过程中它们通过D-code总线从闪存中取出)。# K# I) d2 @& Q" S
PCROP的代码必须是只可执行的代码,不能包含任何数据。8 Q$ ]9 \& I+ t2 A  l
用户必须配置编译器来生成只可执行的IP-code,并且避免任何数据读取,所需编译器配置在第 2节中有详细说明。

: J# v" C  \4 U  N. a& n; N) I6 ?: t$ x+ r# O
不可激活向量表扇区的PCROP保护
8 X  ?5 V# L3 s0 T0 `中断向量表包含了每个中断处理程序的进入点地址,它们可由CPU通过D-code总线进行读取。通常中断向量表位于首地址0x08000000的第一个扇区(例外是在某些情况下,它会被重新定位到其他区域,如SRAM)。  E4 z) i6 Z# d1 V7 ~
将代码置于闪存中进行保护时,必须遵守以下规则:9 ]8 T% D+ V6 K% V. ~
向量表所在的第一个闪存扇区不能是PCROP保护扇区
  Y. [2 |# ?7 \. T0 g% oPCROP保护的代码不能位于第一个扇区中。
6 O+ d+ [$ a6 B. @
. `! Q& x' D' |
PCROPIP-code依赖关系0 C% X* S) ], `; c7 M
受保护的IP-code可以从位于用户代码区域中以及PCROP保护区之外的库中调用函数。这种情况下,IP-code中包含了相关函数地址,允许PC(程序计数器)在执行IP-code时跳转到这些函数。一旦IP-code被PCROP保护,则这些地址不能更改。因此,每个调用函数必须位于(PCROP保护区域之外)PCROP保护IP-code中写入的相应固定地址,否则PC跳转到无效地址,IP-code无法正常工作。
3 p; `$ K8 d# u要完全独立,受保护IP-code必须与其所有关联函数放在一起7 t7 y& o* k$ K& I" D5 w4 }4 W
图 3显示一个示例,其中PCROP保护的Function_A()调用位于PCROP保护区域之外的固定+ h: H: a7 i# |4 F" @6 |' Z& h& R
地址的Function_B()。 ; ?7 r; b9 l8 C7 M3 e$ B) ~. p
4 g2 g5 v7 L- t6 N3 v
4@OO][5M[B7384CI{ZVS1.png 2 u* @3 ?  P  C$ i0 ]# {7 ~

# g, R0 b4 K4 M, ?

2 W6 t: U! h  n" l0 R9 P5 S完整版请查看:附件! Z1 O4 v8 z" u) u3 h3 X, \

DM00346619_ZHV1.pdf

下载

1.26 MB, 下载次数: 2

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

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版