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

STM32F1(Flash 读保护)

[复制链接]
XinLiYF 发布时间:2019-2-9 17:43
本帖最后由 XinLiYF 于 2019-2-9 17:45 编辑
  d' q7 p9 S& n1 [: y3 D% i* }
) I9 C. t1 ?1 ~+ q* U
STM32F1(Flash 读保护)9 }$ B/ z0 J, {! L
1,目的
* T% ], \0 L2 |7 }# g9 L+ `6 M        在实际的产品发布中,如果不对储存在单片机 Flash 中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link 等)把 Flash 中的程序读取回来,得到 bin 文件或 hex 文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把 Flash 设置成读保护。9 I% \9 f. I$ R( g4 U( |: G) u' h

4 R; a, Q) l0 `0 y2,开发环境# ?7 {6 R$ w! v, d
        1,适用芯片:STM32F1 全部芯片
4 y0 ~6 j0 K8 s        2,固件库:STM32Cube_FW_F1_V1.6.1
2 E. v0 T1 e' x. l5 d3 w( `        3,IDE:MDK525
* t/ t) ]" [. m6 I9 F  k6 G& x! z  U0 h1 C) T' l
3,程序源码. y! b7 Z  v: z( t0 a
  1. /**: ~7 I" [! ^8 D
  2.   * @brief  Set flash read protection.
    6 ~. p$ Q% f% t
  3.   * @param  [in] state: Flash read protection state, true: enable protection, false: disable protection.
    1 F% V* c) W& \3 M% j3 t6 n
  4.   * @retval true:  Successful operation.
    % a( [# R0 a7 {5 E7 p0 W( t7 D1 C
  5.   * @retval false: Operation failed.
    ' |2 h6 r8 p: L9 H3 N
  6.   */6 V4 ?4 M4 k* _3 v# X5 R$ j
  7. bool SetFlashReadProtection(bool state)/ O% b" z5 H+ n: K) e* C* S6 C
  8. {9 S& A1 p% A7 e: ?* J. m
  9.   FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};
    5 n  {! p+ Z2 }0 A* R& Z8 G
  10.   HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);6 R- h/ |4 h' q( V, f
  11.   7 F2 k& G/ G- I. W  ^5 X8 ^
  12.   if(state == true)
    & [0 H) N, [0 F% M
  13.   {/ [* i5 @& a* V4 ~9 K. X- l5 p( d, ]
  14.     if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0). L$ z3 i7 n  X, G( }
  15.     {  s' ^; u* N9 T) p
  16.       OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
    3 m$ P! i4 U( _- A* _* G2 I
  17.       OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_1;
    ' W6 u' c9 y; B
  18.       : k& e5 c# |- t$ K
  19.       HAL_FLASH_Unlock();+ Y1 B% S5 D9 A) v
  20.       HAL_FLASH_OB_Unlock();; v7 R0 Z& E  ?* d. T$ S9 H6 C6 S
  21.       
    ) T, a0 V. G  h; N/ T1 L1 V$ S: S; \
  22.       if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)1 z/ ?# K2 \9 r
  23.       {" Q4 ~8 l: k3 f. x2 B2 u6 K+ ^- R6 u
  24.         HAL_FLASH_OB_Lock();  f9 A# ~( T! H1 l* [# e3 B$ u7 U
  25.         HAL_FLASH_Lock();
    + O4 j+ \% A9 a& Y. d
  26.         " [: g. u( V: {! o" ^+ G
  27.         return false;6 F/ [2 D8 {5 Q/ ?/ a
  28.       }
    " H2 \5 I$ A3 [7 H
  29.       
    $ ]5 ~0 N3 y' {, j
  30.       HAL_FLASH_OB_Lock();: [# M6 S2 f* Q- I
  31.       HAL_FLASH_Lock();( M" Y# g- @& M' W) C
  32.     }
    : e( i0 V3 a+ O! ^3 w
  33.   }) T  C$ s" S/ D. i$ W5 s
  34.   else/ l7 g2 z# Y" `2 M4 m' ?0 [
  35.   {1 ]2 n; |, ^! d8 Y7 N
  36.     if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)
    9 f8 W! A7 P5 T, U7 |
  37.     {
    " G- a2 p8 X$ D$ u) u8 |
  38.       OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
    6 {( V% A7 u4 K7 G
  39.       OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_0;5 z# o5 o3 c7 I0 S5 [, H
  40.       # s, f% N+ |9 }! ~4 D( K
  41.       HAL_FLASH_Unlock();
    . C7 Q7 A+ F8 L, M9 m& H% |( H8 {; q
  42.       HAL_FLASH_OB_Unlock();
      }: j! p; S8 s  M3 E
  43.       
    & g; J- r/ D2 P9 k  y" I6 [
  44.       if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)' \. k. N- q, l4 `# H" n* [
  45.       {
    5 y  H3 ?9 w8 B( d! x3 N4 O
  46.         HAL_FLASH_OB_Lock();
    ) Y0 V4 s: l* Q& L6 o( @3 _& F8 o5 l
  47.         HAL_FLASH_Lock();5 k, a- t5 S9 g& [
  48.         
    2 {/ p$ L. t8 k% X' L( ^
  49.         return false;
    3 [5 U* g; h" _# F) H: ~
  50.       }
    8 g/ f$ g8 }8 L) S
  51.       0 k) V" ], H, f5 L# O7 e7 f8 J
  52.       HAL_FLASH_OB_Lock();
    ) w- T" w* {, b- W. _* J: h
  53.       HAL_FLASH_Lock();/ t9 \# G/ e7 V" m: Y3 K0 k. [
  54.     }
    0 w/ {. o% L* q2 Z# O
  55.   }& S- i2 b& i1 a7 [; y
  56.   
    7 d# n5 k2 |4 X+ d7 o
  57.   return true;
    8 Z' K0 p& m) b- T. a9 l
  58. }
复制代码

' y; q; d/ P. w: G7 c) I
$ t2 G6 [& h" z4 F$ K
  J. A6 w, ^8 B3 n
收藏 2 评论6 发布时间:2019-2-9 17:43

举报

6个回答
奏奏奏 回答时间:2019-2-10 08:46:00
我的疑问是Flash读保护后,是不是还可以调试DEBUG?' ~7 M. n, N  [/ a. {% i
还是说这么做了以后只能全部FLASH擦除后,才可以再次使用调试。
wudianjun2001 回答时间:2019-2-12 08:26:11
奏奏奏 发表于 2019-2-10 08:46% c4 v$ x9 ^9 b8 `5 u$ q1 ?! I
我的疑问是Flash读保护后,是不是还可以调试DEBUG?
- m, p9 ^" ~/ _) I8 j4 v/ ^还是说这么做了以后只能全部FLASH擦除后,才可以再次使 ...

1 x- u" {# x" U1 ^3 Q% Z读保护以后不能DEBUG了,要不然保护就没用了。
" i6 W" V' {" ^3 H下次要擦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; s5 b" ?8 Z9 b# h2 O0 G! z
XinLiYF 回答时间:2019-2-20 14:58:24
keijio 发表于 2019-2-15 14:24
7 W. D2 A! T2 x8 ~& X跟专用的工具有啥区别?

& g) Q' S, e! {0 R+ N' ]' l量产的时候不需要专用的的工具进行加密。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版