本帖最后由 XinLiYF 于 2019-2-9 17:45 编辑
4 D" w# w" X4 p M+ P0 ~# ^, [/ ~( o& o3 I4 f5 q( Y7 X
STM32F1(Flash 读保护)
# l* F" A, e* o U 1,目的
9 l: A( W- l! V2 B' k b7 y* z 在实际的产品发布中,如果不对储存在单片机 Flash 中的程序做一些保护的话,就有可能被一些不法公司,通过仿真器(J-Link,ST-Link 等)把 Flash 中的程序读取回来,得到 bin 文件或 hex 文件,然后去山寨产品。所以我们需要对程序进行保护,一种比较简单可靠的方法就是把 Flash 设置成读保护。" d0 J7 ?+ m3 n. v
/ c5 {$ F, K" Z+ h- o2,开发环境
3 o) a- B; y# E+ y4 ?: H 1,适用芯片:STM32F1 全部芯片
* l( V" q& R! N/ }0 g* g 2,固件库:STM32Cube_FW_F1_V1.6.1
3 R9 O( B" `8 F# X 3,IDE:MDK525
4 x5 O# M' K) M# t0 r: c' p3 I3 Q5 y
3,程序源码
9 v" I& m& a, q( ~% }- /**. D9 |/ I4 |" _* m4 F) J
- * @brief Set flash read protection.! w3 N6 U) j |, _8 V
- * @param [in] state: Flash read protection state, true: enable protection, false: disable protection.
5 |6 b; s. e) o1 H - * @retval true: Successful operation.
8 x A* F" ~2 M' A. Z - * @retval false: Operation failed.
/ T0 Z. _3 W7 J: u% J, E' ]+ [5 V - */* |7 q; I: d0 [8 k: _3 O% s
- bool SetFlashReadProtection(bool state)
$ V' G( q' K# U& K; Q, P8 _ - {
* B9 {9 a1 S9 k# }4 I - FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};2 e: B4 O: q( G! P' i" i
- HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);* b5 h1 `/ K" o* k. |
- " ~8 a# N2 p8 o( i
- if(state == true)
0 r+ ?" ~, n8 S4 } - { z3 S8 A+ J3 [5 G1 i
- if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)8 Z; ] K: K! }) T" r4 Q
- {
- x( V# Z3 _# H - OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
1 |1 P% @* M9 b+ M) D" q# W. { - OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_1;
' b; G9 ?5 [6 `5 V d. L4 A9 S -
2 l5 g; b. \( B, B7 g - HAL_FLASH_Unlock();
; o( Y' i6 G2 Q7 t) M - HAL_FLASH_OB_Unlock();' G2 Z) `. j9 Q% I0 X) m
-
, R3 q+ P7 \4 P4 S. B - if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)2 @ e4 f5 H! _# j5 D# u2 v
- {
1 {3 v9 M9 M: ]1 ?, S5 v1 H# p - HAL_FLASH_OB_Lock();8 V, a {% g8 c8 v5 @& Z
- HAL_FLASH_Lock();7 `- T" Y# w I$ G4 [1 s2 \: f
-
! ^% p/ F7 @3 j* {6 k - return false;4 t+ _9 ?, J l5 Y1 [# y! c
- }
$ t4 K5 p, m! M' T8 z -
6 c! w9 F$ m. Y+ n- z - HAL_FLASH_OB_Lock();
" m8 O; i" l2 V4 M3 y - HAL_FLASH_Lock();
- H/ R5 J9 Z& D6 x5 z - }
; e6 M' W9 Q1 a0 D8 h' F& G! @5 M: V - }
$ O! R( R) K- v/ \+ o% G - else
1 e# m* i4 q4 |3 |5 y - {* `: @$ X# z% W; S E
- if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)
9 O8 U; R& W- f- O1 Z - {5 Q6 v# h8 \ K! N H
- OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
' ?2 M3 j3 ]+ w9 a. \0 ?" r+ z6 X - OptionsBytesStruct.RDPLevel = OB_RDP_LEVEL_0;
; q, f. ?' `7 |1 U m -
- A5 D( w) C. t. I - HAL_FLASH_Unlock();
# e2 j7 W, G, z( ~ - HAL_FLASH_OB_Unlock();: T( Y4 Q8 Q- ?& W7 q! c, W: s! _
- / C- o+ P7 G# |$ Q1 z$ z
- if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
0 s0 [* g% U/ D5 q - {! {5 V& A) u2 w& }) y! U
- HAL_FLASH_OB_Lock();: s+ d1 Q. b# W0 F" n8 I1 [1 X' E
- HAL_FLASH_Lock();
6 c) |3 L/ {$ y, J7 X - # R1 P2 L1 s9 Y8 {; w
- return false;
* `& \: N0 R X( ]9 b3 J - }% {" w1 ^% L( I* g4 Q
-
4 p4 ~! e! z- _. F1 F3 H - HAL_FLASH_OB_Lock();
! G5 c) \% P5 B1 \! e1 k7 i - HAL_FLASH_Lock();
5 r/ K, y3 H; D) z3 i ? - }+ D" F. s6 \$ ?+ i. c& M( }9 B
- }
h( t# J) o( L* K, S: [7 d -
* p( X, F2 ?$ p; Q3 m - return true;' E7 O4 h* K n- }" \
- }
复制代码 4 s+ N- M$ r# p2 T/ m+ \: Q3 D
2 n E/ n1 o) `. N
4 Y& s7 {: R: ~& E7 O( B, _ |
还是说这么做了以后只能全部FLASH擦除后,才可以再次使用调试。
读保护以后不能DEBUG了,要不然保护就没用了。; A" J! |# @( M! O M: Q
下次要擦FLASH以后才能再次使用
量产的时候不需要专用的的工具进行加密。