打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于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  EPROM  单字节  内部Flash

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
BIOS维修实例_操作系统 - 书源网
再说STM32中使用Flash模拟EEPROM (amoBBS 阿莫电子论坛)
分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入
Nor 与Nand Flash 区别
STM32之SPI读写外部FLASH
程序的内存分布+ROM和RAM
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服