本帖最后由 XinLiYF 于 2019-2-9 17:45 编辑 0 D& ?: B) }/ M# C( ]) I
/ H& Z6 r; H' O8 Z) s
STM32F1(Flash 读保护)
- _* h* D7 ~* c" e 1,目的
( D' `' P7 y4 O: @( f$ C' Z8 V. X 在实际的产品发布中,如果不对储存在单片机 Flash 中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link 等)把 Flash 中的程序读取回来,得到 bin 文件或 hex 文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把 Flash 设置成读保护。* J* p1 n7 Z! F* k# W4 y+ o4 v( ~
8 s, z- g3 s6 W+ N/ u
2,开发环境
6 W0 W! \8 m s* Q 1,适用芯片:STM32F1 全部芯片7 B! r+ h$ h: K4 m: G7 M
2,固件库:STM32Cube_FW_F1_V1.6.1
4 t. i4 k4 o! c* [ 3,IDE:MDK525) t2 o' ~, K) {; v# {
8 r8 O* z+ v8 H, E1 m" c$ V7 E3,程序源码$ y+ B4 [/ W) W, D
- /**2 m6 y( m- Q2 u* z
- * @brief Set flash read protection.
5 U- T4 h. g# l* B - * @param [in] state: Flash read protection state, true: enable protection, false: disable protection." Q; N. {& y+ t9 [% H
- * @retval true: Successful operation.
: h' J) |9 ~; l2 C) @) C+ w - * @retval false: Operation failed.( j+ o/ V9 m+ f3 ?8 Z! J
- */" i1 d) d' V( O) y7 L' L3 L
- bool SetFlashReadProtection(bool state)) ?- G5 U5 Y! }0 s5 ~$ s, _8 B. i
- {
6 Y5 r! f1 _: H6 B5 R. j% D4 |) } - FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};
: f& G$ m. b: f$ f$ M1 N- y8 R- e - HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
) |" c8 R7 L+ s8 @& Q- a - " X4 d8 X( Y- T, L7 v1 ~% Q. T0 N4 m
- if(state == true)" |5 L: \7 G8 O! j' B& w/ ?7 c
- {! s3 O, o5 @- z9 ]
- if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)
, _* f; e" t* `6 n6 r8 P - {' P. H; w# A3 R2 k3 \
- OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;. @- p) x: O$ J1 ]6 i5 h
- OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_1;
; f$ Z0 ^" Y' L+ P7 z7 O - ; O! x9 I+ z, t6 K
- HAL_FLASH_Unlock();7 G0 p" t' Q( |; [1 \( E
- HAL_FLASH_OB_Unlock();" g( ^3 W0 c# F/ k6 h# D
- . w" k. e8 w& m: z, O5 i4 A
- if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
% h/ k. V. R- C+ S2 ` - {
6 D8 w. J+ o- D7 `( ` - HAL_FLASH_OB_Lock();
! x1 T3 X6 v, S - HAL_FLASH_Lock();
: Y( U: @1 z2 ~) k5 O3 Q -
" ~7 \! ?- Q8 d8 H/ N - return false;
$ D. y; d# x/ `5 f% R - }9 N' x3 d: y% L5 c$ A* U; w
- # _& p3 E! Q. ?% E% d; F3 K
- HAL_FLASH_OB_Lock();* l, }# Y- J! v/ n# v `' Y
- HAL_FLASH_Lock();4 k+ f3 d$ N% s
- }1 s+ P* U2 E1 U5 k' N* j( D7 E& F+ U. e
- }
! ]' C- b- d! f2 i, V - else
3 H" ]. C" l: r7 q6 @) o K0 c - {
4 A7 l7 f! J. i0 }8 { - if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)
( H" K9 r+ Z9 o9 e- m2 g - {
1 k& R; [& k s+ a6 B - OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;& b" R$ T% Z6 x& ?+ S
- OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_0;
+ h. @) c" m2 G5 ` q, _4 p k - & }# H- h0 X: a
- HAL_FLASH_Unlock();
) G; t* N$ c. Y# s- d! G9 d - HAL_FLASH_OB_Unlock();$ g& I; U1 a4 s. d Z! ~& U
-
+ m/ D! ~, V) j - if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)! w# r( o& u3 q5 S" ]3 ]. e3 X0 _. w
- {
( x' g5 v' i3 i$ L! X - HAL_FLASH_OB_Lock();8 S' b+ J: M' V/ V
- HAL_FLASH_Lock();+ |" v: X# I x6 y- V
- # T7 y% C6 N7 x! p, j
- return false;. V# {9 j, \- k- I N# \) j1 H1 B
- }3 O7 i4 Z) d1 }
- - M+ ^) l q8 K4 X, P4 n* t6 ^! ?
- HAL_FLASH_OB_Lock();# }4 J( z( q" t, o3 B
- HAL_FLASH_Lock();2 t5 v) G0 z- H, U: J# E
- }. {6 ~: `$ q, a( W) E) |
- }
+ r! v! ]8 `4 Y$ W* Q* f -
3 P% |9 L. ^; t- Z0 I5 D - return true;, t, B0 j5 {6 [6 X
- }
复制代码 / M+ C' @ x2 G/ Z; Z
2 h+ m+ t) f9 O6 a! f: k$ a$ L( i3 u
7 O/ t( K& C1 P' U |
还是说这么做了以后只能全部FLASH擦除后,才可以再次使用调试。
读保护以后不能DEBUG了,要不然保护就没用了。
下次要擦FLASH以后才能再次使用
量产的时候不需要专用的的工具进行加密。