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

STM32F1(Flash 读保护)

[复制链接]
XinLiYF 发布时间:2019-2-9 17:43
本帖最后由 XinLiYF 于 2019-2-9 17:45 编辑
8 s' F+ {- P% k; [! r( K9 }/ l( s+ j# b4 a
STM32F1(Flash 读保护)
2 `# {8 ~- s- N. G
1,目的
' u( \9 \2 j' ]; @5 X- n* S1 o9 a        在实际的产品发布中,如果不对储存在单片机 Flash 中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link 等)把 Flash 中的程序读取回来,得到 bin 文件或 hex 文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把 Flash 设置成读保护。
1 a9 ~7 O8 i1 Q* a7 r- H' a) Z
3 j1 H4 z* u1 ~) U+ ?" o1 X2,开发环境
# ~  i5 r. p* a5 C1 u5 ~& ^        1,适用芯片:STM32F1 全部芯片
2 H5 a& {  D& [" P7 j( P* S8 y; X4 z        2,固件库:STM32Cube_FW_F1_V1.6.1
- x% m1 m; d/ r- z' h        3,IDE:MDK525. s) J# e( C- f8 R0 Y

. [" i! j$ i  \3,程序源码
# \! D# Y7 i# z: Z: z$ u4 l
  1. /**7 B2 ~) ?/ ^1 }$ I8 u6 n
  2.   * @brief  Set flash read protection.
    4 [- H" h" G* c/ t* o- X+ ~
  3.   * @param  [in] state: Flash read protection state, true: enable protection, false: disable protection.1 e, K& ?) `$ c) t# H
  4.   * @retval true:  Successful operation.' d3 p5 K2 p5 R* a# E) c7 S/ o
  5.   * @retval false: Operation failed./ q$ ^, `2 U1 y9 a" o
  6.   */; t; J$ }4 a2 M+ }' @& A2 ]
  7. bool SetFlashReadProtection(bool state)3 _$ ?: m) C: {8 U
  8. {# Y2 s/ ]& P6 r% Q: l
  9.   FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};6 k! r4 f# L! \! g6 t! D$ }
  10.   HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);1 ^: Z: F/ B2 _2 O  B
  11.   2 |: G1 Y  ~! h
  12.   if(state == true)  a  V% k. L1 `$ J' a4 a/ K& |
  13.   {& s; T0 e0 K! d2 G+ K! S
  14.     if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)
    7 \9 @+ x7 C7 V8 g4 i! L7 M! j
  15.     {
    / A! Y8 f9 r' B, }+ K
  16.       OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;; z; s1 i& U% X4 H
  17.       OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_1;8 G1 N4 y3 W' W8 z  r5 Q
  18.       
    , E/ F) Z, p! f" d' R/ b
  19.       HAL_FLASH_Unlock();1 [3 v( R- p, G2 n( x# z# S& K4 l
  20.       HAL_FLASH_OB_Unlock();/ ^  S+ A1 _. G& H9 D3 u" B
  21.       
    - x' P) W6 p, t$ @: S$ t! _
  22.       if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)+ n6 D: t9 ]. U, d( o, D; l
  23.       {
      A& a) ~7 q% u9 T0 s) ?3 \
  24.         HAL_FLASH_OB_Lock();
    & B6 x! k- g. V  d7 X
  25.         HAL_FLASH_Lock();
    ; J) Q# t0 \$ |. J* `
  26.         
    7 M7 g( @8 }3 a& r: ~$ l0 i
  27.         return false;
    ) T' k0 v0 B; v; s
  28.       }
    % ]" Q% Y& G: `" O6 ~
  29.       0 g3 P4 e8 I: \: v( D# I1 {
  30.       HAL_FLASH_OB_Lock();; w3 ^1 g; f3 J  I  h: r; |! n
  31.       HAL_FLASH_Lock();
    ) e3 B9 \1 n% }8 m( m3 ?5 k" z
  32.     }
    - x) ?4 M  A6 m$ o, ^9 w; ]6 ]
  33.   }
    % e4 f) _- r) A9 `2 ]& X9 Q
  34.   else7 K; `, f3 B' k2 {! g, O, }- D( n
  35.   {2 ?) R! ~; L# `
  36.     if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)/ F  o: W: v8 n& I! A1 _1 Y
  37.     {
    $ `" U8 C1 {- d, |. w  Y
  38.       OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;( C: Z5 u2 }7 @! C( R1 M* R
  39.       OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_0;
    0 z; \+ Z, ]+ L- h  C% @5 a9 U
  40.       
    . l& d' Z7 A$ U  r5 m
  41.       HAL_FLASH_Unlock();. U8 s6 a2 ?& o3 H
  42.       HAL_FLASH_OB_Unlock();
    , Q/ A" n6 p5 t9 i! v+ l; S
  43.       
      z# }3 J5 U: ~: T( B
  44.       if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)% p/ f" a! \$ Y4 n1 s
  45.       {
    4 H+ r0 J) G5 E; g( j. i
  46.         HAL_FLASH_OB_Lock();
    ! Q7 J$ C! R* B- m( X+ v
  47.         HAL_FLASH_Lock();) N% \5 {5 [. @2 X& ~' S
  48.         
    $ G" ^7 u/ v$ r. Y3 j* |" k
  49.         return false;$ Y/ y! l  _5 z8 ^
  50.       }
    6 J3 f; _5 D  p9 w6 D# ^
  51.       % l/ N. x+ V/ }4 n! `5 C2 D5 V4 ^
  52.       HAL_FLASH_OB_Lock();# w$ w& ]4 K. o% d, h* @
  53.       HAL_FLASH_Lock();" o& {* f* R* c, ?1 K
  54.     }" ^& N! H7 m: |4 P6 r
  55.   }
    * V6 K! C: r% L/ t
  56.   
    1 y5 b0 h; G4 l7 |# @! G2 x2 h7 b5 `
  57.   return true;
    & f; d. J2 `* n% Z6 G
  58. }
复制代码

9 F; O4 F8 b! U0 a* a: n6 C
6 D6 {2 H7 c* {" P6 [7 a3 N( q! D, e7 O: |
收藏 2 评论6 发布时间:2019-2-9 17:43

举报

6个回答
奏奏奏 回答时间:2019-2-10 08:46:00
我的疑问是Flash读保护后,是不是还可以调试DEBUG?
% M+ o% A) x  ^( J2 T还是说这么做了以后只能全部FLASH擦除后,才可以再次使用调试。
wudianjun2001 回答时间:2019-2-12 08:26:11
奏奏奏 发表于 2019-2-10 08:46/ i3 E  I; w! d# {+ b8 D
我的疑问是Flash读保护后,是不是还可以调试DEBUG?) P+ t+ a) z" E* j. t: j
还是说这么做了以后只能全部FLASH擦除后,才可以再次使 ...
0 U! m& A4 Y7 d! C! F9 B
读保护以后不能DEBUG了,要不然保护就没用了。
- K$ U4 u1 q8 t$ i. z" X下次要擦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
跟专用的工具有啥区别?
7 `6 L( B( n2 J/ J/ Q
XinLiYF 回答时间:2019-2-20 14:58:24
keijio 发表于 2019-2-15 14:24
, C9 P1 ]. @, h) [) W跟专用的工具有啥区别?
( X% E2 G* t2 r
量产的时候不需要专用的的工具进行加密。

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版