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

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

[复制链接]
STMCU小助手 发布时间:2022-7-12 23:02
前言% }: @2 D( z0 p1 b) |! X5 m" k+ @
软件提供商开发了复杂的中间件解决方案(知识产权代码,或IP-code), 保护它们对于微控制器而言至关重要。
% H# `- g; u) t/ i8 w为了应对这一重要需求,STM32F72xxx和STM32F73xxx微控制器具有以下功能:: p, s" y& x- h$ j! C8 [
• 读保护(RDP):防止进行读取操作5 ]! {0 I2 S3 S8 `) p* |) u2 @
• 写保护:防止进行不需要的写入或擦除操作
* M% K- @5 e) y! D# U• 专有代码读取保护:防止进行读写操作+ ?& g% }9 H$ @- W
本应用笔记对这些闪存保护技术进行了说明,重点是STM32F72xxx和STM32F73xxx微控制器上的专有代码读取保护,并提供了PCROP保护的基本示例。
  `# j0 n5 f3 K; m$ S5 ?本文档随附的X-CUBE-PCROP嵌入式软件包包含了PCROP示例的源代码,以及运行示例所需的所有嵌入式软件模块。
6 f* d( m3 g8 F- V本应用笔记必须同STM32F72xxxSTM32F73xxx 基于ARM®的高级32MCU的参考手册(RM0431)一起阅读,数据手册可以在www.st.com上获取。4 |4 {2 w$ L( h) G6 y/ S. q# {
  Z+ }8 D+ v, U. U# \
' H0 T* ?: F  w# O6 `% p
1 存储器保护说明/ d1 e! T" c* @/ T: H& h* K
1.1 读保护(RDP
: b) z0 \/ S9 g' C6 p& N读取保护是全局闪存读保护,可保护嵌入式软件代码,避免复制、逆向工程、使用调试工具读出或其他方式的入侵攻击。该保护必须在二进制代码载入嵌入式闪存后,由用户进行设置。1 I& ^1 n9 `) c4 S# n
以下章节中对三个RDP级别(0,1和2)进行定义和描述。7 _4 M$ T1 P0 z5 u( Q% q
1.1.1 读保护级别0/ s: Z$ Z8 z8 T) g% _& Q
级别0是默认级别,闪存完全打开,可在所有引导配置(调试功能,从RAM、从系统内存引导加载程序或从闪存启动)下进行全部内存操作。这种模式下,没有保护,该模式用于开发和调试。1 K* w- C! Y( r1 t5 \( ^- L0 p

0 X! B4 y( V# C, P/ G/ ]

7 C$ @+ Q/ R, X2 K' }9 X8 B/ e1.1.2 读保护级别1
# n7 A+ F  O0 j; W/ V; \激活读保护级别1时,即使是从SRAM或系统内存引导加载程序来启动,也不能使用调试功能(如串行线路或JTAG)访问(读取,擦除和编程)闪存或备用SRAM。
2 V! P6 _+ s) w* U- K但是,当从闪存启动时,允许用户代码访问Flash存储器和备用SRAM。
; i0 ?" @) ]% `5 E. H: `. _将RDP选项字节重新编程为级别0,可禁用RDP级别1保护,这会导致批量擦除。% O) Q* c9 q/ C# D+ a$ |3 q
% B4 C) U) A4 ^( \  V

/ ^  d5 x5 x. m$ H: t1.1.3 读保护级别2
6 j* N2 r/ G& m5 p# e5 ~- h激活RDP级别2时,级别1所支持的所有保护均有效,芯片受到全面保护。RDP选项字节和所有其他选项字节都会被冻结,不能再修改。JTAG、SWV(单线查看器)、ETM 和边界扫描被禁用。
- k6 `" |( [% X5 {从闪存启动时,用户代码可以访问内存内容。但是,不再能从SRAM或从系统内存引导加载程序启动。
3 z# I  F; V0 y7 Q8 f& ?& G这种保护是不可逆的(JTAG熔断),所以不能回到保护级别1或0。
2 X( k) s8 E: o1描述了从内部闪存启动,或在调试,或从SRAM或系统内存引导加载程序启动时,对闪存、备用SRAM、选项字节和一次性可编程字节(OTP)的不同访问。
8 m+ f+ [* p7 F0 w: _0 V0 w9 e; I
; \6 a, l; Q7 [  U
* F% _( u9 W( M# d1 Z
3AHBSF%Y176JIO(JIYYN5YE.png
! p: k% f; Q: q  r) R

* |1 R- H5 c& }1.1.4 STM32F72xxxSTM32F73xxx RDP保护下的内部闪存内容更新 $ {7 i2 R  a$ P
当RDP保护激活时(级别1或级别2),内部闪存内容不能通过调试进行更新,当从SRAM或系统内存引导加载程序启动时也不能更新。
, T1 p+ j$ j, I# j9 j对最终产品的一个重要要求就是,能够将内部Flash存储器中的嵌入式软件升级为新的软件版本,添加新功能并修正潜在问题。
, [& }9 f% R; k/ ?2 A- U可通过实施用户专用嵌入式软件执行内部闪存应用内编程(In-Application Programming,IAP)来解决此需求。IAP使用通信协议(如USART)来实现重编程过程。' Q/ X  S3 _9 E. v
有关IAP的更多详细信息,请参阅www.st.com上提供的STM32使用USART进行应用内编程应用笔记(AN3965)。
' L" ]0 \# n) K# Y; ^% W1 Y% }- L9 T
1.2 写保护$ ]3 D5 y8 [# h& o( q" J' d( G
写保护用来保护指定扇区内容,避免代码更新或擦除。这种保护可应用于扇区。! J0 t+ {/ g  Z4 A4 b# v2 y
任何写请求都会产生一个写保护错误。如果要擦除/编程的地址属于闪存中处于写保护状态的区域,则通过硬件将WRPERR标志置位。
8 J3 _5 b7 a: _% `9 J" R6 e# G例如,如果闪存中至少有一个扇区是写保护的,则不能对其进行批量擦除,并且WRPERR标志置位。
$ [' _: F( u2 X( f. O7 b要激活每个闪存扇区 i 的写保护,可使用一个选项位nWRPi。当设置扇区 i(选项位nWRPi = 0)为写保护时,该扇区不能被擦除或编程。$ q: j* v8 p# S3 e! y# Z
可通过嵌入式用户代码或使用STM32 ST-Link Utility软件和调试接口,进行使能或禁用写保护管理。' ^1 Y/ u& ]3 O: ^, B. Q
; i+ T. A- t$ r; s9 U- d
1.3 专有代码读保护(Proprietary Code Read Out ProtectionPCROP3 K( T& ]( u/ w" k$ b
1.3.1 PCROP保护概述
7 O; }; x* d5 O5 HPCROP是闪存中IP-code的读写保护。PCROP应用于扇区(0至7),保护专利代码不被最终用户代码、调试器工具或RAM Trojan代码修改或读取。! g' ]0 ]7 `" m2 N  J. B3 b
通过ITCM或A**线对PCROP扇区的任何读访问(获取操作除外)都会触发:
8 z- g% {  ^5 j3 g# K( w给定总线上出现总线错误
7 c4 t7 W2 X9 f( ^9 p. oFLASH_SR状态寄存器中RDERR标志置位。如果FLASH_CR寄存器中读错误中断使能位(Read Error Interrupt Enable,RDERRIE)置位,也会生成一个中断。
7 [6 `+ w' d& y8 h- Z任何对PCROP扇区的编程/擦除操作都会触发WRPERR标志错误。* [3 y: k( D7 F, W7 L+ s+ x
受保护的IP-code可以很容易地被最终用户应用程序所调用,并且仍能受到保护,不可直接访问IP-code本身。PCROP不会阻止执行受保护的代码。8 s& ^0 z' E+ O

4 N& F5 H5 j# R: x4 B
注意: , d* v) _' j; T
虽然对PCROP扇区的读访问会产生总线错误,但读错误中断可被硬故障错误中断或总线故障错误中断所屏蔽。要使用读错误中断,必须将总线故障错误中断优先级使能为低于读错误中断优先级。
( v1 n1 E: v# S( c' r3 P
& v3 G; q7 a* H1 B7 {
2 R: W; U# W; ~# B
G}}XI4Q6BZJOMM%1_3{RSP1.png $ u( H# {/ @  ~: R0 p0 k/ @

& y7 M9 Q- O3 l. U5 G: o$ |9 H4 T1.3.2 如何使能PCROP保护
0 K4 E% M! ?8 }PCROP保护是逐扇区激活的,因此每个扇区可以单独作为PCROP扇区,并可以对附加扇区进行保护(当RDP设置为级别0或级别1时)。1 Z+ K9 k2 r4 R4 d
PCROP保护通过FLASH_OPTCR2寄存器中的选项位PCROP来激活:
' a9 K# z& [) e9 x+ E; Y" o- K/ V8 {8 s" Z/ \PCROP = 0:扇区i(i = 0,...,7)上的PCROP保护不被激活
4 n# \! |/ G# e* {" h9 VPCROP = 1:扇区i(i = 0,...,7)上的PCROP保护被激活3 h; q# n" k9 c/ z
为了提高PCROP扇区的安全级别,在执行PCROP扇区中的代码时,所有调试事件都会被屏蔽。0 b! o" U/ F* x, k6 K8 F7 z$ K
另有一个选项位(PCROP_RDP = PCROP1ER [15])可用来选择在RDP保护从级别1变为级别0时PCROP区域是否被擦除。
% s6 V# d, L" V用来激活PCROP保护(PCROPi)的位和用来激活写保护nWRPi的其他位是独立的,因此可以同时存在一个写保护扇区和一个PCROP扇区。表 2显示了根据WRPi和PCROPi位的值,扇区i上会设置何种保护。
$ J8 L. M* l( S8 O# C! B) `
8 u. y; _! X7 N, L9 r: c, P
- }8 i) H3 `8 H, A. }% u
KKISLII5$L]7VS9~R}7RY.png $ U( }" l( ^3 n6 d: z# J% o

) |8 h6 ]; S+ r% @' Y5 A注: 关于实现PCROP使能的更多详细内容,用户必须参考所提供的FW包(STEP1-ST_Customer_level_n project main.c文件)中所述的PCROP_Enable()函数。

! r( _; H# A# h2 E0 m) i) t1 ~0 {1 i- b! ~
1.3.3 如何禁用PCROP保护
+ U. Y" h* c& C& h+ f3 s根据RDP级别,如果RDP级别为1或0,则PCROP保护可被禁用,但是如果RDP设置为级别2,PCROP不能被禁用。当RDP设为级别2,所有选项字节都会被冻结,不能修改。因此,PCROP保护的扇区不能再被擦除或修改,这样就成为永久性保护。禁用受保护扇区上PCROP的唯一方式是:
  ]# x" m: \: \) [$ X9 v. b清除对应扇区的PCROPi位(多个扇区可同时可进行)
+ L. ^. G# T  r6 L* y8 e实现从级别1退回到级别0
2 W( I8 q5 A9 y7 S5 U9 ]将PCROP_RDP位置位
  {+ ^! @6 o  x: J* }- G9 Z如果PCROP_RDP位被置位,则执行主闪存的批量擦除,并根据PCROPi值,对应扇区的PCROP保护保持使能或禁用。
0 `% H  O9 B+ E8 h3 p如果PCROP_RDP位被清零,则完全批量擦除由部分批量擦除所代替,该部分页面擦除是对PCROP激活的存储区内进行连续页面擦除(PCROP保护的页面除外)。这样做是为了保持PCROP代码。
; N3 X1 m# D6 y

0 ~8 u! e/ ^0 E9 x, `1 O% k  M注: 允许从级别1退回级别0与修改PCROP_RDP位同时进行由于完全或部分批量擦除在选项修改前启动,所以使用的是当前PCROP_RDP位,而不是被编程的新PCROP_RDP位。
( D) J! V) N) e6 p! |( u7 s- k

' ^) O7 D# q+ B0 h使用STM32-Link Utility
4 m9 Q' E2 \; i/ I应用程序开发过程中,用户可能需要禁用PCROP或全局RDP保护,而不必花时间开发或禁用保护功能。STM32 ST-LINK Utility工具是一个非常简单的禁用或使能保护的方式,利用调试接口如JTAG或SWD即可实现,而无需开发专门的功能。图 2显示如何修改选项字节。
7 Q! x' y  I( h7 M; w& O; j

& [: w, a# B; s0 ], A& Q0 R# T) H
# r" X3 ~2 c& u7 z: N* q) ?) X. Z
W677STG__B{${T}9NP_MI3O.png , Y# W. k8 o) K( o

+ E+ n8 ^6 G0 [# \& B! c$ O关于如何使用STM32 ST-LINK Utility软件的更多详细信息,用户须参考STM32 ST-LINK实用软件说明用户手册 (UM0892),可从www.st.com上获取。
9 G% x  T. h7 O: o/ P
  w" [, {8 [6 _" B% p
1.3.4 存放和执行PCROPIP-code# R- }- b7 ?8 t$ Y- {# s  ^2 A
如前所述,PCROP不会阻止执行受保护的IP-code,并且其函数可方便地被用户代码所调用。
9 {* ^+ d7 y1 L* R
PCROP保护的扇区不被D-code总线读访问,这里重点指出,只允许进行代码执行(通过 Icode总线取指令),而禁止读取数据。因此,受保护的IP-code无法访问存储在同一区域的相关数据值(如文字池、分支表或常量,执行过程中它们通过D-code总线从闪存中取出)。# f8 u7 O8 G" V' C$ |8 U/ \
PCROP的代码必须是只可执行的代码,不能包含任何数据。
* R- q# f# f& m$ U, {5 j" I% I用户必须配置编译器来生成只可执行的IP-code,并且避免任何数据读取,所需编译器配置在第 2节中有详细说明。

6 N. ^8 ^% E, m8 d5 N$ T! ^
8 S6 i* z* \; `$ {9 O* L% S, e
不可激活向量表扇区的PCROP保护& K6 }; ]6 |! ~# S4 @
中断向量表包含了每个中断处理程序的进入点地址,它们可由CPU通过D-code总线进行读取。通常中断向量表位于首地址0x08000000的第一个扇区(例外是在某些情况下,它会被重新定位到其他区域,如SRAM)。% a4 o7 @( }# M' x" O9 |' h
将代码置于闪存中进行保护时,必须遵守以下规则:+ h( f$ s; r, Q9 a' |: M. _- v
向量表所在的第一个闪存扇区不能是PCROP保护扇区' d! m9 o( h$ E% k$ Y
PCROP保护的代码不能位于第一个扇区中。
  J4 A* b( I7 b1 L) s, a* f
; e0 X- n' i( S/ j
PCROPIP-code依赖关系0 V6 ^/ e6 G5 X0 o" ^
受保护的IP-code可以从位于用户代码区域中以及PCROP保护区之外的库中调用函数。这种情况下,IP-code中包含了相关函数地址,允许PC(程序计数器)在执行IP-code时跳转到这些函数。一旦IP-code被PCROP保护,则这些地址不能更改。因此,每个调用函数必须位于(PCROP保护区域之外)PCROP保护IP-code中写入的相应固定地址,否则PC跳转到无效地址,IP-code无法正常工作。7 A  d" m, |+ n' `/ [! z
要完全独立,受保护IP-code必须与其所有关联函数放在一起
; a& L+ f! q7 Y" V图 3显示一个示例,其中PCROP保护的Function_A()调用位于PCROP保护区域之外的固定$ Z: T8 @( k& T" E9 M; p' e# K
地址的Function_B()。 ( {" \" B; u+ W5 A' y/ B

7 i( d9 A" [3 G/ D
4@OO][5M[B7384CI{ZVS1.png ) A% ~1 L6 k" d* I+ x" z) H1 x* D
+ H2 z) P& T/ }4 N
1 t6 @' }5 O; G. {, i
完整版请查看:附件
# g* A+ I0 M' ~5 z) y- w

DM00346619_ZHV1.pdf

下载

1.26 MB, 下载次数: 2

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

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版