10334|10

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于STM32像EPROM一样可以单字节写内部Flash的理解 [复制链接]

都有说STM32的内部Flash可以像EPROM一样操作,单个字节单个字节的写入。根据本人的拙见,其实也就仅仅是“像”而已。原因有以下几点:1.首先Flash这种东西,其写入数据的原理是便是将1变成0,所以你的某地址Flash一旦已经写过数据而且不为0,则当你再次需要向该地址写数据时,必须要先擦除,即把该地址先全部变成1,否则你将数据写入该地址后,基本上该地址里面的值已经不是你写入的值了。
2.STM32对内部Flash有页(1k或者2K)擦除指令,也就是STM32不能单独对某一个或者某几个字节进行擦除。而擦除操作并不需要大量内存。
3.如果要像EPROM一样操作Flash,其原理是先把该一页里面的数据全部读到一个buf里面,如果你希望整页的数据不丢失,那么buf的大小至少应该和页大小一样,即为1K或者2K(大小视MCU型号而定)。然后对整页进行擦除,再把要写入的数据先写到之前的buf里面(用要写入的数据替换buf里相应位置的原来的数据),再把整个buf写到Flash里面。如此便实现了任意数据长度的数据写入Flash。
4.正如第3点,如果你跑的是系统,诸如(UCOS,RTX,FRERTOS)等,那么你进行此操作的task的堆栈至少应该为1K+N或者2K+N。否则直接堆栈溢出而进hard fault。我想这是我们大家所不能忍受的。
        当然,对于上述问题有一些变通的方法,如果你要写入的数据比较少,比如几十个Byte,那么你可以将buf改小,只要大于等于你要保存的数据数量就可以了,这样便可以大大减小内存。另外,STM32支持字(4Byte)或者半字(2Byte)写入,所以你的buf应该为偶数。如果你要写入的数量为奇数,buf也应该为偶数,不足的在buf里补0或任意一个数就好。因为,如果你的buf为奇数的话,在写入最后一个数据时,系统会在内存中随便抓一个地址里的数据,写进去,这可能出问题。(究竟有没问题我没有试过)。
        暂时就这么多,以后有什么发现再来补充,有不对的地方欢迎拍砖。

此帖出自stm32/stm8论坛

最新回复

擦除操作,会屏蔽中断  详情 回复 发表于 2016-11-29 14:07

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

1976

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
学习了
此帖出自stm32/stm8论坛
 
 

回复

1万

帖子

24

TA的资源

版主

板凳
 
Flash的擦除次数是比较少的,所以不能象EEPROm或铁电那样频繁的写入。适合保存不经常改变的数据。
此帖出自stm32/stm8论坛
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

4
 
是的,STM32只有1w次,如果买的芯片不正中,能擦多少次就更是不好说了。
此帖出自stm32/stm8论坛
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

5
 
基本上就是这个原理
此帖出自stm32/stm8论坛
 
 
 

回复

6107

帖子

4

TA的资源

版主

6
 
不经常改变的数据就可以用。
此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

7
 
说的不错,补充几点,

读出全擦再写自然是最简单的.flash的内容擦过即可写入而不一定要全擦.比如你想保存1个数据到某个地址只要保证这个地址是之前擦过的就可以写入成功,而不必非得擦除整个页.这个操作需要有额外的代码开销,也就是要有一套机制保证,至于怎么做就看你的了.
擦除操作要费很多时间,所以先预先准备好足够的数据区可以提高保存数据的实时性要求.
如果要写得数据比较频繁为了减少单个页的写入次数以延长寿命,可以轮番写多个页,这个也是有开销和数据结构支撑的.



此帖出自stm32/stm8论坛
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

8
 
可以在有数据改动需要重新写入的时候可以不整页擦除而是采用数据追加,尽可能的写满一页整理数据之后擦除重新写入
此帖出自stm32/stm8论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

9
 
还有,在中断里面不能进行擦除操作,否则程序就不跑了。调试中发现的,究竟什么原因呢?
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
学习一下
此帖出自stm32/stm8论坛
 
个人签名项目外包,wince视频解码项目,有兴趣的可以加QQ14161920
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

11
 
Jerryzgj 发表于 2014-12-14 22:16
还有,在中断里面不能进行擦除操作,否则程序就不跑了。调试中发现的,究竟什么原因呢?

擦除操作,会屏蔽中断
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表