请选择 进入手机版 | 继续访问电脑版

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

STM32F1(Flash 读保护)

[复制链接]
XinLiYF 发布时间:2019-2-9 17:43
本帖最后由 XinLiYF 于 2019-2-9 17:45 编辑
4 D" w# w" X4 p  M+ P0 ~# ^, [/ ~( o& o3 I4 f5 q( Y7 X
STM32F1(Flash 读保护)
# l* F" A, e* o  U
1,目的
9 l: A( W- l! V2 B' k  b7 y* z        在实际的产品发布中,如果不对储存在单片机 Flash 中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link 等)把 Flash 中的程序读取回来,得到 bin 文件或 hex 文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把 Flash 设置成读保护。" d0 J7 ?+ m3 n. v

/ c5 {$ F, K" Z+ h- o2,开发环境
3 o) a- B; y# E+ y4 ?: H        1,适用芯片:STM32F1 全部芯片
* l( V" q& R! N/ }0 g* g        2,固件库:STM32Cube_FW_F1_V1.6.1
3 R9 O( B" `8 F# X        3,IDE:MDK525
4 x5 O# M' K) M# t0 r: c' p3 I3 Q5 y
3,程序源码
9 v" I& m& a, q( ~% }
  1. /**. D9 |/ I4 |" _* m4 F) J
  2.   * @brief  Set flash read protection.! w3 N6 U) j  |, _8 V
  3.   * @param  [in] state: Flash read protection state, true: enable protection, false: disable protection.
    5 |6 b; s. e) o1 H
  4.   * @retval true:  Successful operation.
    8 x  A* F" ~2 M' A. Z
  5.   * @retval false: Operation failed.
    / T0 Z. _3 W7 J: u% J, E' ]+ [5 V
  6.   */* |7 q; I: d0 [8 k: _3 O% s
  7. bool SetFlashReadProtection(bool state)
    $ V' G( q' K# U& K; Q, P8 _
  8. {
    * B9 {9 a1 S9 k# }4 I
  9.   FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};2 e: B4 O: q( G! P' i" i
  10.   HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);* b5 h1 `/ K" o* k. |
  11.   " ~8 a# N2 p8 o( i
  12.   if(state == true)
    0 r+ ?" ~, n8 S4 }
  13.   {  z3 S8 A+ J3 [5 G1 i
  14.     if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)8 Z; ]  K: K! }) T" r4 Q
  15.     {
    - x( V# Z3 _# H
  16.       OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
    1 |1 P% @* M9 b+ M) D" q# W. {
  17.       OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_1;
    ' b; G9 ?5 [6 `5 V  d. L4 A9 S
  18.       
    2 l5 g; b. \( B, B7 g
  19.       HAL_FLASH_Unlock();
    ; o( Y' i6 G2 Q7 t) M
  20.       HAL_FLASH_OB_Unlock();' G2 Z) `. j9 Q% I0 X) m
  21.       
    , R3 q+ P7 \4 P4 S. B
  22.       if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)2 @  e4 f5 H! _# j5 D# u2 v
  23.       {
    1 {3 v9 M9 M: ]1 ?, S5 v1 H# p
  24.         HAL_FLASH_OB_Lock();8 V, a  {% g8 c8 v5 @& Z
  25.         HAL_FLASH_Lock();7 `- T" Y# w  I$ G4 [1 s2 \: f
  26.         
    ! ^% p/ F7 @3 j* {6 k
  27.         return false;4 t+ _9 ?, J  l5 Y1 [# y! c
  28.       }
    $ t4 K5 p, m! M' T8 z
  29.       
    6 c! w9 F$ m. Y+ n- z
  30.       HAL_FLASH_OB_Lock();
    " m8 O; i" l2 V4 M3 y
  31.       HAL_FLASH_Lock();
    - H/ R5 J9 Z& D6 x5 z
  32.     }
    ; e6 M' W9 Q1 a0 D8 h' F& G! @5 M: V
  33.   }
    $ O! R( R) K- v/ \+ o% G
  34.   else
    1 e# m* i4 q4 |3 |5 y
  35.   {* `: @$ X# z% W; S  E
  36.     if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)
    9 O8 U; R& W- f- O1 Z
  37.     {5 Q6 v# h8 \  K! N  H
  38.       OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
    ' ?2 M3 j3 ]+ w9 a. \0 ?" r+ z6 X
  39.       OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_0;
    ; q, f. ?' `7 |1 U  m
  40.       
    - A5 D( w) C. t. I
  41.       HAL_FLASH_Unlock();
    # e2 j7 W, G, z( ~
  42.       HAL_FLASH_OB_Unlock();: T( Y4 Q8 Q- ?& W7 q! c, W: s! _
  43.       / C- o+ P7 G# |$ Q1 z$ z
  44.       if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
    0 s0 [* g% U/ D5 q
  45.       {! {5 V& A) u2 w& }) y! U
  46.         HAL_FLASH_OB_Lock();: s+ d1 Q. b# W0 F" n8 I1 [1 X' E
  47.         HAL_FLASH_Lock();
    6 c) |3 L/ {$ y, J7 X
  48.         # R1 P2 L1 s9 Y8 {; w
  49.         return false;
    * `& \: N0 R  X( ]9 b3 J
  50.       }% {" w1 ^% L( I* g4 Q
  51.       
    4 p4 ~! e! z- _. F1 F3 H
  52.       HAL_FLASH_OB_Lock();
    ! G5 c) \% P5 B1 \! e1 k7 i
  53.       HAL_FLASH_Lock();
    5 r/ K, y3 H; D) z3 i  ?
  54.     }+ D" F. s6 \$ ?+ i. c& M( }9 B
  55.   }
      h( t# J) o( L* K, S: [7 d
  56.   
    * p( X, F2 ?$ p; Q3 m
  57.   return true;' E7 O4 h* K  n- }" \
  58. }
复制代码
4 s+ N- M$ r# p2 T/ m+ \: Q3 D
2 n  E/ n1 o) `. N

4 Y& s7 {: R: ~& E7 O( B, _
收藏 2 评论6 发布时间:2019-2-9 17:43

举报

6个回答
奏奏奏 回答时间:2019-2-10 08:46:00
我的疑问是Flash读保护后,是不是还可以调试DEBUG?- \" s- [% ^3 u$ x5 H/ y6 z
还是说这么做了以后只能全部FLASH擦除后,才可以再次使用调试。
wudianjun2001 回答时间:2019-2-12 08:26:11
奏奏奏 发表于 2019-2-10 08:46
9 h- C2 y9 @% N. o7 i我的疑问是Flash读保护后,是不是还可以调试DEBUG?
8 q7 R5 T4 R' J还是说这么做了以后只能全部FLASH擦除后,才可以再次使 ...

4 U( E* h- t+ H9 T读保护以后不能DEBUG了,要不然保护就没用了。; A" J! |# @( M! O  M: 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
跟专用的工具有啥区别?  X# b- V6 Y0 x- i0 j- v
XinLiYF 回答时间:2019-2-20 14:58:24
keijio 发表于 2019-2-15 14:24
4 u' U/ S7 D' M, V# A跟专用的工具有啥区别?

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