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

STM32F4(Flash读保护)

[复制链接]
XinLiYF 发布时间:2018-2-2 21:35
STM32F4(Flash读保护)* N) ?1 r) O4 x5 N. B
& W! p9 G  Q8 ~/ e& U$ \+ p

! M9 F2 W/ _1 X转载来源:STM32F4(Flash读保护)7 d, ]& X$ y- V
& B  A1 X1 M: r% b
" i- \' f; v8 g* I; }! t5 l9 ]/ r
1,目的
/ g2 r; K2 m7 E' a        在实际的产品发布中,如果不对储存在单片机Flash中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link等)把Flash中的程序读取回来,得到bin文件或hex文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把Flash设置成读保护。6 @3 `# |' X( I8 V
6 i; o" j- ^: k5 {9 l: c( p. D
2,开发环境7 n% s" {& O4 b; e0 Y% ^
        1,适用芯片:STM32F4全部芯片" ?4 y% ]8 A  R$ g1 I& q2 a
        2,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0
. f& a! O# X7 M' P        3,IDE:MDK517
5 E. s, `& a+ R, C; D  x
( I) w7 B9 W6 ^/ K; H; S3,程序源码8 V9 @3 W. X9 ]; N
1 {9 a4 ?+ r/ i+ S
  1. /****************************************************************
    ( M$ N" V, X5 d5 k  k
  2. * Function:    Flash_EnableReadProtection
    0 }5 q0 ?! b4 h4 f8 z7 X" `% L
  3. * Description: Enable the read protection of user flash area./ r9 u1 L" {: E1 @: e) s* h
  4. * Input:
    4 p! B! C1 q$ ]( d' k' {
  5. * Output:
    " q0 ]( x& M) a! D( q  J( n
  6. * Return:      1: Read Protection successfully enable2 ?( A) {; P$ c9 ?! m
  7. *              2: Error: Flash read unprotection failed
    $ [. P6 L6 M, a% f
  8. *****************************************************************/
    & P  f) z# ]. ^6 A$ _
  9. uint32_t Flash_EnableReadProtection(void)
    8 B0 W8 `) a7 U" U$ ~
  10. {
    1 I- _! \& K+ p7 S  U0 S" v3 O( m
  11.   /* Returns the FLASH Read Protection level. */
    ( g( H" X2 N" Y% u* d; m5 Q0 P
  12.   if( FLASH_OB_GetRDP() == RESET )
    + S& A: `6 [6 s- H
  13.   {
    % l4 U4 z: g3 Y1 p3 e6 B
  14.     /* Unlock the Option Bytes */( G2 M% o5 t# B3 o3 O
  15.     FLASH_OB_Unlock();
    1 H9 ?- }, U2 q
  16.    
    , |( S, N- ?( M( ?+ r, W4 H
  17.     /* Sets the read protection level. */
    ( M2 P; }. \& [3 L8 g
  18.     FLASH_OB_RDPConfig(OB_RDP_Level_1);) B* H+ f) T" ]; `: N
  19.    
    # H! ], k& a  L) K
  20.     /* Start the Option Bytes programming process. */  ' [8 B3 Y6 y2 V. @; c+ ~
  21.     if (FLASH_OB_Launch() != FLASH_COMPLETE)
    * v* w/ o- w- l1 p' L- \
  22.     {
    - J& {! X! N0 T% U
  23.       /* Disable the Flash option control register access (recommended to protect
    3 [8 K. d) w8 Z8 Q/ ?
  24.          the option Bytes against possible unwanted operations) */
    , j  L# r9 W  H* [' q& k" o/ s. h: ]
  25.       FLASH_OB_Lock();6 W) ~4 z' n3 L/ Y
  26.       2 E4 @! ~( }4 z' m! n9 c
  27.       /* Error: Flash read unprotection failed */( K; H: ^3 m$ A( K2 c' K( n
  28.       return (2);. T1 ?  P2 I) B$ l
  29.     }3 z  C9 l2 J  L( z
  30.   - m/ C; w8 Q0 @5 C2 q: r
  31.     /* Disable the Flash option control register access (recommended to protect 5 \0 d$ m1 f; P* C) _& [8 S* f" Q* E4 a8 V
  32.        the option Bytes against possible unwanted operations) */! a9 i1 r% E+ @) p, L5 i2 y
  33.     FLASH_OB_Lock();
    $ i# }) Y, x2 m5 @/ T3 B

  34. ! M* n# R3 {' }' g. v
  35.     /* Read Protection successfully enable *// |+ y  F) F8 P- u" @
  36.     return (1);
    ! `# I) f! Z* P" N$ q" s9 q
  37.   }
    0 y' o+ T) b0 k- \/ m+ F: z6 |, e
  38.   ) K  V& B! P$ f2 E8 {) I
  39.   /* Read Protection successfully enable */" a8 U, X5 J8 h; T
  40.   return (1);
    " i1 c& L# x  x, i9 V
  41. }
    - h1 o0 Z# v  u. r& D

  42. / [0 {7 C" @$ U8 E* C& I$ H
  43. /****************************************************************
    , H* X5 J4 r- ?
  44. * Function:    Flash_DisableReadProtection
    - j* d# h! T3 M
  45. * Description: Disable the read protection of user flash area.1 U- Q% Q/ b7 B: g6 b+ j5 t' j2 o
  46. * Input:$ N9 A- I& f+ z
  47. * Output:0 E$ [# F! P  M# x
  48. * Return:      1: Read Protection successfully disable8 \$ r  q4 _0 ~+ {
  49. *              2: Error: Flash read unprotection failed
    , U+ f$ P& k" W7 _6 A# K
  50. *****************************************************************/* R7 e" Q( F! r' R# D
  51. uint32_t Flash_DisableReadProtection(void)
    * F+ x+ _' {: C' z6 q0 i
  52. {; I' p1 u8 w9 @3 I! T+ [) W4 A
  53.   /* Returns the FLASH Read Protection level. */8 k; n4 O, _6 T4 [! W
  54.   if( FLASH_OB_GetRDP() != RESET )
    3 i! p+ X" n( |% J
  55.   {/ K* T, t) a1 Y) p+ d
  56.     /* Unlock the Option Bytes */
    9 |* ]( y1 p. m: d  }9 w& e7 E
  57.     FLASH_OB_Unlock();+ U, J) F' [5 b: a/ C+ M, h) d
  58.     * j( B* l4 c: m9 K. ~! {) b9 {
  59.     /* Sets the read protection level. */
    5 \6 H2 i" Q/ L- l: F' X1 q8 N
  60.     FLASH_OB_RDPConfig(OB_RDP_Level_0);
    % e# w. ?8 q; `- S) z; c* O$ i% e
  61.     4 o6 _+ Y7 G8 X2 S/ @4 P8 a
  62.     /* Start the Option Bytes programming process. */  
    4 i) ^) C7 F5 L6 q
  63.     if (FLASH_OB_Launch() != FLASH_COMPLETE)7 |: {, n6 Q( \& M* s
  64.     {6 v( l6 R7 G( n/ Z. l, ?  o
  65.       /* Disable the Flash option control register access (recommended to protect ' R& `. M7 t2 y
  66.          the option Bytes against possible unwanted operations) */7 t9 [" x8 J; o
  67.       FLASH_OB_Lock();
    3 R" w/ V6 _! O$ d$ r' s
  68.       4 Z  w/ f* V- A7 W/ c/ W- l
  69.       /* Error: Flash read unprotection failed */
    ' [- j7 a8 e- X$ G# |8 W6 X6 a' k
  70.       return (2);
    " @* W$ q0 @/ Z5 \4 H# r
  71.     }
    ) S# N; x& {& k# b) E
  72.   
    3 i: |* k! R, w+ T. C
  73.     /* Disable the Flash option control register access (recommended to protect 0 P# n' I* D# B( d
  74.        the option Bytes against possible unwanted operations) */- W7 M* M  K, C4 d# l8 L
  75.     FLASH_OB_Lock();1 a, O5 P  j6 U

  76. / Y( J2 }  O  L5 g& |- n" X) V
  77.     /* Read Protection successfully disable */& \- `* f2 G: g% \, F, t
  78.     return (1);! T: o/ K8 c+ h  A: X
  79.   }
    ! _' d: g# j+ t3 H7 @+ r" v
  80.   
      D& l/ v$ n" W9 R! [
  81.   /* Read Protection successfully disable */- I3 @4 _1 |% n# F
  82.   return (1);
      T; W- V5 [1 Z4 K+ m
  83. }
复制代码

- @1 _; E: ^* j! W& t  V- {
# E; H2 |: X  `9 j0 M# f! R6 Z

评分

参与人数 1 ST金币 +2 收起 理由
努力的人 + 2 可以对程序录一个简短的视频进行讲解一下.

查看全部评分

收藏 2 评论9 发布时间:2018-2-2 21:35

举报

9个回答
maxtch 回答时间:2018-2-3 00:56:27
一般来说不要直接在程序代码里面这么写,而是生产烧录完成之后有生产烧录设备来操作。要不然如果在开发设备上这么折腾一下芯片就不能做开发了。
奏奏奏 回答时间:2018-2-3 07:39:35
maxtch 发表于 2018-2-3 00:56
1 s( t' U: r* k一般来说不要直接在程序代码里面这么写,而是生产烧录完成之后有生产烧录设备来操作。要不然如果在开发设备 ...
" |! t; ^- h0 i. m1 c1 ^/ {1 E& F, O
是不是如果就这么将LZ提供的代码放进去的话就无法对产品进行软件升级了?9 A1 ~" i* u2 }2 F! A* F
比如说产品早期推出的时候有BUG,后期发现可以通过(例如说)产品接口的串口进行软件升级解决。但是由于进行Flash读保护,因此就无法实施了?
XinLiYF 回答时间:2018-2-3 08:57:25
奏奏奏 发表于 2018-2-3 07:39
0 E+ `4 j& a: A! ?; N是不是如果就这么将LZ提供的代码放进去的话就无法对产品进行软件升级了?1 Q& \0 Z8 Y/ R  d( n
比如说产品早期推出的时候有BUG ...
7 S/ \3 D! |6 V* m' y! }
捕获1.JPG
) S! a0 n) n: \  g3 P
捕获2.JPG

1 }$ F3 J9 [0 ?2 [. s: r) L
奏奏奏 回答时间:2018-2-3 09:44:52

* R$ \2 B1 x6 W+ z. V那么楼主提供的代码是属于哪个级别的操作?我觉得已经是级别2了,因为需要防止别人抄里面的程序。
时光虫子 回答时间:2018-2-3 10:28:48
对于专业芯片解密人来说这些都没有用的,现在破解方法太多了,相信伟大的华强北
XinLiYF 回答时间:2018-2-3 18:44:07
奏奏奏 发表于 2018-2-3 09:448 D8 h6 W) W. q( F
那么楼主提供的代码是属于哪个级别的操作?我觉得已经是级别2了,因为需要防止别人抄里面的程序。 ...

+ N. I" X( E; H7 P是等级1的,可以通过程序改为等级0,然后Flash中的程序就会被擦除,之后芯片就变成新的了,就可以使用仿真器了。如果把等级设置成2,就没有办法再修改等级了,仿真器接口直接熔断,只能通过boot升级程序了。
Tcreat 回答时间:2018-2-3 19:50:38
本帖最后由 Tcreat 于 2018-2-3 19:52 编辑
' u' m# _4 i, v) I! M4 [( w- A- M
# `# i  W6 b' ^  A+ f; d& ~6 [其实楼主的代码  根本就是官方的例程提供的  一开始自己都没详细的说明保护的机制和原理
cloudmr 回答时间:2018-3-25 15:58:45
Talons 回答时间:2019-4-7 09:03:35
时光虫子 发表于 2018-2-3 10:28% t' ]/ C0 `2 @7 K, |: p' k  y- T' d
对于专业芯片解密人来说这些都没有用的,现在破解方法太多了,相信伟大的华强北 ...

8 u/ T8 u. @, v0 i; Q) C* d解密要钱的啊,而且还不少,小众产品或者产品中有多芯片协同工作的,破解难度极大,可以交叉验证版本。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版