本帖最后由 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- /**7 B2 ~) ?/ ^1 }$ I8 u6 n
- * @brief Set flash read protection.
4 [- H" h" G* c/ t* o- X+ ~ - * @param [in] state: Flash read protection state, true: enable protection, false: disable protection.1 e, K& ?) `$ c) t# H
- * @retval true: Successful operation.' d3 p5 K2 p5 R* a# E) c7 S/ o
- * @retval false: Operation failed./ q$ ^, `2 U1 y9 a" o
- */; t; J$ }4 a2 M+ }' @& A2 ]
- bool SetFlashReadProtection(bool state)3 _$ ?: m) C: {8 U
- {# Y2 s/ ]& P6 r% Q: l
- FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};6 k! r4 f# L! \! g6 t! D$ }
- HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);1 ^: Z: F/ B2 _2 O B
- 2 |: G1 Y ~! h
- if(state == true) a V% k. L1 `$ J' a4 a/ K& |
- {& s; T0 e0 K! d2 G+ K! S
- if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)
7 \9 @+ x7 C7 V8 g4 i! L7 M! j - {
/ A! Y8 f9 r' B, }+ K - OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;; z; s1 i& U% X4 H
- OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_1;8 G1 N4 y3 W' W8 z r5 Q
-
, E/ F) Z, p! f" d' R/ b - HAL_FLASH_Unlock();1 [3 v( R- p, G2 n( x# z# S& K4 l
- HAL_FLASH_OB_Unlock();/ ^ S+ A1 _. G& H9 D3 u" B
-
- x' P) W6 p, t$ @: S$ t! _ - if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)+ n6 D: t9 ]. U, d( o, D; l
- {
A& a) ~7 q% u9 T0 s) ?3 \ - HAL_FLASH_OB_Lock();
& B6 x! k- g. V d7 X - HAL_FLASH_Lock();
; J) Q# t0 \$ |. J* ` -
7 M7 g( @8 }3 a& r: ~$ l0 i - return false;
) T' k0 v0 B; v; s - }
% ]" Q% Y& G: `" O6 ~ - 0 g3 P4 e8 I: \: v( D# I1 {
- HAL_FLASH_OB_Lock();; w3 ^1 g; f3 J I h: r; |! n
- HAL_FLASH_Lock();
) e3 B9 \1 n% }8 m( m3 ?5 k" z - }
- x) ?4 M A6 m$ o, ^9 w; ]6 ] - }
% e4 f) _- r) A9 `2 ]& X9 Q - else7 K; `, f3 B' k2 {! g, O, }- D( n
- {2 ?) R! ~; L# `
- if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)/ F o: W: v8 n& I! A1 _1 Y
- {
$ `" U8 C1 {- d, |. w Y - OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;( C: Z5 u2 }7 @! C( R1 M* R
- OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_0;
0 z; \+ Z, ]+ L- h C% @5 a9 U -
. l& d' Z7 A$ U r5 m - HAL_FLASH_Unlock();. U8 s6 a2 ?& o3 H
- HAL_FLASH_OB_Unlock();
, Q/ A" n6 p5 t9 i! v+ l; S -
z# }3 J5 U: ~: T( B - if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)% p/ f" a! \$ Y4 n1 s
- {
4 H+ r0 J) G5 E; g( j. i - HAL_FLASH_OB_Lock();
! Q7 J$ C! R* B- m( X+ v - HAL_FLASH_Lock();) N% \5 {5 [. @2 X& ~' S
-
$ G" ^7 u/ v$ r. Y3 j* |" k - return false;$ Y/ y! l _5 z8 ^
- }
6 J3 f; _5 D p9 w6 D# ^ - % l/ N. x+ V/ }4 n! `5 C2 D5 V4 ^
- HAL_FLASH_OB_Lock();# w$ w& ]4 K. o% d, h* @
- HAL_FLASH_Lock();" o& {* f* R* c, ?1 K
- }" ^& N! H7 m: |4 P6 r
- }
* V6 K! C: r% L/ t -
1 y5 b0 h; G4 l7 |# @! G2 x2 h7 b5 ` - return true;
& f; d. J2 `* n% Z6 G - }
复制代码
9 F; O4 F8 b! U0 a* a: n6 C
6 D6 {2 H7 c* {" P6 [7 a3 N( q! D, e7 O: |
|
还是说这么做了以后只能全部FLASH擦除后,才可以再次使用调试。
读保护以后不能DEBUG了,要不然保护就没用了。
下次要擦FLASH以后才能再次使用
量产的时候不需要专用的的工具进行加密。