OpenEdv-开源电子网

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

flash模拟eeprom实验 擦除之后为什么要复制

[复制链接]

14

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2014-10-27
在线时间
23 小时
发表于 2020-7-8 00:07:59 | 显示全部楼层 |阅读模式
在原子哥的flash模拟eeprom实验中,当检测到剩余地址上的数据不是0xffff时,进行擦除,为什么整个扇区擦完之后,要进行复制,再从页首地址进行写入!
/*****************************以下是例程***************************/
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);//写入整个扇区  
          }else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.        
     个人觉得上面这里是不是可以这样写
   
      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;//下一个扇区可以写完了
  }  
};

问渠哪得清如许 为有源头活水来
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 16:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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