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

STM32F1(Flash 读保护)

[复制链接]
XinLiYF 发布时间:2019-2-9 17:43
本帖最后由 XinLiYF 于 2019-2-9 17:45 编辑
" `% l( }' G/ \7 e- G( ?8 o1 q9 P1 e8 S( `" t! z1 j) N& E
STM32F1(Flash 读保护)& _. t# \) W5 f' l/ ~
1,目的
8 \9 ?# i, @0 p- M1 w5 |0 q1 H        在实际的产品发布中,如果不对储存在单片机 Flash 中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link 等)把 Flash 中的程序读取回来,得到 bin 文件或 hex 文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把 Flash 设置成读保护。
! K3 f7 q7 T7 y* @! ?2 U5 e. h3 w: H' o# w  `: K7 z  m" g
2,开发环境- c) P% A8 R1 s% ?" S5 m
        1,适用芯片:STM32F1 全部芯片4 H6 x8 g5 p# x9 c! ?) j
        2,固件库:STM32Cube_FW_F1_V1.6.1
* O2 |- s" O  e7 _* a        3,IDE:MDK5257 J& W) Z7 a4 s9 W3 p0 O9 A

8 K: R6 t$ J' `2 U) v! ~3,程序源码
0 `7 j& O" k4 O7 H5 S% N6 Z6 `" U0 K
  1. /**
    / ^  d; G  I/ G+ Q: ^
  2.   * @brief  Set flash read protection.: p) s  h7 F  p6 M
  3.   * @param  [in] state: Flash read protection state, true: enable protection, false: disable protection.% `  d  _# I( q
  4.   * @retval true:  Successful operation.; p8 Y4 e5 m$ }" c8 D2 A1 b+ \: A
  5.   * @retval false: Operation failed.
    % c; r6 _9 c* Y' x' l9 `
  6.   */+ |; z" x' J% C- u% O* w. j
  7. bool SetFlashReadProtection(bool state)/ E5 l2 E, j4 |& E
  8. {8 I4 ]+ P# P0 E2 a4 f
  9.   FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};/ ?% p. A1 Y$ g- @
  10.   HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);& i+ O) z& A$ v1 I7 x$ Z8 _
  11.   
    " u/ u" F' E* }
  12.   if(state == true)8 c" n9 H6 C/ @. v3 B2 \
  13.   {  ~; r, u( g( v+ R4 }
  14.     if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)/ E9 E. X/ [/ F9 b- K0 H
  15.     {8 n; T9 V% w0 v5 o+ U4 T) r- }8 w" y$ U
  16.       OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
    ! Z- Z) L( T8 e- Q0 T& X: `
  17.       OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_1;6 p& ^; \9 t9 V* b% I  B6 b
  18.       ) P) u1 f- r, s! W- B1 ~5 c. M
  19.       HAL_FLASH_Unlock();1 N# U( A* `! {+ G, }2 E
  20.       HAL_FLASH_OB_Unlock();
    $ |1 b2 _( [/ `. V$ z  P4 U4 o
  21.       
    " J; T' v  U0 M! B- e
  22.       if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)& |7 M0 X% T; z: L: J8 M
  23.       {
    * h+ D8 a& ^; F, `$ L4 I
  24.         HAL_FLASH_OB_Lock();2 T% F% C) W6 f# ]. [
  25.         HAL_FLASH_Lock();
    " P+ g+ M) ?% @1 l2 I5 a" U+ m  F
  26.         
    ) n& w9 y2 v* x7 C/ k6 S8 Q
  27.         return false;9 R$ ~0 q' m8 s! Z0 O4 e; ~
  28.       }
    0 `# F, |1 Y/ b' ]! U$ e: ?
  29.       - S5 `+ T) R/ {* Z( X2 u/ r9 H$ A1 P
  30.       HAL_FLASH_OB_Lock();
    ( v: c9 A0 x( @4 h0 o0 P1 {
  31.       HAL_FLASH_Lock();  R$ _8 Y2 C  Y
  32.     }
    ' u# _! Q, J0 Z" m5 D
  33.   }; o" I+ ?; R7 c' a
  34.   else9 l8 W" ]. O5 }5 d$ A) ]9 C+ }
  35.   {3 ]& C  Q, c" M+ n8 ~# Q
  36.     if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)3 a6 x- [1 |4 D: _; n; [
  37.     {
    . y- K' C7 M7 G
  38.       OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
    " b7 p3 t+ r) ~( ]
  39.       OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_0;
    $ c  J; w2 l; j
  40.       
    6 D1 a' k  `+ p" a0 d
  41.       HAL_FLASH_Unlock();
    / O( H# |  [1 ^4 h
  42.       HAL_FLASH_OB_Unlock();
    / q0 [/ q- }) e4 A# W- w0 c
  43.       
    / S0 e8 N# O, l
  44.       if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK). ~& d; x8 {. I- g$ ~/ |
  45.       {/ R& Q0 D( k9 p0 n5 o2 |, ~
  46.         HAL_FLASH_OB_Lock();
    & ^2 ^5 B/ M" I4 r2 R
  47.         HAL_FLASH_Lock();0 u/ Z' ^1 L1 u5 H, L$ A0 l4 n2 o7 E
  48.         
    ) E+ X4 y7 q  F& t0 Z% e* a
  49.         return false;
    3 c( L8 i; a. h0 Z( b
  50.       }
    ) q; M# y: Q& L. `; R
  51.       
    , I% U) @! |6 V  Q
  52.       HAL_FLASH_OB_Lock();% t, p* {( k) V, P6 k! \. V
  53.       HAL_FLASH_Lock();% H" Q. P1 p, i- F+ _4 w  g
  54.     }( h! `' c2 h( G$ m4 S1 a# p1 e  x( j7 ]9 A
  55.   }; l% t4 i, F$ p0 N; t
  56.     a, c7 w0 ~- w, L. ]
  57.   return true;
    0 }, l' G6 f$ S
  58. }
复制代码

# ]1 F& D9 S$ K, y7 q# U# y: x$ R' n% I2 D5 Y1 t4 A2 A& S2 ^
) H" q- _/ D/ e! g5 D
收藏 2 评论6 发布时间:2019-2-9 17:43

举报

6个回答
奏奏奏 回答时间:2019-2-10 08:46:00
我的疑问是Flash读保护后,是不是还可以调试DEBUG?
  T: ?8 J+ S3 z1 j& z还是说这么做了以后只能全部FLASH擦除后,才可以再次使用调试。
wudianjun2001 回答时间:2019-2-12 08:26:11
奏奏奏 发表于 2019-2-10 08:463 c. t, B" a8 ]5 x! t  @/ Q% g+ h
我的疑问是Flash读保护后,是不是还可以调试DEBUG?
1 h6 L- z- g- l还是说这么做了以后只能全部FLASH擦除后,才可以再次使 ...
+ {% i5 g5 b. u7 J- e
读保护以后不能DEBUG了,要不然保护就没用了。
5 H* @2 y' J$ V; V7 X7 \! y5 Q下次要擦FLASH以后才能再次使用
丿JC 回答时间:2019-2-15 09:29:32
学习 学习
any012 回答时间:2019-2-15 10:40:42
设置读写保护后,就不能用stlink调试了。用stlink解除读写保护时,会自动把flash全部擦除,好像是。
keijio 回答时间:2019-2-15 14:24:52
跟专用的工具有啥区别?% Z# p! P1 ?1 ]" k5 Q9 J& {
XinLiYF 回答时间:2019-2-20 14:58:24
keijio 发表于 2019-2-15 14:24& b7 m) _" X9 g/ m- @3 R# _
跟专用的工具有啥区别?
2 c4 q* U& Y3 `# w. z
量产的时候不需要专用的的工具进行加密。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版