OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 42277|回复: 28

STM32 读写保护功能及设置(百度来的,正在做。。。)

[复制链接]

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
发表于 2012-10-22 14:21:47 | 显示全部楼层 |阅读模式
 

STM32 读写保护功能及设置

功能::
读保护设置后将不能读出flash 的内容;当解除读保护的时候stm32 会自动擦出
整篇flash;
设置:
读保护设置:在程序的开头加入“读保护”代码,即实现了读保护功能;(每次程序

运行先
开保护)
解除读保护:解除读保护可以设置在按键里面,方便实现解锁,也不可不设;
(1)设置读保护:
if(FLASH_GetReadOutProtectionStatus() != SET)
{
//FLASH_Unlock();不解锁FALSH 也可设置读保护???
FLASH_ReadOutProtection(ENABLE);
}
(2)解除读保护
if(FLASH_GetReadOutProtectionStatus() != RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
}
这些函数在stm32f10x_flash 里面;
注意:调用上面这个库的时候需在#include "stm32f10x_flash.h"前加#define 

_FLASH_PROG;
否则报(没有定义)错;

 

 

************************************************************************

/* Flash读保护使能 */ 
if (FLASH_GetReadOutProtectionStatus() == RESET) 
{
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE); 
}


/* 清除Flash读保护 */ 
if (FLASH_GetReadOutProtectionStatus() == SET) 

/* 会擦除Flash */
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE); 
}

CPU Flash读保护使能后,仿真器调试会失败。JTAG有个解锁菜单,需要解锁才能正常再次烧写程序。当然解锁会导致Flash内容被全部擦出。

 

启动"J-Flash ARM"工具,Target->unsercure chip 就解除了芯片的读保护。
Target->unsercure chip 后一定要上电复位,系统复位是不行的。

一定要上电复位,系统复位是不行的!

 

 

 

 STM32对内部Flash的保护措施

1、STM32对内部Flash的保护措施 
所有STM32的芯片都提供对Flash的保护,防止对Flash的非法访问 - 写保护和读保护。 
1)、读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出: 通过调试器(JTAG或SWD);
从RAM中启动并执行的程序; 
2)、写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志。 
读与写设置的效果见下表: 
读保护 写保护 对Flash的操作功能 
有效 有效 CPU只能读,禁止调试和非法访问。 
有效 无效 CPU可以读写,禁止调试和非法访问,页0~3为写保护。 
无效 有效 CPU可读,允许调试和非法访问。 
无效 无效 CPU可以读写,允许调试和非法访问。


2、当Flash读保护生效时,CPU执行程序可以读受保护的Flash区,但存在两个例外情况: 
1)、调试执行程序时; 
2)、从RAM启动并执行程序时 
STM32还提供了一个特别的保护,即对Flash存储区施加读保护后,即使没有启用写保护,Flash的第 0 ~ 3 页也将处于写保护状态,这是为了防止修改复位或中断向量而跳转到RAM区执行非法程序代码。
3、Flash保护相关函数 
FLASH_Unlock(); //Flash解锁 
FLASH_ReadOutProtection(DISABLE); //Flash读保护禁止 
FLASH_ReadOutProtection(ENABLE); //Flash读保护允许



现在总结一下FLASH读保护和解除读保护的步骤:
(1)设置读保护
int main(void)
{
....
if(FLASH_GetReadOutProtectionStatus() != SET)
{
//FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE); 
}
......
while(1)
{
.....
}
}
(2)解除读保护:在程序中的某个操作中(如按键等)加入如下代码,执行后
代码自己杀死了自己,哈哈!!!
if(FLASH_GetReadOutProtectionStatus() != RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE); 


如果没有在程序中加入解除读保护代码,也不要紧,可以写段RAM中运行的程序
用于解除读保护,执行后,FLASH会自动全部擦除。代码如下:
int main(void)
{
Chinp_Init();
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE); 
}

※对于在RAM中运行程序,说明如下:
(1)我使用IAR + J-Link,不用把Boot0和boot1脚设置成从RAM启动也可在RAM中调试(我是设置成从FLASH启动)。
(2)在IAR环境中设置Link文件为lnkarm_ram.xcl
(3)Debuger选项Download tab中勾全部去掉。
按上面设置完成后,按Debug按钮,执行上面程序,读保护可解除。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-22 14:38:35 | 显示全部楼层
谢谢分享,后续可能用到。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

27

主题

148

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2012-7-25
在线时间
0 小时
发表于 2012-10-22 16:24:42 | 显示全部楼层
如此是不是可以实现 代码 防复制功能?
回复 支持 反对

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
 楼主| 发表于 2012-10-22 21:56:22 | 显示全部楼层
(1)设置读保护
int main(void)
{
....
if(FLASH_GetReadOutProtectionStatus() != SET)
{
//FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE); 
}
......
while(1)
{
.....
}
}
这个写到程序当中并执行过后,使用j-link就不能‘读出’程序了,就是‘读保护’了!我已经试过了,没有使用此程序可以读出下载到芯片中的程序,但是如果使用了此程序就无法读出程序了。
但是也无法再次烧写新的程序到芯片中了(要测试请慎重!!!!!!)
可以再主程序当中设置一按键专门清除“读保护”,一旦按下按键则清除“读保护”时芯片可以重新被烧写。(我没有怎么做现在后悔死了!)
方法二:补救的方法,专门写一个清除“读保护”程序,使用RAM中运行程序的方法,运行此程序解锁“读保护”。明天再去测试下,此方法。
回复 支持 反对

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
 楼主| 发表于 2012-10-23 09:34:13 | 显示全部楼层
测试通过!
(1)设置读保护 
int main(void) 

.... 
if(FLASH_GetReadOutProtectionStatus() != SET) 

//FLASH_Unlock(); 
FLASH_ReadOutProtection(ENABLE);  

...... 
while(1) 

..... 


读保护后无法使用j-link将程序读出,当然也无法在线仿真了
在主程序中,通过一个按键,写入取消“读保护”
if(FLASH_GetReadOutProtectionStatus() != RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE); 

使用j-link,可以正常读写程序和在线调试。
如果没有在主程序中有写这条指令,此芯片就无法再次烧写程序(可以擦出但是擦出后还是无法烧写程序)。
只有通过将此取消“读保护”程序,烧写到RAM中运行后,才能取消“读保护”(要尝试的请慎重!!!别救不会来就糟糕了)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-23 10:20:42 | 显示全部楼层
顶...
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-5-4
在线时间
9 小时
发表于 2012-11-21 22:55:02 | 显示全部楼层
学习了!顶!
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-11-22 01:46:28 | 显示全部楼层
回复 支持 反对

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2012-12-23
在线时间
0 小时
发表于 2012-12-24 10:05:39 | 显示全部楼层
回复【5楼】magicoctoy:
---------------------------------
4楼高手,请问我要怎样清除别人的写保护呢?
回复 支持 反对

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
 楼主| 发表于 2012-12-24 16:38:17 | 显示全部楼层
回复【9楼】lwba21190:
---------------------------------
新写一个程序,包含下面两条函数:
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE); 
烧写进芯片内就取消“写”保护。
回复 支持 反对

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2012-12-23
在线时间
0 小时
发表于 2012-12-24 19:00:14 | 显示全部楼层
重点是Flash下不进去了,总是提示“erro:Flash Download Failed-'Cortex M3'”,我猜是写保护的问题,你觉得是什么问题呢,然后能帮忙甜点意见吗,不甚感激!
回复 支持 反对

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
 楼主| 发表于 2013-1-4 10:47:10 | 显示全部楼层
回复【11楼】lwba21190:
---------------------------------
先把擦除整片(Erase chip),再烧写呢?
回复 支持 反对

使用道具 举报

45

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2012-11-26
在线时间
0 小时
发表于 2013-1-4 15:24:21 | 显示全部楼层
可以轻易的读出来?怎么可能?
回复 支持 反对

使用道具 举报

5

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2012-12-3
在线时间
11 小时
发表于 2013-1-4 16:12:41 | 显示全部楼层
写保护实际上是在某个特定的区域写特定的值,俗称锁IC
stm32
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-6-8
在线时间
0 小时
发表于 2013-12-28 11:56:33 | 显示全部楼层
很赞的分享。
回复 支持 反对

使用道具 举报

352

主题

1473

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8081
金钱
8081
注册时间
2015-10-15
在线时间
2916 小时
发表于 2014-4-22 23:13:32 | 显示全部楼层
Ray ban sunglass electric outlet glossy and also creamy hues tend to be refreshing and also fun
Oakleys Cheap
 <a href="http://www.ttt.org/?key=Oakleys+Cheap+Sunglasses" title="Oakleys Cheap">Oakleys Cheap</a>
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

352

主题

1473

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8081
金钱
8081
注册时间
2015-10-15
在线时间
2916 小时
发表于 2014-4-23 10:31:18 | 显示全部楼层
Ray ban electric outlet shop the sheet music had been an immediate good results
Oakleys Cheap
 <a href="http://www.ttt.org/?key=Oakleys+Cheap+Sunglasses" title="Oakleys Cheap">Oakleys Cheap</a>
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2015-7-10
在线时间
17 小时
发表于 2015-7-27 10:33:53 | 显示全部楼层
flash读保护设置而写保护没设置就行了吗?
会不会被人在APP区写入代码来读出Flash区的内容呢?
回复 支持 反对

使用道具 举报

54

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2015-7-10
在线时间
17 小时
发表于 2015-7-27 10:34:27 | 显示全部楼层
回复【6楼】正点原子:
原子哥,flash读保护设置而写保护没设置就行了吗?
会不会被人在APP区写入代码来读出Flash区的内容呢?
回复 支持 反对

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2015-7-27 12:49:53 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

6

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2015-7-26
在线时间
36 小时
发表于 2015-7-27 13:06:06 | 显示全部楼层
顶!顶!顶!顶!顶!
回复 支持 反对

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-4-11 10:51:03 | 显示全部楼层
magicoctoy 发表于 2012-12-24 16:38
回复【9楼】lwba21190:
---------------------------------
新写一个程序,包含下面两条函数:
        FLASH_Unlo ...

你遇到过“flash timeout reset the target ……”。我在网上看到这是flash保护,请问直接用这两句话可以清除flash的保护吗?我用的是别人板子上拆下来的主芯片,很有可能写了保护。你可遇见过?
回复 支持 反对

使用道具 举报

0

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-9-29
在线时间
81 小时
发表于 2016-12-9 16:42:27 | 显示全部楼层
谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

425

帖子

0

精华

高级会员

Rank: 4

积分
999
金钱
999
注册时间
2016-12-9
在线时间
174 小时
发表于 2016-12-9 16:52:09 | 显示全部楼层
谢谢分享,后续可能用到。
回复 支持 反对

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2017-2-7 15:25:32 | 显示全部楼层
程序已经写了一大半了,马上需要读写保护了!
回复 支持 反对

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
发表于 2017-2-8 09:06:34 | 显示全部楼层
magicoctoy 发表于 2012-10-22 21:56
(1)设置读保护
int&nbsp;main(void)
{
....
if(FLASH_GetReadOutProtectionStatus()&nbsp;!=&nbsp;SET)
{
/ ...

芯片读保护后可以使用STVP擦除芯片,方法二不是必须的
回复 支持 反对

使用道具 举报

7

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-6-20
在线时间
11 小时
发表于 2018-4-12 10:58:03 | 显示全部楼层
我把#define_FLASH_PROG 加上,为什么出现错误了呢?求大神指点一下 QQ图片20180412104758.png QQ图片20180412104730.png
回复 支持 反对

使用道具 举报

43

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1074
金钱
1074
注册时间
2012-1-10
在线时间
238 小时
 楼主| 发表于 2018-4-14 00:17:20 | 显示全部楼层
答案AI 发表于 2018-4-12 10:58
我把#define_FLASH_PROG 加上,为什么出现错误了呢?求大神指点一下

缺少FLASH_GetReadOutProtectionStatus()这个函数,在STM32F1XX标准库V3.5.0文件stm32f10x_flash.c中,添加即可。
回复 支持 反对

使用道具 举报

23

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
365
金钱
365
注册时间
2018-3-21
在线时间
64 小时
发表于 2018-4-14 16:19:13 | 显示全部楼层
留个眼,指不定哪天就用上了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 02:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表