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

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

[复制链接]
STMCU小助手 发布时间:2022-7-12 23:02
前言
, i; U; `; i' _0 x软件提供商开发了复杂的中间件解决方案(知识产权代码,或IP-code), 保护它们对于微控制器而言至关重要。8 s' @7 }+ y1 U- T* B
为了应对这一重要需求,STM32F72xxx和STM32F73xxx微控制器具有以下功能:  |5 `: `- Z9 B7 s1 M6 [
• 读保护(RDP):防止进行读取操作
5 B8 X- `# x: n6 f• 写保护:防止进行不需要的写入或擦除操作, J/ A1 I  T9 B1 Z; s' P
• 专有代码读取保护:防止进行读写操作( @3 d$ y$ s5 Y2 B& X, _9 @
本应用笔记对这些闪存保护技术进行了说明,重点是STM32F72xxx和STM32F73xxx微控制器上的专有代码读取保护,并提供了PCROP保护的基本示例。
% c. c5 a* N3 ^# X$ X& P5 F本文档随附的X-CUBE-PCROP嵌入式软件包包含了PCROP示例的源代码,以及运行示例所需的所有嵌入式软件模块。4 o2 g- |. i* D( X$ C' ?
本应用笔记必须同STM32F72xxxSTM32F73xxx 基于ARM®的高级32MCU的参考手册(RM0431)一起阅读,数据手册可以在www.st.com上获取。
5 H8 g4 ]+ m6 W2 s5 ~& A3 d! R- M, j3 i2 b. U% h

9 L0 b8 A! ~1 q1 存储器保护说明0 R- K+ Y$ o3 e. i! K8 K7 N
1.1 读保护(RDP
  O* |( E2 w1 r" l  A6 M读取保护是全局闪存读保护,可保护嵌入式软件代码,避免复制、逆向工程、使用调试工具读出或其他方式的入侵攻击。该保护必须在二进制代码载入嵌入式闪存后,由用户进行设置。
9 i% Y( b! x1 C以下章节中对三个RDP级别(0,1和2)进行定义和描述。7 f. b- P, i8 E* J  k" _
1.1.1 读保护级别0
$ Y" i2 k5 ^  K1 C级别0是默认级别,闪存完全打开,可在所有引导配置(调试功能,从RAM、从系统内存引导加载程序或从闪存启动)下进行全部内存操作。这种模式下,没有保护,该模式用于开发和调试。' [6 b1 j3 J. m
2 J7 `( M8 P& L+ m# H: E- @+ E/ l
" _5 P  T' r2 L( w7 P7 }
1.1.2 读保护级别1* F; a- f7 X$ H
激活读保护级别1时,即使是从SRAM或系统内存引导加载程序来启动,也不能使用调试功能(如串行线路或JTAG)访问(读取,擦除和编程)闪存或备用SRAM。
2 X2 x- u4 B8 |  X! M+ t但是,当从闪存启动时,允许用户代码访问Flash存储器和备用SRAM。 2 T4 Q% P! P9 T! T* m- _
将RDP选项字节重新编程为级别0,可禁用RDP级别1保护,这会导致批量擦除。5 I$ g% E% ]8 Y$ r2 }7 m, U" p  z

5 l3 V9 o3 v8 s. b8 C; g/ ^6 Z
9 S9 g* f' m; w
1.1.3 读保护级别2
7 `0 W" D+ l* Q* Q3 o5 n激活RDP级别2时,级别1所支持的所有保护均有效,芯片受到全面保护。RDP选项字节和所有其他选项字节都会被冻结,不能再修改。JTAG、SWV(单线查看器)、ETM 和边界扫描被禁用。5 d- }8 N# o# b1 L1 O- f0 ]9 f4 m# v
从闪存启动时,用户代码可以访问内存内容。但是,不再能从SRAM或从系统内存引导加载程序启动。. y2 w1 O3 \& @( }
这种保护是不可逆的(JTAG熔断),所以不能回到保护级别1或0。 $ i2 k/ i+ P7 i" r6 _
1描述了从内部闪存启动,或在调试,或从SRAM或系统内存引导加载程序启动时,对闪存、备用SRAM、选项字节和一次性可编程字节(OTP)的不同访问。
2 }0 L: a0 f$ b2 _4 ?. B" _- c/ {0 L
2 Y8 D- U/ I5 \7 {9 C1 p9 D, y
2 ^4 w0 ?0 n' ]# C& {7 X* ^/ e
3AHBSF%Y176JIO(JIYYN5YE.png 2 ~5 R5 J6 a0 F: t% D

( L8 r$ A, x& D$ [1.1.4 STM32F72xxxSTM32F73xxx RDP保护下的内部闪存内容更新
4 L# j* Q. m+ {. Y3 [) T当RDP保护激活时(级别1或级别2),内部闪存内容不能通过调试进行更新,当从SRAM或系统内存引导加载程序启动时也不能更新。
  h! f+ S* v& y: M$ Q对最终产品的一个重要要求就是,能够将内部Flash存储器中的嵌入式软件升级为新的软件版本,添加新功能并修正潜在问题。
- e! ?9 W6 Q6 l可通过实施用户专用嵌入式软件执行内部闪存应用内编程(In-Application Programming,IAP)来解决此需求。IAP使用通信协议(如USART)来实现重编程过程。7 Q. Q( {- z: p& R& l
有关IAP的更多详细信息,请参阅www.st.com上提供的STM32使用USART进行应用内编程应用笔记(AN3965)。* e6 i1 u( K+ G" O% A  t
# L. J. _1 h- `5 I6 G3 c) _) ]1 s
1.2 写保护& D7 d& t1 }& i! \
写保护用来保护指定扇区内容,避免代码更新或擦除。这种保护可应用于扇区。
4 T5 n& _* x8 J1 T任何写请求都会产生一个写保护错误。如果要擦除/编程的地址属于闪存中处于写保护状态的区域,则通过硬件将WRPERR标志置位。; g- F4 F8 U$ t2 ?/ i- L9 e  R! {2 l* F
例如,如果闪存中至少有一个扇区是写保护的,则不能对其进行批量擦除,并且WRPERR标志置位。
/ P1 @$ @( ?* o3 q' P8 |$ y要激活每个闪存扇区 i 的写保护,可使用一个选项位nWRPi。当设置扇区 i(选项位nWRPi = 0)为写保护时,该扇区不能被擦除或编程。& G6 L& d& F. Y& Q$ ?6 c2 Q* T
可通过嵌入式用户代码或使用STM32 ST-Link Utility软件和调试接口,进行使能或禁用写保护管理。
: b" }& W: ?* o* s) R/ o: U% @$ O3 j: O! [9 X+ d) d, ?: a
1.3 专有代码读保护(Proprietary Code Read Out ProtectionPCROP4 C) D* m) a. X* T2 c# d+ `' p
1.3.1 PCROP保护概述
, L2 z) y# o4 v8 SPCROP是闪存中IP-code的读写保护。PCROP应用于扇区(0至7),保护专利代码不被最终用户代码、调试器工具或RAM Trojan代码修改或读取。  o# ?8 M6 J1 z1 e; G3 s
通过ITCM或A**线对PCROP扇区的任何读访问(获取操作除外)都会触发:
; x/ p, M$ m1 U0 A3 o/ I' S给定总线上出现总线错误! v1 _4 c& ^7 ]. V2 X3 R: ~- K
FLASH_SR状态寄存器中RDERR标志置位。如果FLASH_CR寄存器中读错误中断使能位(Read Error Interrupt Enable,RDERRIE)置位,也会生成一个中断。( L2 R5 _" l$ K; T; J1 k- t
任何对PCROP扇区的编程/擦除操作都会触发WRPERR标志错误。9 s5 K. _8 @2 h' y' `
受保护的IP-code可以很容易地被最终用户应用程序所调用,并且仍能受到保护,不可直接访问IP-code本身。PCROP不会阻止执行受保护的代码。$ d4 {6 Z) X  M$ S0 Y! d

) n* c. F- U6 K6 f- `; s* O
注意:
; g6 H& n+ ?9 z& q+ X+ t9 r虽然对PCROP扇区的读访问会产生总线错误,但读错误中断可被硬故障错误中断或总线故障错误中断所屏蔽。要使用读错误中断,必须将总线故障错误中断优先级使能为低于读错误中断优先级。7 k( V4 S* A5 P# N! @9 P3 t

8 W  |7 G" Q  f) b: {' u

* k. v- G8 M2 Q" @- I$ o, D G}}XI4Q6BZJOMM%1_3{RSP1.png
' Z6 p! V, y2 X" E' k+ G
  i7 t" i( f! z! u/ L1.3.2 如何使能PCROP保护7 {! P" j5 h7 a- a0 G
PCROP保护是逐扇区激活的,因此每个扇区可以单独作为PCROP扇区,并可以对附加扇区进行保护(当RDP设置为级别0或级别1时)。
: h% B0 t& t; M3 e& NPCROP保护通过FLASH_OPTCR2寄存器中的选项位PCROP来激活:4 [& Y  I! T  U. f6 n4 g
PCROP = 0:扇区i(i = 0,...,7)上的PCROP保护不被激活
1 }; F* j4 O0 W7 r" Y; \* cPCROP = 1:扇区i(i = 0,...,7)上的PCROP保护被激活2 t6 }( @$ k& \# |. s: u6 O
为了提高PCROP扇区的安全级别,在执行PCROP扇区中的代码时,所有调试事件都会被屏蔽。. v, [; R4 E+ v- Q4 B- b
另有一个选项位(PCROP_RDP = PCROP1ER [15])可用来选择在RDP保护从级别1变为级别0时PCROP区域是否被擦除。4 \8 k9 Y" g: q2 x8 a2 y4 |
用来激活PCROP保护(PCROPi)的位和用来激活写保护nWRPi的其他位是独立的,因此可以同时存在一个写保护扇区和一个PCROP扇区。表 2显示了根据WRPi和PCROPi位的值,扇区i上会设置何种保护。

% Q9 t+ P* G! i
! r& ]; D0 a( @- b# X8 z( Q5 c, y
7 y5 O. h2 Q, A6 u
KKISLII5$L]7VS9~R}7RY.png
; ^/ b: b) B5 U# {( R

* w& Z& N# q% R# B3 D注: 关于实现PCROP使能的更多详细内容,用户必须参考所提供的FW包(STEP1-ST_Customer_level_n project main.c文件)中所述的PCROP_Enable()函数。
5 R+ g4 \$ n7 J: Q1 x' D, ~0 c

; b1 G/ X0 }0 S! e* G
1.3.3 如何禁用PCROP保护
' t  l# a5 D; E, X; Z6 `9 v" j- x根据RDP级别,如果RDP级别为1或0,则PCROP保护可被禁用,但是如果RDP设置为级别2,PCROP不能被禁用。当RDP设为级别2,所有选项字节都会被冻结,不能修改。因此,PCROP保护的扇区不能再被擦除或修改,这样就成为永久性保护。禁用受保护扇区上PCROP的唯一方式是:4 L3 p0 F7 N: J
清除对应扇区的PCROPi位(多个扇区可同时可进行)
! C2 g8 e8 S; B实现从级别1退回到级别0 + w$ L" P0 B4 r0 a6 u& ]
将PCROP_RDP位置位3 Y$ G1 [8 R3 R* g
如果PCROP_RDP位被置位,则执行主闪存的批量擦除,并根据PCROPi值,对应扇区的PCROP保护保持使能或禁用。" _! B1 o9 Z% w2 N2 ^
如果PCROP_RDP位被清零,则完全批量擦除由部分批量擦除所代替,该部分页面擦除是对PCROP激活的存储区内进行连续页面擦除(PCROP保护的页面除外)。这样做是为了保持PCROP代码。

1 A# T( t; Z& ?; m/ }7 [4 d' ~4 G+ [% k2 w; Z
注: 允许从级别1退回级别0与修改PCROP_RDP位同时进行由于完全或部分批量擦除在选项修改前启动,所以使用的是当前PCROP_RDP位,而不是被编程的新PCROP_RDP位。
1 L0 ^7 d; X/ {4 t& I  J
: u( q! R* O6 r2 c$ ~
使用STM32-Link Utility1 Y) x: c5 A; [  @% m
应用程序开发过程中,用户可能需要禁用PCROP或全局RDP保护,而不必花时间开发或禁用保护功能。STM32 ST-LINK Utility工具是一个非常简单的禁用或使能保护的方式,利用调试接口如JTAG或SWD即可实现,而无需开发专门的功能。图 2显示如何修改选项字节。

. y* k2 L8 S% F- J# T7 j/ l2 b  L3 `5 T( R" H$ d
# o2 Z$ s; a8 {2 i( G& H0 C8 E
W677STG__B{${T}9NP_MI3O.png
) o; R% ]% ^0 c0 t+ \" r6 o  I
, y# x3 Q2 v$ _8 I5 L3 d0 B( e关于如何使用STM32 ST-LINK Utility软件的更多详细信息,用户须参考STM32 ST-LINK实用软件说明用户手册 (UM0892),可从www.st.com上获取。

8 H& ?0 R/ O* ~7 W- t  \5 O6 ]
, |/ x$ h' k0 k& u
1.3.4 存放和执行PCROPIP-code
! d9 c( m% D( P9 f如前所述,PCROP不会阻止执行受保护的IP-code,并且其函数可方便地被用户代码所调用。

) J, i2 T+ @1 H3 E* ?- s, e. MPCROP保护的扇区不被D-code总线读访问,这里重点指出,只允许进行代码执行(通过 Icode总线取指令),而禁止读取数据。因此,受保护的IP-code无法访问存储在同一区域的相关数据值(如文字池、分支表或常量,执行过程中它们通过D-code总线从闪存中取出)。- P/ o( ]' ~& t" [4 ]. x6 w
PCROP的代码必须是只可执行的代码,不能包含任何数据。
9 e  t2 ?, W5 u4 B  F用户必须配置编译器来生成只可执行的IP-code,并且避免任何数据读取,所需编译器配置在第 2节中有详细说明。
# P' i) s( K+ e; M
: i2 \% ?' V: g+ ~% C5 g
不可激活向量表扇区的PCROP保护/ Z, ]8 B  r6 q8 v. N6 g
中断向量表包含了每个中断处理程序的进入点地址,它们可由CPU通过D-code总线进行读取。通常中断向量表位于首地址0x08000000的第一个扇区(例外是在某些情况下,它会被重新定位到其他区域,如SRAM)。
2 S7 x/ X$ }8 J0 t7 D将代码置于闪存中进行保护时,必须遵守以下规则:) b" b; o9 U* u% C/ m& ^" S/ ^
向量表所在的第一个闪存扇区不能是PCROP保护扇区
) ]0 o3 }$ s4 H+ E/ X  IPCROP保护的代码不能位于第一个扇区中。

' K" b- [4 W- H1 d$ E* X" D. [8 m5 G3 Z  z) p7 I" W+ P
PCROPIP-code依赖关系
& V8 Y* ~/ p) h4 s受保护的IP-code可以从位于用户代码区域中以及PCROP保护区之外的库中调用函数。这种情况下,IP-code中包含了相关函数地址,允许PC(程序计数器)在执行IP-code时跳转到这些函数。一旦IP-code被PCROP保护,则这些地址不能更改。因此,每个调用函数必须位于(PCROP保护区域之外)PCROP保护IP-code中写入的相应固定地址,否则PC跳转到无效地址,IP-code无法正常工作。
, O- g$ l) U3 Q5 B要完全独立,受保护IP-code必须与其所有关联函数放在一起. n6 i+ E/ d, b) n; [! N
图 3显示一个示例,其中PCROP保护的Function_A()调用位于PCROP保护区域之外的固定
& z9 d8 ?( H, ^/ l9 r地址的Function_B()。
5 [: ~0 u) p  Z' d
5 r- a$ E" K* `
4@OO][5M[B7384CI{ZVS1.png
9 W9 ]0 G8 T0 V& V: n" V) ]9 i+ @( B9 T* N; K+ m! y+ s. x

6 g9 q  c4 q8 n$ V8 F# I# X( G完整版请查看:附件
  @& \, Y# u2 G# z$ ~6 Z

DM00346619_ZHV1.pdf

下载

1.26 MB, 下载次数: 2

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

举报

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