你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32程序加密

[复制链接]
STMCU小助手 发布时间:2023-1-7 11:58
所有STM32的芯片都提供对Flash的保护,防止对Flash的非法访问 - 写保护和读保护。读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过这两种方式中的任何一种方式读出:通过调试器(JTAG或SWD)和从RAM中启动并执行的程序。我们这里程序加密的目的是防止板子中的程序被其他人读出使用,这里有两种方法可供使用:
% {% `9 A0 X; j! P; ]: C' O" |4 G
, A9 t% z' y7 Z/ }# o       1.禁止读出Flash存储器内容;
- m% V4 j! M8 R' E2 ^6 N       2.STM32用ID加密程序;
8 `5 D6 O5 P7 s1 |0 a& q$ e
  H  A8 y; }: f) I
这里我们分别对这两种方法进行介绍。5 p' t' u: f' M/ |3 N
2 a5 c0 R  x. l: g" B! F/ h! P* X
一.禁止读出Flash存储器内容1 v" ~- B/ M6 J( C+ M0 C' U! a

: S9 \1 O' C  a8 Z       这种方法主要是防止程序被读出,正如文章开头所说,一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过这两种方式中的任何一种方式读出:通过调试器(JTAG或SWD)和从RAM中启动并执行的程序。这是也无法对flash进行烧写程序了,所以使用时需要谨慎。下面简单介绍下使用方法。
1 A& w( w+ B# R& w7 ^! E
5 o# u, [- q: {$ h3 @4 Z       1.在程序中包含#include "stm32f10x_flash.h"头文件 并在这条语句前面加入 这一行话:#define _FLASH_PROG;   //flash读写保护时需要加入的
! g) J1 e. z/ X) ]; W0 l; R3 s) l2 z' i

2 g. A/ N: G. U( T       2.实现flash的读保护:
- q* {! ~3 l5 n; u% y7 Q4 \

  1. ' `: _+ p0 J) g6 s5 m( N9 X; k2 a
  2.            /* 设置Flash读保护 */3 X! D( T. Z+ n) ]2 y: e
  3.            if (FLASH_GetReadOutProtectionStatus()!=SET)
    2 A8 h/ e; M3 b4 a
  4.            {1 L/ M! ?4 p$ U- ~
  5.                 /* 会擦除Flash */! V0 N; |( j4 w
  6.                 FLASH_Unlock(); //写保护时可以不用这句话,可用可不用
    ( d. P0 h0 H/ K3 [8 a. H: ^
  7.                 FLASH_ReadOutProtection(ENABLE);
    6 }5 G+ b- e5 P( q2 D3 X6 s
  8.             }
复制代码

3 \$ J  m" S# \- A# Q1 R1 J% x- I       3.清除flash的读保护:
! \& {$ i0 K. b+ R, R6 Q
  1.            /* 清除Flash读保护 */; Q2 o% A1 A2 _0 p, q& ]8 f
  2.             if (FLASH_GetReadOutProtectionStatus()==SET): [+ w$ g; c& k+ Z
  3.             {* J& _5 q7 ~* [/ }, G; |( Y% q; Q
  4.                 /* 会擦除Flash */
    5 a8 K# S# ]1 W0 p
  5.                 FLASH_Unlock();
    4 p0 F# ~- ?( ?* q
  6.                 FLASH_ReadOutProtection(DISABLE);( Q2 y% w* u: N+ t: Y# t( H
  7.                 flash_unlock_timeout=1500;. U: [, o3 f6 t* f+ N. }, w
  8.             }
复制代码
3 U# J9 e; L/ b5 W2 `+ B5 \
       主要就是以上三步,具体如何在程序中使用,看自己的需求。) R- {3 X6 V$ B" ]. n

3 ^* p8 y9 |9 C
# u0 U( F/ Y; B, g* Y
二.STM32用ID加密程序* h# J0 m" L) b: f

9 M; I, |* s6 I        每个STM32芯片都有一个全球唯一的ID,这个唯一码可以利用作软件加密,ID号是12个字节大小共96位,ID号的起始地址是0x0x1FFFF7E8。利用这个ID码程序在运行时比较ID码是否正确来判断是否往下执行程序。下面简单介绍下使用方法。; _5 k) B# b5 G6 x0 b

' v5 S; t1 i1 \        1.读取目标板子的ID号,并修改程序将ID号保存在程序中:8 @) ]- v; Q" D- k8 k, g" M/ @

" f4 J; @, H5 X0 ?4 w2 I( P
  1.               U8 sys_id[12]={0};  //存储stm32芯片的ID号的数组
    # \; a' A4 R2 E6 @- X; }9 s

  2. 9 |' N+ D! w6 k

  3. * W: Q( n5 ~% Z& H: B4 }0 W4 J  D
  4.                for(i=0;i<12;i++)
    1 C$ U+ }2 H4 M* J7 l
  5.                {
    ; `) |: \1 k$ t' ?- T
  6.                   sys_id=*(u8*)(0x1FFFF7E8+i);  //读取STM32芯片的唯一ID
    - }! }: ~3 @- w6 z# |# \% }- f
  7.               }
复制代码

: O& v9 U  J' l        2.将修改后的程序再下载到目标板子上这时就可以使用上面读出ID来对比当前板子上ID是否一致来确定程序是否执行。
  ~( a6 S2 d1 F! M
9 Z' }8 V+ d& V8 e       这个方法就算程序被其他人读取也无法在其他板子上运行,因为ID不一致。麻烦的地方是每块板子的程序的ID不一样造成程序维护麻烦。+ @* \8 T$ ^6 F; P8 ?  [
2 _4 \1 G4 n+ j5 t. r9 J5 Q
       实际怎么使用还是要看当时情况,也可能用不上这两种方法。
( H4 m  L  N2 \1 C7 N) J( [8 v————————————————  {8 [) l3 b8 b6 \' a4 d1 `
版权声明:阿木zhang$ I+ R4 G& ~( s$ F6 d4 e( q

: j, h& V' e; m1 ^9 \' L+ Q7 f  q9 |- k
赞 收藏 评论0 发布时间:2023-1-7 11:58

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版