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

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

[复制链接]
STMCU小助手 发布时间:2022-7-12 23:02
前言
  v' Y5 E! B6 ]8 j' N软件提供商开发了复杂的中间件解决方案(知识产权代码,或IP-code), 保护它们对于微控制器而言至关重要。6 t. b4 R$ k# _; v( E
为了应对这一重要需求,STM32F72xxx和STM32F73xxx微控制器具有以下功能:
2 f, {. R% h. E9 Z# N0 G• 读保护(RDP):防止进行读取操作' q9 f% n  j" i* C7 Q
• 写保护:防止进行不需要的写入或擦除操作( G( S) m* r* @. i! C) P) P
• 专有代码读取保护:防止进行读写操作
: u3 p  S6 y/ T' U- J本应用笔记对这些闪存保护技术进行了说明,重点是STM32F72xxx和STM32F73xxx微控制器上的专有代码读取保护,并提供了PCROP保护的基本示例。
4 f3 ~. Z1 Y) m, s8 d本文档随附的X-CUBE-PCROP嵌入式软件包包含了PCROP示例的源代码,以及运行示例所需的所有嵌入式软件模块。" H- \' N% [& G; f" F
本应用笔记必须同STM32F72xxxSTM32F73xxx 基于ARM®的高级32MCU的参考手册(RM0431)一起阅读,数据手册可以在www.st.com上获取。, F" [/ w, E! I6 \' i5 ]& E: {

# F  X& L1 ]0 F, B
: C7 c( ~  T/ _; Z
1 存储器保护说明( r" s% @' B) u5 Z' E
1.1 读保护(RDP
* V4 q1 i  H/ `! q/ R读取保护是全局闪存读保护,可保护嵌入式软件代码,避免复制、逆向工程、使用调试工具读出或其他方式的入侵攻击。该保护必须在二进制代码载入嵌入式闪存后,由用户进行设置。2 O( |+ u8 |# B% ^& P& c4 @/ P, v
以下章节中对三个RDP级别(0,1和2)进行定义和描述。
  ~' v9 c+ ~$ h* V, y+ g
1.1.1 读保护级别0
- C" R6 A% J& ^$ N6 K级别0是默认级别,闪存完全打开,可在所有引导配置(调试功能,从RAM、从系统内存引导加载程序或从闪存启动)下进行全部内存操作。这种模式下,没有保护,该模式用于开发和调试。
% }, [) b8 K, M" k
, d; I+ M2 k/ n9 F
% x6 A7 [6 Q3 ~: P2 D% e
1.1.2 读保护级别1) \, W; B7 t# H  U% O
激活读保护级别1时,即使是从SRAM或系统内存引导加载程序来启动,也不能使用调试功能(如串行线路或JTAG)访问(读取,擦除和编程)闪存或备用SRAM。! e! I+ ~: c3 ^: _+ d
但是,当从闪存启动时,允许用户代码访问Flash存储器和备用SRAM。
) N+ z/ v% n5 U8 V将RDP选项字节重新编程为级别0,可禁用RDP级别1保护,这会导致批量擦除。4 q  x8 [. i7 g+ s* r6 l

/ V. w/ A" a; x+ Z2 F1 W- l& W
, L- R, v: o0 c
1.1.3 读保护级别2
+ ^/ _' p! s0 @; J9 J- g激活RDP级别2时,级别1所支持的所有保护均有效,芯片受到全面保护。RDP选项字节和所有其他选项字节都会被冻结,不能再修改。JTAG、SWV(单线查看器)、ETM 和边界扫描被禁用。
8 r' O/ |$ Q! K  |) H从闪存启动时,用户代码可以访问内存内容。但是,不再能从SRAM或从系统内存引导加载程序启动。$ R) |2 B4 J, Z( s! H- d( ^
这种保护是不可逆的(JTAG熔断),所以不能回到保护级别1或0。
" K$ e3 L4 a5 X- O4 |6 a4 @- i1描述了从内部闪存启动,或在调试,或从SRAM或系统内存引导加载程序启动时,对闪存、备用SRAM、选项字节和一次性可编程字节(OTP)的不同访问。
# }: R- I# ^  a) ?7 j& E/ T
# p% ~2 `- V; [9 ]
9 J$ i, N" |5 J% G
3AHBSF%Y176JIO(JIYYN5YE.png
, P5 F1 q: K$ J: i$ d
/ y& A! S" [! |: V
1.1.4 STM32F72xxxSTM32F73xxx RDP保护下的内部闪存内容更新
& g3 H! K- D% U) F当RDP保护激活时(级别1或级别2),内部闪存内容不能通过调试进行更新,当从SRAM或系统内存引导加载程序启动时也不能更新。
! B& A) l  L2 @对最终产品的一个重要要求就是,能够将内部Flash存储器中的嵌入式软件升级为新的软件版本,添加新功能并修正潜在问题。
5 E$ w, Y4 R: S, f2 J可通过实施用户专用嵌入式软件执行内部闪存应用内编程(In-Application Programming,IAP)来解决此需求。IAP使用通信协议(如USART)来实现重编程过程。
) D8 y/ g) I7 W有关IAP的更多详细信息,请参阅www.st.com上提供的STM32使用USART进行应用内编程应用笔记(AN3965)。1 C- ?8 N$ D! z

" A* r0 a5 U4 P3 n7 v4 a
1.2 写保护& t% t0 ?: x2 w7 u
写保护用来保护指定扇区内容,避免代码更新或擦除。这种保护可应用于扇区。
+ f4 o7 x+ O; K* V2 n任何写请求都会产生一个写保护错误。如果要擦除/编程的地址属于闪存中处于写保护状态的区域,则通过硬件将WRPERR标志置位。
4 `6 @0 J. q; H$ g3 P" D例如,如果闪存中至少有一个扇区是写保护的,则不能对其进行批量擦除,并且WRPERR标志置位。  Y! U1 `( d8 z. ?
要激活每个闪存扇区 i 的写保护,可使用一个选项位nWRPi。当设置扇区 i(选项位nWRPi = 0)为写保护时,该扇区不能被擦除或编程。% ?% ^0 e# o7 W
可通过嵌入式用户代码或使用STM32 ST-Link Utility软件和调试接口,进行使能或禁用写保护管理。
6 f" ?: Q# b1 S4 q3 h( u# ~# U/ U
1.3 专有代码读保护(Proprietary Code Read Out ProtectionPCROP$ m5 i# b2 M, w: k- _
1.3.1 PCROP保护概述
8 U2 g6 |# D+ v( f9 lPCROP是闪存中IP-code的读写保护。PCROP应用于扇区(0至7),保护专利代码不被最终用户代码、调试器工具或RAM Trojan代码修改或读取。6 y" u! H6 D  b' K; y) b+ F  \3 n
通过ITCM或A**线对PCROP扇区的任何读访问(获取操作除外)都会触发:
3 C/ j' }* c! Y; A: @; r9 Z. ?给定总线上出现总线错误! X4 V! T9 S7 R. U2 m& H: h
FLASH_SR状态寄存器中RDERR标志置位。如果FLASH_CR寄存器中读错误中断使能位(Read Error Interrupt Enable,RDERRIE)置位,也会生成一个中断。
3 ]) v! m, q# u4 a- n3 @' b( U任何对PCROP扇区的编程/擦除操作都会触发WRPERR标志错误。: m' r* M" ]  W* e% T
受保护的IP-code可以很容易地被最终用户应用程序所调用,并且仍能受到保护,不可直接访问IP-code本身。PCROP不会阻止执行受保护的代码。
, C3 U' I- N& b
3 d1 P' j& c# {, x# T0 e
注意:
- B7 G9 ?) F4 a5 w! X  F: V! b虽然对PCROP扇区的读访问会产生总线错误,但读错误中断可被硬故障错误中断或总线故障错误中断所屏蔽。要使用读错误中断,必须将总线故障错误中断优先级使能为低于读错误中断优先级。
  _* z. ~5 `& i
+ o. `) U+ T6 B  z7 H
5 R- P3 I! [( I1 \- S
G}}XI4Q6BZJOMM%1_3{RSP1.png 8 O2 {5 v+ ]8 v" ]; C* F' O9 _' `1 Z1 F
. Y9 s1 X6 v- `; ]; k
1.3.2 如何使能PCROP保护
7 {& l  L8 h) k) `+ M: PPCROP保护是逐扇区激活的,因此每个扇区可以单独作为PCROP扇区,并可以对附加扇区进行保护(当RDP设置为级别0或级别1时)。
: O7 [8 r) t; q+ ]PCROP保护通过FLASH_OPTCR2寄存器中的选项位PCROP来激活:
& N) _. }. X5 W6 X* [PCROP = 0:扇区i(i = 0,...,7)上的PCROP保护不被激活
. B4 N1 J" o: v* j$ y( t5 VPCROP = 1:扇区i(i = 0,...,7)上的PCROP保护被激活( E# I( m' k( Z# W  d/ ~
为了提高PCROP扇区的安全级别,在执行PCROP扇区中的代码时,所有调试事件都会被屏蔽。3 a0 p1 j+ V( q6 D" A: v
另有一个选项位(PCROP_RDP = PCROP1ER [15])可用来选择在RDP保护从级别1变为级别0时PCROP区域是否被擦除。3 ^1 S+ `. F( Q' M0 E1 q7 C
用来激活PCROP保护(PCROPi)的位和用来激活写保护nWRPi的其他位是独立的,因此可以同时存在一个写保护扇区和一个PCROP扇区。表 2显示了根据WRPi和PCROPi位的值,扇区i上会设置何种保护。

1 r) S4 |. T/ P- R; E/ ?' e3 u
- x' H" Y5 r$ f/ S4 V/ R

5 H5 f) O/ r# p- r, Z* u KKISLII5$L]7VS9~R}7RY.png
8 y; W% v* R; p7 y- f6 I. A. F
* f4 q0 h- J) U. W- {+ M5 Y
注: 关于实现PCROP使能的更多详细内容,用户必须参考所提供的FW包(STEP1-ST_Customer_level_n project main.c文件)中所述的PCROP_Enable()函数。
# M$ H- u  H7 |1 a. S; l
  a% q- p5 q" H( W# D
1.3.3 如何禁用PCROP保护
: J% `+ a( m' o" p; _) h根据RDP级别,如果RDP级别为1或0,则PCROP保护可被禁用,但是如果RDP设置为级别2,PCROP不能被禁用。当RDP设为级别2,所有选项字节都会被冻结,不能修改。因此,PCROP保护的扇区不能再被擦除或修改,这样就成为永久性保护。禁用受保护扇区上PCROP的唯一方式是:
3 t8 N) U! M5 S清除对应扇区的PCROPi位(多个扇区可同时可进行)
6 V! J6 A/ Y& ?& S9 Q9 q实现从级别1退回到级别0
- m, L9 B$ n) y将PCROP_RDP位置位3 I5 O# g: p) Y
如果PCROP_RDP位被置位,则执行主闪存的批量擦除,并根据PCROPi值,对应扇区的PCROP保护保持使能或禁用。
% w1 z8 h/ p3 ?& f, M如果PCROP_RDP位被清零,则完全批量擦除由部分批量擦除所代替,该部分页面擦除是对PCROP激活的存储区内进行连续页面擦除(PCROP保护的页面除外)。这样做是为了保持PCROP代码。

- l9 \, `7 [( T& l" S: e1 i4 j: `' ~3 J2 {, V8 G$ m
注: 允许从级别1退回级别0与修改PCROP_RDP位同时进行由于完全或部分批量擦除在选项修改前启动,所以使用的是当前PCROP_RDP位,而不是被编程的新PCROP_RDP位。
3 r0 c* f2 I  F. @$ d

5 \3 p4 g: h/ S; A使用STM32-Link Utility3 j0 {! G* l4 g/ r( J& _
应用程序开发过程中,用户可能需要禁用PCROP或全局RDP保护,而不必花时间开发或禁用保护功能。STM32 ST-LINK Utility工具是一个非常简单的禁用或使能保护的方式,利用调试接口如JTAG或SWD即可实现,而无需开发专门的功能。图 2显示如何修改选项字节。

% Y2 n9 u/ B9 O
7 u6 L: d0 }/ T2 O" k/ ^
! B$ {5 \+ y  m
W677STG__B{${T}9NP_MI3O.png
' R# X7 A- d' H0 P! s) J4 T) f. K6 }, H. }$ u2 u3 u" l" L
关于如何使用STM32 ST-LINK Utility软件的更多详细信息,用户须参考STM32 ST-LINK实用软件说明用户手册 (UM0892),可从www.st.com上获取。
  ~: h- O  T* m0 @7 t
7 M+ x. f0 W$ T( d* x  V% G& n2 I
1.3.4 存放和执行PCROPIP-code
7 p  ?3 y) t# S  k4 Y+ R* w如前所述,PCROP不会阻止执行受保护的IP-code,并且其函数可方便地被用户代码所调用。
  X4 g& F" w: N' k; C+ D  k/ G
PCROP保护的扇区不被D-code总线读访问,这里重点指出,只允许进行代码执行(通过 Icode总线取指令),而禁止读取数据。因此,受保护的IP-code无法访问存储在同一区域的相关数据值(如文字池、分支表或常量,执行过程中它们通过D-code总线从闪存中取出)。
7 g5 x" m6 C2 b$ b- L& g  IPCROP的代码必须是只可执行的代码,不能包含任何数据。
7 k! h5 Q; M- [用户必须配置编译器来生成只可执行的IP-code,并且避免任何数据读取,所需编译器配置在第 2节中有详细说明。
4 `. A7 B6 \# a0 D
+ L# f$ i7 ~" J) i0 D" B# y) j8 ~1 M
不可激活向量表扇区的PCROP保护' S9 m: W4 e( R' f+ ^3 v
中断向量表包含了每个中断处理程序的进入点地址,它们可由CPU通过D-code总线进行读取。通常中断向量表位于首地址0x08000000的第一个扇区(例外是在某些情况下,它会被重新定位到其他区域,如SRAM)。
# P7 n( O# W0 p0 K将代码置于闪存中进行保护时,必须遵守以下规则:
3 H: ^  |; r$ e6 R) U9 V5 D7 h, C向量表所在的第一个闪存扇区不能是PCROP保护扇区, V# J: G) g0 n& O  K2 J; m
PCROP保护的代码不能位于第一个扇区中。

' m! Q! F9 ~& c3 \5 A, u0 m) ^% X- e! b6 _
PCROPIP-code依赖关系$ a( }5 H6 L7 u% T3 Q& H7 B
受保护的IP-code可以从位于用户代码区域中以及PCROP保护区之外的库中调用函数。这种情况下,IP-code中包含了相关函数地址,允许PC(程序计数器)在执行IP-code时跳转到这些函数。一旦IP-code被PCROP保护,则这些地址不能更改。因此,每个调用函数必须位于(PCROP保护区域之外)PCROP保护IP-code中写入的相应固定地址,否则PC跳转到无效地址,IP-code无法正常工作。
! d* ~" Y( K7 V# B要完全独立,受保护IP-code必须与其所有关联函数放在一起5 x% t9 k: D" {# R% X: a% D# F
图 3显示一个示例,其中PCROP保护的Function_A()调用位于PCROP保护区域之外的固定
6 S" y# p8 A" B1 p% s0 A地址的Function_B()。
1 U4 D1 P, m( U" e8 K0 c9 O
7 q, w5 ?# s6 R
4@OO][5M[B7384CI{ZVS1.png : R9 ]* ^5 _# {+ W6 o

" X2 \/ K- w8 i) ~  r5 \6 F
2 I9 Y. q$ D+ ^' K3 v
完整版请查看:附件
, T# Z* J7 L' h; ?' P# z' M) t, S& x

DM00346619_ZHV1.pdf

下载

1.26 MB, 下载次数: 2

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

举报

0个回答

所属标签

相似分享

官网相关资源

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