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

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

[复制链接]
STMCU小助手 发布时间:2022-7-12 23:02
前言3 K  y5 G0 j1 Q. M' i. v' f: a3 ]
软件提供商开发了复杂的中间件解决方案(知识产权代码,或IP-code), 保护它们对于微控制器而言至关重要。
5 C  q0 Q+ K+ @; Z为了应对这一重要需求,STM32F72xxx和STM32F73xxx微控制器具有以下功能:
. X) t4 S5 H5 W% a! W. z• 读保护(RDP):防止进行读取操作  M& ]" k; O# \: p; I% t$ A% l
• 写保护:防止进行不需要的写入或擦除操作6 k) Z4 {2 E, y8 ]$ V$ E; S- v
• 专有代码读取保护:防止进行读写操作
/ e* }+ F3 W; w& {本应用笔记对这些闪存保护技术进行了说明,重点是STM32F72xxx和STM32F73xxx微控制器上的专有代码读取保护,并提供了PCROP保护的基本示例。% q, }. H+ k# e6 o; _) B+ L
本文档随附的X-CUBE-PCROP嵌入式软件包包含了PCROP示例的源代码,以及运行示例所需的所有嵌入式软件模块。, t, |7 m! L) d" v- k/ m0 s
本应用笔记必须同STM32F72xxxSTM32F73xxx 基于ARM®的高级32MCU的参考手册(RM0431)一起阅读,数据手册可以在www.st.com上获取。
# c9 o2 R3 w$ ^% H( g5 ]6 ?* Y) y& O4 Q
! u6 j% Y% ~: M0 c) T9 y  ]) P% b
1 存储器保护说明% \8 e- k' @% o
1.1 读保护(RDP
; E2 h# X$ _# n2 M0 v* Q6 |6 n$ {读取保护是全局闪存读保护,可保护嵌入式软件代码,避免复制、逆向工程、使用调试工具读出或其他方式的入侵攻击。该保护必须在二进制代码载入嵌入式闪存后,由用户进行设置。
. \, H( h+ Z" Y9 V2 T3 G% [以下章节中对三个RDP级别(0,1和2)进行定义和描述。
% E8 Q3 y$ {1 L9 ~' y$ K( m7 m
1.1.1 读保护级别0  U0 K" v' h! }
级别0是默认级别,闪存完全打开,可在所有引导配置(调试功能,从RAM、从系统内存引导加载程序或从闪存启动)下进行全部内存操作。这种模式下,没有保护,该模式用于开发和调试。
! P- _0 W# S0 d) U, G& r* K
$ ~! w' c$ V) _# `/ b
* e  S/ {6 @3 U! F! [& X: p6 o) D$ e+ q% D
1.1.2 读保护级别1
! |2 @( b% ]" W- Z3 O! M激活读保护级别1时,即使是从SRAM或系统内存引导加载程序来启动,也不能使用调试功能(如串行线路或JTAG)访问(读取,擦除和编程)闪存或备用SRAM。
5 r- V# j9 O# l9 T( ^- V1 b但是,当从闪存启动时,允许用户代码访问Flash存储器和备用SRAM。
! z4 E  m) T6 [将RDP选项字节重新编程为级别0,可禁用RDP级别1保护,这会导致批量擦除。
+ C# d( E+ u# I0 l& p1 X+ |0 b2 [$ ~" V) I& K. t, d$ ~: M

% J- j9 ^# Z, e3 C# x7 W- @1.1.3 读保护级别2. e$ l2 ^# V' A6 s) S- v
激活RDP级别2时,级别1所支持的所有保护均有效,芯片受到全面保护。RDP选项字节和所有其他选项字节都会被冻结,不能再修改。JTAG、SWV(单线查看器)、ETM 和边界扫描被禁用。) W0 k( U- [( r( F0 o1 g- D* u
从闪存启动时,用户代码可以访问内存内容。但是,不再能从SRAM或从系统内存引导加载程序启动。# ^& g8 L3 C$ m5 C5 O# l; u" X( |; d! W
这种保护是不可逆的(JTAG熔断),所以不能回到保护级别1或0。 ; i" Q. L( L& w$ a
1描述了从内部闪存启动,或在调试,或从SRAM或系统内存引导加载程序启动时,对闪存、备用SRAM、选项字节和一次性可编程字节(OTP)的不同访问。
0 X8 J# V$ q7 a" T- ]+ c8 H5 W% X' v( m8 e7 o

( E9 J! B5 @, T. L$ \ 3AHBSF%Y176JIO(JIYYN5YE.png
, Q/ F& F2 c: y! p3 l; ^4 }

, d+ ]  f. f% h5 J: N) c) K/ l/ ^* j1.1.4 STM32F72xxxSTM32F73xxx RDP保护下的内部闪存内容更新
$ j( a4 j+ W' v8 `1 ?+ o7 Y当RDP保护激活时(级别1或级别2),内部闪存内容不能通过调试进行更新,当从SRAM或系统内存引导加载程序启动时也不能更新。5 U  ^% c+ X0 w% C. {
对最终产品的一个重要要求就是,能够将内部Flash存储器中的嵌入式软件升级为新的软件版本,添加新功能并修正潜在问题。
: Y6 [% [4 S4 F3 w) `9 a! v) p可通过实施用户专用嵌入式软件执行内部闪存应用内编程(In-Application Programming,IAP)来解决此需求。IAP使用通信协议(如USART)来实现重编程过程。; X; Q. f5 j, k+ Z# e
有关IAP的更多详细信息,请参阅www.st.com上提供的STM32使用USART进行应用内编程应用笔记(AN3965)。1 ?0 c, Q' t& G8 }8 o

8 Y+ z0 {; h# L* x* P( I( m7 L
1.2 写保护
/ {% P0 ?# s  {, |2 K+ j写保护用来保护指定扇区内容,避免代码更新或擦除。这种保护可应用于扇区。
+ E: C. n. `$ T3 m0 j& D+ s任何写请求都会产生一个写保护错误。如果要擦除/编程的地址属于闪存中处于写保护状态的区域,则通过硬件将WRPERR标志置位。7 R% P' I0 l* E6 `8 m2 b  `/ j" q
例如,如果闪存中至少有一个扇区是写保护的,则不能对其进行批量擦除,并且WRPERR标志置位。, y/ i! r) J4 ^" j1 Y! H3 K# J+ A7 w: |
要激活每个闪存扇区 i 的写保护,可使用一个选项位nWRPi。当设置扇区 i(选项位nWRPi = 0)为写保护时,该扇区不能被擦除或编程。: \0 M$ n( ]; D  W6 b) E
可通过嵌入式用户代码或使用STM32 ST-Link Utility软件和调试接口,进行使能或禁用写保护管理。: b" _2 E. X6 a# K; w+ {, V0 \- N

  q3 B. f) F7 S& q3 B8 h( d8 {9 y1.3 专有代码读保护(Proprietary Code Read Out ProtectionPCROP
( N+ J3 [! B5 K9 H8 a1.3.1 PCROP保护概述0 J& T( \2 W# Z% D
PCROP是闪存中IP-code的读写保护。PCROP应用于扇区(0至7),保护专利代码不被最终用户代码、调试器工具或RAM Trojan代码修改或读取。/ w% \: U: N4 h* J) N4 Y
通过ITCM或A**线对PCROP扇区的任何读访问(获取操作除外)都会触发:9 D# B: q. E  M/ x; G: ?( j
给定总线上出现总线错误/ `9 M3 @8 J' y6 _1 i2 h$ C) o
FLASH_SR状态寄存器中RDERR标志置位。如果FLASH_CR寄存器中读错误中断使能位(Read Error Interrupt Enable,RDERRIE)置位,也会生成一个中断。0 @" z2 A9 a0 L, j( {
任何对PCROP扇区的编程/擦除操作都会触发WRPERR标志错误。* {1 E5 _: y6 S1 W/ F5 Y
受保护的IP-code可以很容易地被最终用户应用程序所调用,并且仍能受到保护,不可直接访问IP-code本身。PCROP不会阻止执行受保护的代码。
0 [$ V; i: ]* Q& ?
- f3 [) k$ l0 s* f$ T, @; n
注意: 3 i! e. t  m2 C$ s$ d
虽然对PCROP扇区的读访问会产生总线错误,但读错误中断可被硬故障错误中断或总线故障错误中断所屏蔽。要使用读错误中断,必须将总线故障错误中断优先级使能为低于读错误中断优先级。/ c! g; p' r' k. _" t2 g( o, s
/ w! k4 W3 D! Z& z1 d

3 `, X9 V4 }4 K2 h* ?* m G}}XI4Q6BZJOMM%1_3{RSP1.png , i" y2 X9 G( ]/ u
7 ~  U( D$ T3 r  `+ D
1.3.2 如何使能PCROP保护. _1 z4 r! O* W# T# O1 ~2 O
PCROP保护是逐扇区激活的,因此每个扇区可以单独作为PCROP扇区,并可以对附加扇区进行保护(当RDP设置为级别0或级别1时)。- `+ _2 ?; V* S% Z
PCROP保护通过FLASH_OPTCR2寄存器中的选项位PCROP来激活:
2 w' _4 K4 q- \8 a* o' }' CPCROP = 0:扇区i(i = 0,...,7)上的PCROP保护不被激活
% n, r, m* u( T* Z1 \, zPCROP = 1:扇区i(i = 0,...,7)上的PCROP保护被激活
) |8 c, H- r: @% z2 b$ _为了提高PCROP扇区的安全级别,在执行PCROP扇区中的代码时,所有调试事件都会被屏蔽。+ c% ?2 m  Y7 Y3 S" q1 ~* @
另有一个选项位(PCROP_RDP = PCROP1ER [15])可用来选择在RDP保护从级别1变为级别0时PCROP区域是否被擦除。
- C0 d. t! T; `$ }$ y$ g用来激活PCROP保护(PCROPi)的位和用来激活写保护nWRPi的其他位是独立的,因此可以同时存在一个写保护扇区和一个PCROP扇区。表 2显示了根据WRPi和PCROPi位的值,扇区i上会设置何种保护。

  ^' M8 X8 w8 H+ G0 V7 Z* Q3 i7 J' E/ r* j  y* B8 x, {* h
" T$ Y1 `" D$ P( ?8 G1 T7 }3 s3 k
KKISLII5$L]7VS9~R}7RY.png
( w( H: O( I/ Z+ R

$ N. V8 _2 y# ^) O. w& O# R注: 关于实现PCROP使能的更多详细内容,用户必须参考所提供的FW包(STEP1-ST_Customer_level_n project main.c文件)中所述的PCROP_Enable()函数。

( Y+ Y# H( o7 {) ~3 _* b: d; q" E# o& R& c/ n- N
1.3.3 如何禁用PCROP保护
1 c. R* Y; v# u4 @' u根据RDP级别,如果RDP级别为1或0,则PCROP保护可被禁用,但是如果RDP设置为级别2,PCROP不能被禁用。当RDP设为级别2,所有选项字节都会被冻结,不能修改。因此,PCROP保护的扇区不能再被擦除或修改,这样就成为永久性保护。禁用受保护扇区上PCROP的唯一方式是:
) q3 R9 P3 x+ B/ h# D清除对应扇区的PCROPi位(多个扇区可同时可进行)
1 ~/ O7 y) X0 v/ Z0 Z1 g实现从级别1退回到级别0
7 V7 d8 ]( d3 K% ?- f将PCROP_RDP位置位
/ }& z1 d0 t" K! a- H0 V7 p5 h) J如果PCROP_RDP位被置位,则执行主闪存的批量擦除,并根据PCROPi值,对应扇区的PCROP保护保持使能或禁用。) j0 M& u7 e9 x  w, L2 N0 W
如果PCROP_RDP位被清零,则完全批量擦除由部分批量擦除所代替,该部分页面擦除是对PCROP激活的存储区内进行连续页面擦除(PCROP保护的页面除外)。这样做是为了保持PCROP代码。

- M: s: |; R/ A( M/ G* |1 ]
8 v2 k# r/ B7 v; g" y4 U注: 允许从级别1退回级别0与修改PCROP_RDP位同时进行由于完全或部分批量擦除在选项修改前启动,所以使用的是当前PCROP_RDP位,而不是被编程的新PCROP_RDP位。$ m2 V/ ?: n: D' [

7 ]" I% Q' N1 T; d0 @# S. i7 O使用STM32-Link Utility2 E. s. Q/ W' M- T' q
应用程序开发过程中,用户可能需要禁用PCROP或全局RDP保护,而不必花时间开发或禁用保护功能。STM32 ST-LINK Utility工具是一个非常简单的禁用或使能保护的方式,利用调试接口如JTAG或SWD即可实现,而无需开发专门的功能。图 2显示如何修改选项字节。

% ^2 \2 ~: U! Z5 d4 A/ o
# S* Q6 Y; K( R6 X) o; d! [
8 ?( {. z$ I! ], X  m: q. }! S
W677STG__B{${T}9NP_MI3O.png
6 \# }) C- L5 d, S1 I# ?4 n1 R7 V! c- ~; x$ I
关于如何使用STM32 ST-LINK Utility软件的更多详细信息,用户须参考STM32 ST-LINK实用软件说明用户手册 (UM0892),可从www.st.com上获取。
( J% K$ y( X# m# P2 x$ U
4 s; j  k: t  i% y: F7 T
1.3.4 存放和执行PCROPIP-code
5 f. j3 C( t3 S9 n% o6 f如前所述,PCROP不会阻止执行受保护的IP-code,并且其函数可方便地被用户代码所调用。

" k% T/ r; H: ?& ?2 Z+ o% d$ A  W) SPCROP保护的扇区不被D-code总线读访问,这里重点指出,只允许进行代码执行(通过 Icode总线取指令),而禁止读取数据。因此,受保护的IP-code无法访问存储在同一区域的相关数据值(如文字池、分支表或常量,执行过程中它们通过D-code总线从闪存中取出)。+ {0 n' V. O  P  M
PCROP的代码必须是只可执行的代码,不能包含任何数据。& K8 o# A6 @# G% r: a$ I
用户必须配置编译器来生成只可执行的IP-code,并且避免任何数据读取,所需编译器配置在第 2节中有详细说明。

/ D! {. p! k8 [4 K" f$ r: ^& H* U
不可激活向量表扇区的PCROP保护
  c) }; U1 k* P) A: j; v! I中断向量表包含了每个中断处理程序的进入点地址,它们可由CPU通过D-code总线进行读取。通常中断向量表位于首地址0x08000000的第一个扇区(例外是在某些情况下,它会被重新定位到其他区域,如SRAM)。
0 d6 ^( C6 U3 Y' M$ I将代码置于闪存中进行保护时,必须遵守以下规则:
# C- l- ]2 n, M向量表所在的第一个闪存扇区不能是PCROP保护扇区
  C* N4 C: [  `+ U( KPCROP保护的代码不能位于第一个扇区中。
! L. J( c. H, h
: `0 q& q: j3 U& W
PCROPIP-code依赖关系7 n3 H8 q+ v2 p, L. j9 _+ p/ ^
受保护的IP-code可以从位于用户代码区域中以及PCROP保护区之外的库中调用函数。这种情况下,IP-code中包含了相关函数地址,允许PC(程序计数器)在执行IP-code时跳转到这些函数。一旦IP-code被PCROP保护,则这些地址不能更改。因此,每个调用函数必须位于(PCROP保护区域之外)PCROP保护IP-code中写入的相应固定地址,否则PC跳转到无效地址,IP-code无法正常工作。
) d- A4 e! `* H: m, ?1 S1 N要完全独立,受保护IP-code必须与其所有关联函数放在一起
/ I( F7 O$ u5 I图 3显示一个示例,其中PCROP保护的Function_A()调用位于PCROP保护区域之外的固定5 `$ i: X4 Y0 n; u
地址的Function_B()。 ( u6 {" w  M' z  M) P. l5 P

2 }! A7 [. C6 t- m) s  B# b( {
4@OO][5M[B7384CI{ZVS1.png $ d" {/ T) A/ i+ K

' \) P! g$ @* o* r8 Y( ~
( S. }: d- k' g
完整版请查看:附件" A. C* O' ^4 H6 K3 R% b4 O

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 手机版