本帖最后由 XinLiYF 于 2019-2-9 17:45 编辑
" `% l( }' G/ \7 e- G( ?8 o1 q9 P1 e8 S( `" t! z1 j) N& E
STM32F1(Flash 读保护)& _. t# \) W5 f' l/ ~
1,目的
8 \9 ?# i, @0 p- M1 w5 |0 q1 H 在实际的产品发布中,如果不对储存在单片机 Flash 中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link 等)把 Flash 中的程序读取回来,得到 bin 文件或 hex 文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把 Flash 设置成读保护。
! K3 f7 q7 T7 y* @! ?2 U5 e. h3 w: H' o# w `: K7 z m" g
2,开发环境- c) P% A8 R1 s% ?" S5 m
1,适用芯片:STM32F1 全部芯片4 H6 x8 g5 p# x9 c! ?) j
2,固件库:STM32Cube_FW_F1_V1.6.1
* O2 |- s" O e7 _* a 3,IDE:MDK5257 J& W) Z7 a4 s9 W3 p0 O9 A
8 K: R6 t$ J' `2 U) v! ~3,程序源码
0 `7 j& O" k4 O7 H5 S% N6 Z6 `" U0 K- /**
/ ^ d; G I/ G+ Q: ^ - * @brief Set flash read protection.: p) s h7 F p6 M
- * @param [in] state: Flash read protection state, true: enable protection, false: disable protection.% ` d _# I( q
- * @retval true: Successful operation.; p8 Y4 e5 m$ }" c8 D2 A1 b+ \: A
- * @retval false: Operation failed.
% c; r6 _9 c* Y' x' l9 ` - */+ |; z" x' J% C- u% O* w. j
- bool SetFlashReadProtection(bool state)/ E5 l2 E, j4 |& E
- {8 I4 ]+ P# P0 E2 a4 f
- FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};/ ?% p. A1 Y$ g- @
- HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);& i+ O) z& A$ v1 I7 x$ Z8 _
-
" u/ u" F' E* } - if(state == true)8 c" n9 H6 C/ @. v3 B2 \
- { ~; r, u( g( v+ R4 }
- if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)/ E9 E. X/ [/ F9 b- K0 H
- {8 n; T9 V% w0 v5 o+ U4 T) r- }8 w" y$ U
- OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
! Z- Z) L( T8 e- Q0 T& X: ` - OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_1;6 p& ^; \9 t9 V* b% I B6 b
- ) P) u1 f- r, s! W- B1 ~5 c. M
- HAL_FLASH_Unlock();1 N# U( A* `! {+ G, }2 E
- HAL_FLASH_OB_Unlock();
$ |1 b2 _( [/ `. V$ z P4 U4 o -
" J; T' v U0 M! B- e - if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)& |7 M0 X% T; z: L: J8 M
- {
* h+ D8 a& ^; F, `$ L4 I - HAL_FLASH_OB_Lock();2 T% F% C) W6 f# ]. [
- HAL_FLASH_Lock();
" P+ g+ M) ?% @1 l2 I5 a" U+ m F -
) n& w9 y2 v* x7 C/ k6 S8 Q - return false;9 R$ ~0 q' m8 s! Z0 O4 e; ~
- }
0 `# F, |1 Y/ b' ]! U$ e: ? - - S5 `+ T) R/ {* Z( X2 u/ r9 H$ A1 P
- HAL_FLASH_OB_Lock();
( v: c9 A0 x( @4 h0 o0 P1 { - HAL_FLASH_Lock(); R$ _8 Y2 C Y
- }
' u# _! Q, J0 Z" m5 D - }; o" I+ ?; R7 c' a
- else9 l8 W" ]. O5 }5 d$ A) ]9 C+ }
- {3 ]& C Q, c" M+ n8 ~# Q
- if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)3 a6 x- [1 |4 D: _; n; [
- {
. y- K' C7 M7 G - OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
" b7 p3 t+ r) ~( ] - OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_0;
$ c J; w2 l; j -
6 D1 a' k `+ p" a0 d - HAL_FLASH_Unlock();
/ O( H# | [1 ^4 h - HAL_FLASH_OB_Unlock();
/ q0 [/ q- }) e4 A# W- w0 c -
/ S0 e8 N# O, l - if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK). ~& d; x8 {. I- g$ ~/ |
- {/ R& Q0 D( k9 p0 n5 o2 |, ~
- HAL_FLASH_OB_Lock();
& ^2 ^5 B/ M" I4 r2 R - HAL_FLASH_Lock();0 u/ Z' ^1 L1 u5 H, L$ A0 l4 n2 o7 E
-
) E+ X4 y7 q F& t0 Z% e* a - return false;
3 c( L8 i; a. h0 Z( b - }
) q; M# y: Q& L. `; R -
, I% U) @! |6 V Q - HAL_FLASH_OB_Lock();% t, p* {( k) V, P6 k! \. V
- HAL_FLASH_Lock();% H" Q. P1 p, i- F+ _4 w g
- }( h! `' c2 h( G$ m4 S1 a# p1 e x( j7 ]9 A
- }; l% t4 i, F$ p0 N; t
- a, c7 w0 ~- w, L. ]
- return true;
0 }, l' G6 f$ S - }
复制代码
# ]1 F& D9 S$ K, y7 q# U# y: x$ R' n% I2 D5 Y1 t4 A2 A& S2 ^
) H" q- _/ D/ e! g5 D
|
还是说这么做了以后只能全部FLASH擦除后,才可以再次使用调试。
读保护以后不能DEBUG了,要不然保护就没用了。
下次要擦FLASH以后才能再次使用
量产的时候不需要专用的的工具进行加密。