OpenEdv-开源电子网

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

关于flash当作eeprom用 问题

[复制链接]

14

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2014-10-27
在线时间
23 小时
发表于 2020-7-8 00:17:52 | 显示全部楼层 |阅读模式
10金钱
原子哥的flash当作eeprom用例程中,擦除之后,为什么要复制,并且要从扇区首地址进行写入
while(1)
{
      STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
      for(i=0;i<secremain;i++) //校验数据
           {
                 if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除     
            }
      if(i<secremain)    //需要擦除
         {
                     STMFLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
          for(i=0;i<secremain;i++)//复制
         {
                STMFLASH_BUF[i+secoff]=pBuffer;   
         }
      STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区  
/*****************************************************
个人觉得上面需要擦除里面是不是可以这样写? 请高手指点,谢谢!!!
      if(i<secremain)    //需要擦除

         {

                     STMFLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区

                     STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);/写入整个扇区  

        }

***********************************************************/
  }else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.        
  if(NumToWrite==secremain)break;//写入结束了
  else//写入未结束
  {
   secpos++;    //扇区地址增1
   secoff=0;    //偏移位置为0   
      pBuffer+=secremain;   //指针偏移
   WriteAddr+=secremain*2; //写地址偏移(16位数据地址,需要*2)   
      NumToWrite-=secremain; //字节(16位)数递减
   if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
   else secremain=NumToWrite;//下一个扇区可以写完了
  }  
};

最佳答案

查看完整内容[请看2#楼]

这样说吧,因为你操作的是secoff到secoff+secremain[/backcolor]下标的数据。然后你检查这里面有数据不是0XFFFF了,那这样是不是需要擦除后才写入,但是擦除是整个扇区的,所以你需要将不是你操作的 0到secoff下标数据存起来,因为你也不知道0到secoff有没有存数据,就算是没存,也不影响你写secoff到secoff+secremain[/backcolor]的数据。之后写入的话,0到secoff的数据就会恢复原状。若是你的代码,会直接将0到secoff的数据重 ...
问渠哪得清如许 为有源头活水来
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-7-8 00:17:53 | 显示全部楼层
本帖最后由 叶子君 于 2020-7-8 16:53 编辑
Simon 发表于 2020-7-8 10:57
这是原子哥的原代码,原子哥的代码是如果指定的地址上检测到有数据的话,那么需要擦除这整个扇区,然后把 ...

这样说吧,因为你操作的是secoff到secoff+secremain下标的数据。然后你检查这里面有数据不是0XFFFF了,那这样是不是需要擦除后才写入,但是擦除是整个扇区的,所以你需要将不是你操作的 0到secoff下标数据存起来,因为你也不知道0到secoff有没有存数据,就算是没存,也不影响你写secoff到secoff+secremain的数据。之后写入的话,0到secoff的数据就会恢复原状。若是你的代码,会直接将0到secoff的数据重置到0xFFFF,这是不符合代码原初衷的。举个例子:比如地址1- 5存了数据1 ,2 ,3,4,5。然后函数传参说要修改地址6的数据,检查6已改写了,这时候需要全区擦除。先把1 - 5的数据保存起来,然后 将6改为新数据。在重新写入。若是你的代码,1-5的数据全都擦除了,但你只是传参告诉改地址6而已。
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1435
金钱
1435
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-7-8 10:27:03 | 显示全部楼层
你这样擦除了,那之前存在的数据是不是都没有了呢?
回复

使用道具 举报

14

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2014-10-27
在线时间
23 小时
 楼主| 发表于 2020-7-8 10:57:18 | 显示全部楼层
叶子君 发表于 2020-7-8 10:27
你这样擦除了,那之前存在的数据是不是都没有了呢?

这是原子哥的原代码,原子哥的代码是如果指定的地址上检测到有数据的话,那么需要擦除这整个扇区,然后把数据复制到另一个数组里面,从这个扇区的首地址重新写入,我看之前的原代码,从首地址写入的话stmflash_buf[0]~stmflash[secoff]这些数据感觉都是空的,从secoff到secremain才是复制过来的数据 写入,不明白这样操作的目地是什么
问渠哪得清如许 为有源头活水来
回复

使用道具 举报

14

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2014-10-27
在线时间
23 小时
 楼主| 发表于 2020-7-8 14:35:15 | 显示全部楼层
:lo别沉了啊
问渠哪得清如许 为有源头活水来
回复

使用道具 举报

14

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2014-10-27
在线时间
23 小时
 楼主| 发表于 2020-7-8 18:05:12 | 显示全部楼层
叶子君 发表于 2020-7-8 16:45
这样说吧,因为你操作的是secoff到secoff+secremain下标的数据。然后你检查这里面有数据不是 ...

谢谢,明白了,没有注意到前面他是先把整片扇区的数据先读出来了的。
还有个小小的问题,像这种擦除方式,对flash的寿命来讲 应该不是最优的吧
问渠哪得清如许 为有源头活水来
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2020-7-9 07:55:50 来自手机 | 显示全部楼层
加上均衡算法
回复

使用道具 举报

14

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2014-10-27
在线时间
23 小时
 楼主| 发表于 2020-7-9 20:12:09 | 显示全部楼层

你好,如果要达到增加flash寿命的效果,是不是要用他官方的例程,page0,page1交换擦写的方式?
问渠哪得清如许 为有源头活水来
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2020-7-9 22:14:23 来自手机 | 显示全部楼层
Simon 发表于 2020-7-9 20:12
你好,如果要达到增加flash寿命的效果,是不是要用他官方的例程,page0,page1交换擦写的方式?

对,乒乓算法是最简单的!
回复

使用道具 举报

14

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2014-10-27
在线时间
23 小时
 楼主| 发表于 2020-7-10 15:08:40 | 显示全部楼层
无痕幽雨 发表于 2020-7-9 22:14
对,乒乓算法是最简单的!

你好,对官方给出的那种思路我有几点疑问:
1:当page0 全部擦除之后,再往里面写的时候,page0里面还会存在无效数据吗?
2:当flash的扇区为1K时,按官方例程,只能存256个数据是吗?(4个字节 为一块, 一块的前两个字节存数据,后两个字节就是存他的虚拟地址)
问渠哪得清如许 为有源头活水来
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 23:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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