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

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

[复制链接]
STMCU小助手 发布时间:2022-7-12 23:02
前言, V8 U0 t5 B! `2 V4 n# @# |- k3 T
软件提供商开发了复杂的中间件解决方案(知识产权代码,或IP-code), 保护它们对于微控制器而言至关重要。
/ @4 p9 T, E, d0 ^$ P! D$ W- L1 ~& W为了应对这一重要需求,STM32F72xxx和STM32F73xxx微控制器具有以下功能:
; f4 ~! k, j! d7 ^7 e* G• 读保护(RDP):防止进行读取操作' v" L1 d' ^: W5 W# v& K
• 写保护:防止进行不需要的写入或擦除操作: _# l! m. k: ~1 @/ G
• 专有代码读取保护:防止进行读写操作
( b3 Z8 K4 z% `" T/ e7 d  a本应用笔记对这些闪存保护技术进行了说明,重点是STM32F72xxx和STM32F73xxx微控制器上的专有代码读取保护,并提供了PCROP保护的基本示例。
! Z( U6 R4 F( l( h本文档随附的X-CUBE-PCROP嵌入式软件包包含了PCROP示例的源代码,以及运行示例所需的所有嵌入式软件模块。
4 V+ P0 b( C" `& s$ Q( B* J本应用笔记必须同STM32F72xxx和STM32F73xxx 基于ARM®的高级32位MCU的参考手册(RM0431)一起阅读,数据手册可以在www.st.com上获取。* o6 ?# u0 k/ m6 ?, S) n  l

" x6 O1 r3 D, |- J8 q/ Q& r) A

# S/ d7 }( J2 h: I1 存储器保护说明
1 u0 N0 b8 N8 u5 P' |1.1 读保护(RDP)( c$ s5 \* p/ g$ b7 V6 f
读取保护是全局闪存读保护,可保护嵌入式软件代码,避免复制、逆向工程、使用调试工具读出或其他方式的入侵攻击。该保护必须在二进制代码载入嵌入式闪存后,由用户进行设置。
, `2 s; W: M/ X1 j* I4 m以下章节中对三个RDP级别(0,1和2)进行定义和描述。: u/ k  @, V! Y& U8 D$ m; y
1.1.1 读保护级别0
% o6 ]+ y9 |+ O  f: g2 x级别0是默认级别,闪存完全打开,可在所有引导配置(调试功能,从RAM、从系统内存引导加载程序或从闪存启动)下进行全部内存操作。这种模式下,没有保护,该模式用于开发和调试。+ i# b4 J) J, a  `0 k, @8 J( T

( y# e& C+ U4 B# `$ |% M% Q: h

  n9 D) i/ W# p3 S' r& d! l1.1.2 读保护级别1' e; N% X3 q1 M1 n" `5 D# j
激活读保护级别1时,即使是从SRAM或系统内存引导加载程序来启动,也不能使用调试功能(如串行线路或JTAG)访问(读取,擦除和编程)闪存或备用SRAM。3 [) e; Z9 F7 U0 s8 n0 r2 |
但是,当从闪存启动时,允许用户代码访问Flash存储器和备用SRAM。 9 X7 O  u/ J6 t+ M8 L0 I3 E! k
将RDP选项字节重新编程为级别0,可禁用RDP级别1保护,这会导致批量擦除。* i0 J/ g2 r: g2 ]; W
" J* U8 q* o* f4 p

* y0 @" \8 L1 S9 H1.1.3 读保护级别23 s. q4 K% d! l) }, x
激活RDP级别2时,级别1所支持的所有保护均有效,芯片受到全面保护。RDP选项字节和所有其他选项字节都会被冻结,不能再修改。JTAG、SWV(单线查看器)、ETM 和边界扫描被禁用。
+ U+ }0 S- U0 `从闪存启动时,用户代码可以访问内存内容。但是,不再能从SRAM或从系统内存引导加载程序启动。3 `+ z, x4 K/ P- N$ `7 s  X* r3 o
这种保护是不可逆的(JTAG熔断),所以不能回到保护级别1或0。
$ }4 k# d8 a( Z% ^表 1描述了从内部闪存启动,或在调试,或从SRAM或系统内存引导加载程序启动时,对闪存、备用SRAM、选项字节和一次性可编程字节(OTP)的不同访问。5 R$ T1 A- p! Y# B" ?4 z: i+ [* u8 @
3 [( u! a2 c7 c; ~/ [
0 T! z( `1 W2 P
3AHBSF%Y176JIO(JIYYN5YE.png - m" B5 G% D! j9 q. Y

+ u3 h6 L4 H" X% v; @/ w1.1.4 STM32F72xxx和STM32F73xxx RDP保护下的内部闪存内容更新
" K# o1 E) H0 U* `& Z当RDP保护激活时(级别1或级别2),内部闪存内容不能通过调试进行更新,当从SRAM或系统内存引导加载程序启动时也不能更新。
6 L/ u7 a, O" j& Y对最终产品的一个重要要求就是,能够将内部Flash存储器中的嵌入式软件升级为新的软件版本,添加新功能并修正潜在问题。
: v. u5 R8 E7 I$ R% X) p可通过实施用户专用嵌入式软件执行内部闪存应用内编程(In-Application Programming,IAP)来解决此需求。IAP使用通信协议(如USART)来实现重编程过程。
5 n5 x( ~) n4 A有关IAP的更多详细信息,请参阅www.st.com上提供的STM32使用USART进行应用内编程应用笔记(AN3965)。( J0 @9 O- Z! h) ]8 [

0 J$ o' R- f7 J. l+ t
1.2 写保护
! K& d8 m- y8 S1 ]. ?写保护用来保护指定扇区内容,避免代码更新或擦除。这种保护可应用于扇区。2 B3 g- ?: U4 C# y' t
任何写请求都会产生一个写保护错误。如果要擦除/编程的地址属于闪存中处于写保护状态的区域,则通过硬件将WRPERR标志置位。* s0 {' A; k( Q6 ?' N5 V6 R6 b
例如,如果闪存中至少有一个扇区是写保护的,则不能对其进行批量擦除,并且WRPERR标志置位。) E2 X" g" e, Y3 {+ W
要激活每个闪存扇区 i 的写保护,可使用一个选项位nWRPi。当设置扇区 i(选项位nWRPi = 0)为写保护时,该扇区不能被擦除或编程。* i2 P; [# G+ M+ r7 Z
可通过嵌入式用户代码或使用STM32 ST-Link Utility软件和调试接口,进行使能或禁用写保护管理。0 T  J1 |- w( |- g

. ?8 H4 }. _% Z5 D& w6 Y1 R1.3 专有代码读保护(Proprietary Code Read Out Protection,PCROP)
  [- e* i) ~5 O6 }- t1.3.1 PCROP保护概述
( g$ W" O% |0 ^PCROP是闪存中IP-code的读写保护。PCROP应用于扇区(0至7),保护专利代码不被最终用户代码、调试器工具或RAM Trojan代码修改或读取。
" ]; |; R5 r# k6 r; Q- r通过ITCM或A**线对PCROP扇区的任何读访问(获取操作除外)都会触发:
7 U$ O5 C: t1 L. z• 给定总线上出现总线错误
6 _: k+ d% e8 E3 p+ ]: P6 t! c! b• FLASH_SR状态寄存器中RDERR标志置位。如果FLASH_CR寄存器中读错误中断使能位(Read Error Interrupt Enable,RDERRIE)置位,也会生成一个中断。
: m! T; D& w/ M任何对PCROP扇区的编程/擦除操作都会触发WRPERR标志错误。+ |0 H4 C- H8 h2 q& a; H8 k/ k4 _
受保护的IP-code可以很容易地被最终用户应用程序所调用,并且仍能受到保护,不可直接访问IP-code本身。PCROP不会阻止执行受保护的代码。/ J3 S2 X* ?7 C7 ^9 a4 p  u
( D3 G. ]9 {( f! _+ w
注意: ) P3 N" d, R0 ~( x# X+ x
虽然对PCROP扇区的读访问会产生总线错误,但读错误中断可被硬故障错误中断或总线故障错误中断所屏蔽。要使用读错误中断,必须将总线故障错误中断优先级使能为低于读错误中断优先级。  N/ \! L- D. W" e

: U$ b2 |; Y2 C0 d% s
3 X4 a- e; @9 x7 M3 Z
G}}XI4Q6BZJOMM%1_3{RSP1.png
# v* N& U" y! K2 O, o" t. l; S8 |! Y/ y" e& B4 {
1.3.2 如何使能PCROP保护- ]4 c% I& s  p' _" U3 F
PCROP保护是逐扇区激活的,因此每个扇区可以单独作为PCROP扇区,并可以对附加扇区进行保护(当RDP设置为级别0或级别1时)。
! u# ^! O/ z7 y4 QPCROP保护通过FLASH_OPTCR2寄存器中的选项位PCROP来激活:& z* P5 _0 W2 d, v$ {8 s$ Y7 G) k! X
• PCROP = 0:扇区i(i = 0,...,7)上的PCROP保护不被激活
/ o( Q) J8 ?! ~) C• PCROP = 1:扇区i(i = 0,...,7)上的PCROP保护被激活* s( U% A) i* e  M& B" f: V
为了提高PCROP扇区的安全级别,在执行PCROP扇区中的代码时,所有调试事件都会被屏蔽。3 f2 u( K' `+ \: c
另有一个选项位(PCROP_RDP = PCROP1ER [15])可用来选择在RDP保护从级别1变为级别0时PCROP区域是否被擦除。7 i' U6 j( t, x$ W3 g
用来激活PCROP保护(PCROPi)的位和用来激活写保护nWRPi的其他位是独立的,因此可以同时存在一个写保护扇区和一个PCROP扇区。表 2显示了根据WRPi和PCROPi位的值,扇区i上会设置何种保护。
3 Y% J' a9 V, y! i( M8 i
( t( n1 J. L3 `* J6 ~
' P  e8 T- R) U$ p& g6 m- ^
KKISLII5$L]7VS9~R}7RY.png ; g0 C$ ?1 g# L& l

# w! O- s; n5 N注: 关于实现PCROP使能的更多详细内容,用户必须参考所提供的FW包(STEP1-ST_Customer_level_n project main.c文件)中所述的PCROP_Enable()函数。
6 i- w! p) ?" q4 \
; O7 n! Y- ]' t1 P3 h/ ?6 g2 W
1.3.3 如何禁用PCROP保护
1 c7 O6 W% I# C# N根据RDP级别,如果RDP级别为1或0,则PCROP保护可被禁用,但是如果RDP设置为级别2,PCROP不能被禁用。当RDP设为级别2,所有选项字节都会被冻结,不能修改。因此,PCROP保护的扇区不能再被擦除或修改,这样就成为永久性保护。禁用受保护扇区上PCROP的唯一方式是:
9 ?6 k$ o, U4 L& {& M+ }) ]• 清除对应扇区的PCROPi位(多个扇区可同时可进行)( J0 w- q4 a3 v" C% K& |
• 实现从级别1退回到级别0
$ Z* I# e+ O/ o0 I' u+ t• 将PCROP_RDP位置位! x) ^* q2 R& b+ f# p" z* [
如果PCROP_RDP位被置位,则执行主闪存的批量擦除,并根据PCROPi值,对应扇区的PCROP保护保持使能或禁用。
) k4 E( i9 y2 D0 A. s: Y" _如果PCROP_RDP位被清零,则完全批量擦除由部分批量擦除所代替,该部分页面擦除是对PCROP激活的存储区内进行连续页面擦除(PCROP保护的页面除外)。这样做是为了保持PCROP代码。
  G3 W; g& s) K, s
4 l" y4 q: u9 [
注: 允许从级别1退回级别0与修改PCROP_RDP位同时进行由于完全或部分批量擦除在选项修改前启动,所以使用的是当前PCROP_RDP位,而不是被编程的新PCROP_RDP位。' e2 N6 q  A3 r# l  P+ D
: s! Y; i& m* N8 c  s5 U
使用STM32-Link Utility) Y* t! c" H9 U7 H# G& @& i
应用程序开发过程中,用户可能需要禁用PCROP或全局RDP保护,而不必花时间开发或禁用保护功能。STM32 ST-LINK Utility工具是一个非常简单的禁用或使能保护的方式,利用调试接口如JTAG或SWD即可实现,而无需开发专门的功能。图 2显示如何修改选项字节。
$ ?8 ~5 Z* z0 w+ Q! a
7 ]8 J! Q% I* O: G; F. i  H
/ C8 i+ \* N# R& g) W
W677STG__B{${T}9NP_MI3O.png
3 t% L* ~" X( N5 x4 ^, Z, z; O) U
: g" w9 V9 k6 D7 p4 @1 E5 B  T关于如何使用STM32 ST-LINK Utility软件的更多详细信息,用户须参考STM32 ST-LINK实用软件说明用户手册 (UM0892),可从www.st.com上获取。

  ^3 k3 F# X5 Y# a5 ~: {7 c2 ?& r& r' j) v
1.3.4 存放和执行PCROP的IP-code
$ W/ s0 T7 y4 I- y' f+ {如前所述,PCROP不会阻止执行受保护的IP-code,并且其函数可方便地被用户代码所调用。

9 v1 t2 [- [3 jPCROP保护的扇区不被D-code总线读访问,这里重点指出,只允许进行代码执行(通过 Icode总线取指令),而禁止读取数据。因此,受保护的IP-code无法访问存储在同一区域的相关数据值(如文字池、分支表或常量,执行过程中它们通过D-code总线从闪存中取出)。
7 d8 F( Z1 |. k! ^+ r; WPCROP的代码必须是只可执行的代码,不能包含任何数据。
" S) F' b6 k. o# `6 H5 ~用户必须配置编译器来生成只可执行的IP-code,并且避免任何数据读取,所需编译器配置在第 2节中有详细说明。
6 ]: N! }0 j' Q* u

, R0 }* B1 h. n2 T! O
不可激活向量表扇区的PCROP保护9 S8 W' j2 F9 f6 G6 K
中断向量表包含了每个中断处理程序的进入点地址,它们可由CPU通过D-code总线进行读取。通常中断向量表位于首地址0x08000000的第一个扇区(例外是在某些情况下,它会被重新定位到其他区域,如SRAM)。
% q* ~" g4 b. L4 h7 g* z将代码置于闪存中进行保护时,必须遵守以下规则:
% r# |; s! M6 O- Z  x• 向量表所在的第一个闪存扇区不能是PCROP保护扇区2 R/ z  i' O. z/ Q, L  d2 d5 ^
• PCROP保护的代码不能位于第一个扇区中。
4 W% c/ h4 t- [; Z. K! R0 P4 L- l& k

: X" _/ ]/ P) Y. ^: M+ V0 R# t/ {, a
PCROP的IP-code依赖关系9 g9 H" k9 \' Q9 Y: O8 E# `! Q
受保护的IP-code可以从位于用户代码区域中以及PCROP保护区之外的库中调用函数。这种情况下,IP-code中包含了相关函数地址,允许PC(程序计数器)在执行IP-code时跳转到这些函数。一旦IP-code被PCROP保护,则这些地址不能更改。因此,每个调用函数必须位于(PCROP保护区域之外)PCROP保护IP-code中写入的相应固定地址,否则PC跳转到无效地址,IP-code无法正常工作。7 {: B5 M% r! J2 y" K! K( \
要完全独立,受保护IP-code必须与其所有关联函数放在一起。/ }1 v% t% U' d, h2 d9 m' F0 U  v
图 3显示一个示例,其中PCROP保护的Function_A()调用位于PCROP保护区域之外的固定6 q, [0 Q9 G4 H- M
地址的Function_B()。
( d3 j  ?4 F, @* ?! H' C
; [  }! x; d; N& y* X5 ^- ~% c
4@OO][5M[B7384CI{ZVS1.png 5 S; b; @# m( s  Z
$ _" W( Z& [2 A

5 Q; M; b/ e4 r+ X' G完整版请查看:附件8 w1 S: C- L! F3 a# S( A  o

DM00346619_ZHV1.pdf

下载

1.26 MB, 下载次数: 2

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

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版