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

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

[复制链接]
STMCU小助手 发布时间:2022-7-12 23:02
前言, W* Q& b, [. |+ @, h% ]! Y0 Q/ H
软件提供商开发了复杂的中间件解决方案(知识产权代码,或IP-code), 保护它们对于微控制器而言至关重要。
* q/ B* Z; W, C0 A4 @$ y7 t% C5 G为了应对这一重要需求,STM32F72xxx和STM32F73xxx微控制器具有以下功能:  U/ U+ @7 q9 M8 n' w7 d
• 读保护(RDP):防止进行读取操作
! _) a0 j6 n! B$ y• 写保护:防止进行不需要的写入或擦除操作- T. ^/ }) k' f% R) l
• 专有代码读取保护:防止进行读写操作
! Y) s, E+ L1 H& c本应用笔记对这些闪存保护技术进行了说明,重点是STM32F72xxx和STM32F73xxx微控制器上的专有代码读取保护,并提供了PCROP保护的基本示例。5 ^' n) n' w1 y0 }
本文档随附的X-CUBE-PCROP嵌入式软件包包含了PCROP示例的源代码,以及运行示例所需的所有嵌入式软件模块。
" W7 u1 j6 W4 A, s5 R5 i. U本应用笔记必须同STM32F72xxxSTM32F73xxx 基于ARM®的高级32MCU的参考手册(RM0431)一起阅读,数据手册可以在www.st.com上获取。
9 V) z) y( H9 N' J$ J0 S5 ^$ q# O
- [& A0 }; ^% o1 J) G+ Y. ^5 w
& y) E3 w4 T! X
1 存储器保护说明
, P5 I% H+ E9 ~3 h  e1.1 读保护(RDP" ?$ C( G2 ]3 K" ^, p9 N$ B. O
读取保护是全局闪存读保护,可保护嵌入式软件代码,避免复制、逆向工程、使用调试工具读出或其他方式的入侵攻击。该保护必须在二进制代码载入嵌入式闪存后,由用户进行设置。
: i: t1 x' b4 ?5 D以下章节中对三个RDP级别(0,1和2)进行定义和描述。3 S: L. ?8 g/ ^8 n3 V: A
1.1.1 读保护级别0( ], o* o# j) s/ {, B& u
级别0是默认级别,闪存完全打开,可在所有引导配置(调试功能,从RAM、从系统内存引导加载程序或从闪存启动)下进行全部内存操作。这种模式下,没有保护,该模式用于开发和调试。
/ W& G3 \1 T! S- b% @, A/ f* o' B& G& B5 M% ?3 B
. n' [7 {2 ~5 @6 a# l+ p
1.1.2 读保护级别14 U) G6 Q: `4 |$ c  Q" a0 q7 c
激活读保护级别1时,即使是从SRAM或系统内存引导加载程序来启动,也不能使用调试功能(如串行线路或JTAG)访问(读取,擦除和编程)闪存或备用SRAM。# W: r8 Y$ K% }
但是,当从闪存启动时,允许用户代码访问Flash存储器和备用SRAM。
1 J% V' r/ I( h( b2 k; N将RDP选项字节重新编程为级别0,可禁用RDP级别1保护,这会导致批量擦除。
, S( t2 o3 j; U$ ?9 }$ t3 z$ m7 y/ m' _: H/ e; p+ m

9 m1 C/ M0 I* n$ i% L+ `9 ^1.1.3 读保护级别2
9 q0 h; k; A8 |9 T激活RDP级别2时,级别1所支持的所有保护均有效,芯片受到全面保护。RDP选项字节和所有其他选项字节都会被冻结,不能再修改。JTAG、SWV(单线查看器)、ETM 和边界扫描被禁用。, B3 x2 [# J2 B* ~" v3 ?. z
从闪存启动时,用户代码可以访问内存内容。但是,不再能从SRAM或从系统内存引导加载程序启动。3 G) r& ~" F+ {% y: {
这种保护是不可逆的(JTAG熔断),所以不能回到保护级别1或0。
( N2 u- f% R7 J, [+ U) R1描述了从内部闪存启动,或在调试,或从SRAM或系统内存引导加载程序启动时,对闪存、备用SRAM、选项字节和一次性可编程字节(OTP)的不同访问。
& N  [3 F# U. y' M) e, K
8 K  w- x; q# {0 T6 n

2 S9 D" b( s6 i& k+ X: m: `+ Z+ E 3AHBSF%Y176JIO(JIYYN5YE.png
$ H; t$ o$ W& @# c$ K4 H" J: H
# C! X9 ~" g% z4 }( A2 X+ E
1.1.4 STM32F72xxxSTM32F73xxx RDP保护下的内部闪存内容更新 ( n3 ]* H7 ]( s
当RDP保护激活时(级别1或级别2),内部闪存内容不能通过调试进行更新,当从SRAM或系统内存引导加载程序启动时也不能更新。7 o# U5 c7 N: j" ?2 Z2 ^
对最终产品的一个重要要求就是,能够将内部Flash存储器中的嵌入式软件升级为新的软件版本,添加新功能并修正潜在问题。0 `  D5 W5 e& u3 F4 O: |9 u( N2 X
可通过实施用户专用嵌入式软件执行内部闪存应用内编程(In-Application Programming,IAP)来解决此需求。IAP使用通信协议(如USART)来实现重编程过程。4 G3 f5 u: N5 m# s0 F
有关IAP的更多详细信息,请参阅www.st.com上提供的STM32使用USART进行应用内编程应用笔记(AN3965)。
: ?$ D! G9 H" P: W+ B1 d4 y: I2 r6 ^
1.2 写保护
" L+ `! C& I$ _$ q, i写保护用来保护指定扇区内容,避免代码更新或擦除。这种保护可应用于扇区。
0 q& Z9 d8 _8 P0 j2 |! _) v0 F) \任何写请求都会产生一个写保护错误。如果要擦除/编程的地址属于闪存中处于写保护状态的区域,则通过硬件将WRPERR标志置位。
0 L9 X. r* D9 N" s* r6 j例如,如果闪存中至少有一个扇区是写保护的,则不能对其进行批量擦除,并且WRPERR标志置位。
, }- l9 k4 m/ q2 G; h/ [, Z( z要激活每个闪存扇区 i 的写保护,可使用一个选项位nWRPi。当设置扇区 i(选项位nWRPi = 0)为写保护时,该扇区不能被擦除或编程。
* k3 a  n* @/ F- Y9 w0 J& Z; D5 P' u可通过嵌入式用户代码或使用STM32 ST-Link Utility软件和调试接口,进行使能或禁用写保护管理。' U& m# |# q6 r0 [4 t8 x- a( U3 l0 N

9 q1 Y1 u. X, d( o1.3 专有代码读保护(Proprietary Code Read Out ProtectionPCROP& y/ y! |+ y/ W+ _7 a
1.3.1 PCROP保护概述6 c+ t2 g, q9 }  G
PCROP是闪存中IP-code的读写保护。PCROP应用于扇区(0至7),保护专利代码不被最终用户代码、调试器工具或RAM Trojan代码修改或读取。
$ J" _# u2 I, P3 z& x: A! X通过ITCM或A**线对PCROP扇区的任何读访问(获取操作除外)都会触发:- m& @7 h9 j* R. R: C* }
给定总线上出现总线错误4 E3 d! U/ u) L  M: @" \
FLASH_SR状态寄存器中RDERR标志置位。如果FLASH_CR寄存器中读错误中断使能位(Read Error Interrupt Enable,RDERRIE)置位,也会生成一个中断。' e: B6 u7 u, B/ Q0 H
任何对PCROP扇区的编程/擦除操作都会触发WRPERR标志错误。
* f9 t3 w: R$ S3 h, @6 ~5 h$ l受保护的IP-code可以很容易地被最终用户应用程序所调用,并且仍能受到保护,不可直接访问IP-code本身。PCROP不会阻止执行受保护的代码。
0 N" ?, Z& x: X, H, L2 [( R* _, q3 p0 m
注意:
' }, |8 A/ ^( z3 l8 L- n虽然对PCROP扇区的读访问会产生总线错误,但读错误中断可被硬故障错误中断或总线故障错误中断所屏蔽。要使用读错误中断,必须将总线故障错误中断优先级使能为低于读错误中断优先级。
' ?( T- T7 V$ X" I  Y; F7 X5 A" {* [" E" x' ~& Q& S# U* \& ~7 p

3 ~5 e' {5 D/ Q- |$ x- g G}}XI4Q6BZJOMM%1_3{RSP1.png 8 ]+ h9 `* m* b9 [% }3 L1 z) {/ i

9 `% e7 |  F& i" V. m1.3.2 如何使能PCROP保护4 H% N5 n9 f& ^, z. A# s
PCROP保护是逐扇区激活的,因此每个扇区可以单独作为PCROP扇区,并可以对附加扇区进行保护(当RDP设置为级别0或级别1时)。6 `* L) P0 B0 e  Y+ K% m8 K9 m
PCROP保护通过FLASH_OPTCR2寄存器中的选项位PCROP来激活:
( r: a0 z* ]  ]- ^PCROP = 0:扇区i(i = 0,...,7)上的PCROP保护不被激活' D( a# o6 q" o. c5 K: u
PCROP = 1:扇区i(i = 0,...,7)上的PCROP保护被激活9 T8 [  O# r$ ^% I0 W/ h. X
为了提高PCROP扇区的安全级别,在执行PCROP扇区中的代码时,所有调试事件都会被屏蔽。
2 A  \8 d  O8 z6 C' ^6 B6 M/ v/ M另有一个选项位(PCROP_RDP = PCROP1ER [15])可用来选择在RDP保护从级别1变为级别0时PCROP区域是否被擦除。! r$ `. a& {' k6 j8 h# a7 N
用来激活PCROP保护(PCROPi)的位和用来激活写保护nWRPi的其他位是独立的,因此可以同时存在一个写保护扇区和一个PCROP扇区。表 2显示了根据WRPi和PCROPi位的值,扇区i上会设置何种保护。

8 ^9 r  Q' T- E* n; ?
: l2 v8 I& F; i+ ?. ^' w9 }$ A

" u* X- J; i" s: p4 k2 ^ KKISLII5$L]7VS9~R}7RY.png , [) o+ O( p1 G& ^# ^# ]0 V7 B

7 S( G1 \6 N) U5 |: T( G- s' U0 l注: 关于实现PCROP使能的更多详细内容,用户必须参考所提供的FW包(STEP1-ST_Customer_level_n project main.c文件)中所述的PCROP_Enable()函数。
- e- f+ x" f: `  R0 }* N

) I9 T  @  {4 ^5 z1 p/ @, c. @
1.3.3 如何禁用PCROP保护4 k( D* a  w  C5 T. Z# B& T
根据RDP级别,如果RDP级别为1或0,则PCROP保护可被禁用,但是如果RDP设置为级别2,PCROP不能被禁用。当RDP设为级别2,所有选项字节都会被冻结,不能修改。因此,PCROP保护的扇区不能再被擦除或修改,这样就成为永久性保护。禁用受保护扇区上PCROP的唯一方式是:
, s' j; z" y& ^* C$ M* J, k清除对应扇区的PCROPi位(多个扇区可同时可进行)
: B9 u/ d5 q& Y9 e: z实现从级别1退回到级别0
$ N1 P! _* M8 O$ F. z将PCROP_RDP位置位
" M7 K2 N3 i, e. W. x& |* K. `5 v( S如果PCROP_RDP位被置位,则执行主闪存的批量擦除,并根据PCROPi值,对应扇区的PCROP保护保持使能或禁用。
7 R* R2 W8 d/ u( ~/ p如果PCROP_RDP位被清零,则完全批量擦除由部分批量擦除所代替,该部分页面擦除是对PCROP激活的存储区内进行连续页面擦除(PCROP保护的页面除外)。这样做是为了保持PCROP代码。
* b. e% Y' I2 R: ]% F6 E* k! B
$ N  G" K& Y3 m0 }
注: 允许从级别1退回级别0与修改PCROP_RDP位同时进行由于完全或部分批量擦除在选项修改前启动,所以使用的是当前PCROP_RDP位,而不是被编程的新PCROP_RDP位。! h) y6 L. F. l* t& P0 N. \& L' o
# O6 P: `! I  Q
使用STM32-Link Utility- F6 o( ]0 w) c# T
应用程序开发过程中,用户可能需要禁用PCROP或全局RDP保护,而不必花时间开发或禁用保护功能。STM32 ST-LINK Utility工具是一个非常简单的禁用或使能保护的方式,利用调试接口如JTAG或SWD即可实现,而无需开发专门的功能。图 2显示如何修改选项字节。
' Z% C& Y7 t0 Q0 X' ~8 P
/ z6 }  H0 U4 C  T

+ d4 y$ o+ v+ e2 p W677STG__B{${T}9NP_MI3O.png 6 c) s9 q' m9 i, W+ i

# ^2 f5 n$ U/ I' l2 T8 H: ~关于如何使用STM32 ST-LINK Utility软件的更多详细信息,用户须参考STM32 ST-LINK实用软件说明用户手册 (UM0892),可从www.st.com上获取。

- S3 @; x, f# w7 l, L( _' d9 s: ]8 Y& `$ b
1.3.4 存放和执行PCROPIP-code
" C" L# }0 t6 q; C/ e" A如前所述,PCROP不会阻止执行受保护的IP-code,并且其函数可方便地被用户代码所调用。
- k5 {, v: \3 t% i4 x: o2 @
PCROP保护的扇区不被D-code总线读访问,这里重点指出,只允许进行代码执行(通过 Icode总线取指令),而禁止读取数据。因此,受保护的IP-code无法访问存储在同一区域的相关数据值(如文字池、分支表或常量,执行过程中它们通过D-code总线从闪存中取出)。
% C, [: t: ]2 aPCROP的代码必须是只可执行的代码,不能包含任何数据。
- C' \/ v) v" r7 `( @( `8 t用户必须配置编译器来生成只可执行的IP-code,并且避免任何数据读取,所需编译器配置在第 2节中有详细说明。

8 h% Q$ b$ v! G
2 U/ E% _  ?( e# ^4 D# d2 Q$ z' v
不可激活向量表扇区的PCROP保护7 N4 l( O- ~# K% k6 C
中断向量表包含了每个中断处理程序的进入点地址,它们可由CPU通过D-code总线进行读取。通常中断向量表位于首地址0x08000000的第一个扇区(例外是在某些情况下,它会被重新定位到其他区域,如SRAM)。
" P9 K6 u$ G% H# _将代码置于闪存中进行保护时,必须遵守以下规则:
, R& m4 a" n+ p向量表所在的第一个闪存扇区不能是PCROP保护扇区
3 n- i8 j0 r9 UPCROP保护的代码不能位于第一个扇区中。
6 a1 {, D/ s* G4 f, n6 l9 k5 p* v3 C

( {4 `$ m7 b# ?6 Z* d5 {8 @1 b2 i
PCROPIP-code依赖关系
3 I( E$ ~' Q" W5 n; s# z$ F4 s! i9 C受保护的IP-code可以从位于用户代码区域中以及PCROP保护区之外的库中调用函数。这种情况下,IP-code中包含了相关函数地址,允许PC(程序计数器)在执行IP-code时跳转到这些函数。一旦IP-code被PCROP保护,则这些地址不能更改。因此,每个调用函数必须位于(PCROP保护区域之外)PCROP保护IP-code中写入的相应固定地址,否则PC跳转到无效地址,IP-code无法正常工作。
7 K* @& }' x) I# G5 N9 B要完全独立,受保护IP-code必须与其所有关联函数放在一起" Q4 i4 d) n* _0 A
图 3显示一个示例,其中PCROP保护的Function_A()调用位于PCROP保护区域之外的固定
3 l/ ]. I4 R* R% H: P' ]地址的Function_B()。
" h! c: ?/ k. a% u
) c% }6 h" ]. w$ i3 J$ R0 \
4@OO][5M[B7384CI{ZVS1.png & d/ e& K- Z  D) @8 F/ h3 b

3 Z( [  E" Q" }5 g) K
/ v. [+ E; F9 |
完整版请查看:附件
) T" b: \' x" G0 r6 G3 H

DM00346619_ZHV1.pdf

下载

1.26 MB, 下载次数: 2

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

举报

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