本帖最后由 XinLiYF 于 2019-2-9 17:45 编辑
d' q7 p9 S& n1 [: y3 D% i* }
) I9 C. t1 ?1 ~+ q* USTM32F1(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
- /**: ~7 I" [! ^8 D
- * @brief Set flash read protection.
6 ~. p$ Q% f% t - * @param [in] state: Flash read protection state, true: enable protection, false: disable protection.
1 F% V* c) W& \3 M% j3 t6 n - * @retval true: Successful operation.
% a( [# R0 a7 {5 E7 p0 W( t7 D1 C - * @retval false: Operation failed.
' |2 h6 r8 p: L9 H3 N - */6 V4 ?4 M4 k* _3 v# X5 R$ j
- bool SetFlashReadProtection(bool state)/ O% b" z5 H+ n: K) e* C* S6 C
- {9 S& A1 p% A7 e: ?* J. m
- FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};
5 n {! p+ Z2 }0 A* R& Z8 G - HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);6 R- h/ |4 h' q( V, f
- 7 F2 k& G/ G- I. W ^5 X8 ^
- if(state == true)
& [0 H) N, [0 F% M - {/ [* i5 @& a* V4 ~9 K. X- l5 p( d, ]
- if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0). L$ z3 i7 n X, G( }
- { s' ^; u* N9 T) p
- OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
3 m$ P! i4 U( _- A* _* G2 I - OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_1;
' W6 u' c9 y; B - : k& e5 c# |- t$ K
- HAL_FLASH_Unlock();+ Y1 B% S5 D9 A) v
- HAL_FLASH_OB_Unlock();; v7 R0 Z& E ?* d. T$ S9 H6 C6 S
-
) T, a0 V. G h; N/ T1 L1 V$ S: S; \ - if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)1 z/ ?# K2 \9 r
- {" Q4 ~8 l: k3 f. x2 B2 u6 K+ ^- R6 u
- HAL_FLASH_OB_Lock(); f9 A# ~( T! H1 l* [# e3 B$ u7 U
- HAL_FLASH_Lock();
+ O4 j+ \% A9 a& Y. d - " [: g. u( V: {! o" ^+ G
- return false;6 F/ [2 D8 {5 Q/ ?/ a
- }
" H2 \5 I$ A3 [7 H -
$ ]5 ~0 N3 y' {, j - HAL_FLASH_OB_Lock();: [# M6 S2 f* Q- I
- HAL_FLASH_Lock();( M" Y# g- @& M' W) C
- }
: e( i0 V3 a+ O! ^3 w - }) T C$ s" S/ D. i$ W5 s
- else/ l7 g2 z# Y" `2 M4 m' ?0 [
- {1 ]2 n; |, ^! d8 Y7 N
- if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)
9 f8 W! A7 P5 T, U7 | - {
" G- a2 p8 X$ D$ u) u8 | - OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
6 {( V% A7 u4 K7 G - OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_0;5 z# o5 o3 c7 I0 S5 [, H
- # s, f% N+ |9 }! ~4 D( K
- HAL_FLASH_Unlock();
. C7 Q7 A+ F8 L, M9 m& H% |( H8 {; q - HAL_FLASH_OB_Unlock();
}: j! p; S8 s M3 E -
& g; J- r/ D2 P9 k y" I6 [ - if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)' \. k. N- q, l4 `# H" n* [
- {
5 y H3 ?9 w8 B( d! x3 N4 O - HAL_FLASH_OB_Lock();
) Y0 V4 s: l* Q& L6 o( @3 _& F8 o5 l - HAL_FLASH_Lock();5 k, a- t5 S9 g& [
-
2 {/ p$ L. t8 k% X' L( ^ - return false;
3 [5 U* g; h" _# F) H: ~ - }
8 g/ f$ g8 }8 L) S - 0 k) V" ], H, f5 L# O7 e7 f8 J
- HAL_FLASH_OB_Lock();
) w- T" w* {, b- W. _* J: h - HAL_FLASH_Lock();/ t9 \# G/ e7 V" m: Y3 K0 k. [
- }
0 w/ {. o% L* q2 Z# O - }& S- i2 b& i1 a7 [; y
-
7 d# n5 k2 |4 X+ d7 o - return true;
8 Z' K0 p& m) b- T. a9 l - }
复制代码
' y; q; d/ P. w: G7 c) I
$ t2 G6 [& h" z4 F$ K
J. A6 w, ^8 B3 n |
还是说这么做了以后只能全部FLASH擦除后,才可以再次使用调试。
读保护以后不能DEBUG了,要不然保护就没用了。
下次要擦FLASH以后才能再次使用
量产的时候不需要专用的的工具进行加密。