本帖最后由 XinLiYF 于 2019-2-9 17:45 编辑 ' e. _) g% |7 w" {
b+ ~; w# j' L
STM32F1(Flash 读保护)
; o4 i* t$ F' R0 S9 j1 `8 O 1,目的
! C! ~) J! D( v) a 在实际的产品发布中,如果不对储存在单片机 Flash 中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link 等)把 Flash 中的程序读取回来,得到 bin 文件或 hex 文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把 Flash 设置成读保护。) G3 \ l* Z1 C: G. [* R" U7 l
3 y8 i9 \% U1 n! B4 P2,开发环境
3 L' f& S1 d @. B 1,适用芯片:STM32F1 全部芯片
- v% T, K. z9 |& K/ W 2,固件库:STM32Cube_FW_F1_V1.6.16 C3 w5 \" l% A& V. T
3,IDE:MDK525
$ @& [- h, ~+ M! d' A! a. r5 ~# r1 |
3,程序源码2 m7 Z% B/ B( e+ f* h+ N/ T
- /**% E' x. O B# ~6 K
- * @brief Set flash read protection.
$ z( B% a2 Q) M - * @param [in] state: Flash read protection state, true: enable protection, false: disable protection.
8 ^9 m- i- @4 r8 \* N5 s3 O& F* T - * @retval true: Successful operation.
. c9 I8 c" i: ]! Y$ S# c; D4 f - * @retval false: Operation failed.
; h0 y& S j4 n$ U - */
9 R* b$ N" l- j4 z - bool SetFlashReadProtection(bool state)
% f" t- ]" A- d1 r: P - {
" A% ~/ Q" r# O) L. i4 ~. ^: ~! e' } - FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};
6 p, b: {1 [6 y/ \- c; _ o( `0 r* a - HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
& X, D, b* R# q) K S m5 ? N \ - : C- o. l+ d {& F
- if(state == true)
+ n+ p$ b3 w7 ~. [" ^8 Y2 \+ v - {
k* d( k8 Z# _/ i2 J" X5 b: N - if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)4 F, [0 P" H( D. y. E! ~
- { n3 ^0 Z/ `% `' R/ I& |1 m, }) x
- OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;5 Y5 ]2 Q; M, }
- OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_1;
" B" |7 j, `- \ ~1 l - 6 [- C0 k& d! p6 b) e9 {/ M
- HAL_FLASH_Unlock();
- x& b. E/ D. ? - HAL_FLASH_OB_Unlock();
* j& x, J, ~3 _2 R1 R9 A4 f" n+ f -
; l+ j {* o8 f$ n4 M z+ q7 H - if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
* q9 F# {% y; m1 m - {# F( R+ M7 d4 \! B; f' `1 z5 d7 _) L( F
- HAL_FLASH_OB_Lock();8 m7 p) Z& C/ \2 O4 S
- HAL_FLASH_Lock();
# X) ~' E, L& _' w; T1 k; O -
! e& Y( B- o: s0 P3 q0 G9 T - return false;) ]' P' q9 W) B" G, l. O
- }
1 I8 X/ I1 N0 Q! P - , B+ g- a4 O: b U
- HAL_FLASH_OB_Lock();
) \' Z4 c% [) d3 j5 ]' u - HAL_FLASH_Lock();
; f7 S: h `; Y0 r- t8 W# ], y9 |7 K - }2 z Y! x" Z( _$ y% G. w- o7 S
- }
! k8 x" p1 x, h! X2 t - else
9 e+ [5 l4 F& h" X, s( |. ] - {
: L! J* B8 W# r. m - if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)3 O! p [9 W6 p
- {5 y* T- O0 f6 R& ?0 P, `: k
- OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;+ K7 Z! U% b* x `) F% ]
- OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_0;9 S& }; q0 C: `+ T* }! S& o9 x, {
- ; W; j/ `* ^5 U: f9 a
- HAL_FLASH_Unlock();% T$ r& ^ O" W$ ^+ \
- HAL_FLASH_OB_Unlock();* B- H1 Z0 X0 `8 c1 N
-
. M3 t8 l0 P4 m- ?1 X1 J - if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)) \& k4 y) L( E% a
- {
5 F7 y% K" J; S; ] - HAL_FLASH_OB_Lock();$ d7 T0 ] G3 \: o7 h% l. O
- HAL_FLASH_Lock();
+ c$ X6 O3 W: _# |0 h7 Y! m -
}) @9 E# m6 H2 d& y% E - return false;8 R& ?/ A6 [$ R' `- b' u
- }
: \2 T1 `# c. {, N, s6 C) H - 6 o/ Q/ W* i/ x' i( O
- HAL_FLASH_OB_Lock();' e ~+ G) K& U# _( H2 B
- HAL_FLASH_Lock();
3 p3 m9 j# G# @# L# j - }7 N/ w# u+ G8 J4 A
- }5 c, @! B) u1 m% Q8 u
-
5 b' Z# k. W4 H, d - return true;
! _5 d5 ?& L+ u M - }
复制代码 & E" s" T; u6 c& @/ W9 W9 `
9 _" x4 G7 q9 t
& i$ ^% Q: ~$ f4 w9 c4 @ |
还是说这么做了以后只能全部FLASH擦除后,才可以再次使用调试。
读保护以后不能DEBUG了,要不然保护就没用了。
下次要擦FLASH以后才能再次使用
量产的时候不需要专用的的工具进行加密。