11485|10

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32FLASH模拟EEPROM使用和优化 [复制链接]



感兴趣去21IC博客下载详细说明和优化后的例子
http://blog.eeworld.com.cn/user1/5817/archives/2010/69182.html
此帖出自stm32/stm8论坛

最新回复

                                 没看出什么特别的地方,我水平问题。  详情 回复 发表于 2010-7-16 08:48
点赞 关注
 

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 


错误的例子:
/* Variables' number */
#define NumbOfVar               ((uint8_t)0x05)
uint16_t VirtAddVarTab[NumbOfVar] = {0, 1, 2};
//NumbOfVar定义的比用的多实际是{0, 1, 2, 0, 0},虚拟地址0的数据换页后将出现旧数据覆盖最新数据
int main(void)
{
uint16_t  temp;  
  for (VarValue = 0; VarValue < 100; VarValue++)
  {
    EE_WriteVariable(VirtAddVarTab[0], VarValue+10);
  }
  for (VarValue = 0; VarValue < 500; VarValue++)
  {
     EE_WriteVariable(VirtAddVarTab[1], VarValue);
     temp=0;
     EE_ReadVariable(0, &temp);//不换页读出数据是对的,换页后读出数据错误
  }
}
//====================================================================================
/* Variables' number */
#define NumbOfVar               ((uint8_t)0x03)
uint16_t VirtAddVarTab[NumbOfVar] = {0, 1, 2};
//NumbOfVar定义为3,下面用到虚拟地址超过VirtAddVarTab表里面的值
int main(void)
{
uint16_t  temp;

  for (VarValue = 0; VarValue < 100; VarValue++)
  {
    EE_WriteVariable(VirtAddVarTab[0], VarValue);
  }
  
  
  for (VarValue = 0; VarValue < 50; VarValue++)
  {
    EE_WriteVariable(3, VarValue+2);
  }
  
  for (VarValue = 0; VarValue < 200; VarValue++)
  {
    EE_WriteVariable(2, VarValue);
    temp=0;
    EE_ReadVariable(3, &temp);//不换页读出数据是对的,换页后读出数据错误
  }
}
此帖出自stm32/stm8论坛
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 


STM32 FLASH模拟EEPROM优化
官方例程中读写数据每次要查询读写位置,写数据是从页首地址开始查询,读地址是从页末地址查询。
假如只有1个数据,读数据时效率是很低的,要查到最后才能找到有效数据,
如果页快满了写数据效率也很低,读效率反而好一点了。
实际程序中记录下一个可以写数据的位置将提高数据的读写效率,这样的话:写数据就是立即写不用查询,读数据不从页末地址查询,而是从最后1个写入数据处查询,这样特别在页数据少时效率提高不少。优化过的例子代码只需要增加很少部分就能实现。
增加关键代码
uint32_t CurWrAddress;

//初始化写地址,减少每次读写时查询时间
uint16_t InitCurrWrAddress(void)
{
  FLASH_Status FlashStatus = FLASH_COMPLETE;
  uint16_t ValidPage = PAGE0;
  //uint32_t Address;
  uint32_t PageEndAddress;
  
  /* Get valid Page for write operation */
  ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE);

  /* Check if there is no valid page */
  if (ValidPage == NO_VALID_PAGE)
  {
    CurWrAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
    return  NO_VALID_PAGE;
  }
  
  /* Get the valid Page start Address */
  //Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
  CurWrAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));

  /* Get the valid Page end Address */
  PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));

  /* Check each active page address starting from begining */
  while (CurWrAddress < PageEndAddress)
  {
    /* Verify if Address and Address+2 contents are 0xFFFFFFFF */
    if ((*(__IO uint32_t*)CurWrAddress) == 0xFFFFFFFF)
    {
      
      /* Set variable virtual address */
      FlashStatus = FLASH_COMPLETE;
      /* Return program operation status */
      return FlashStatus;
    }
    else
    {
      /* Next address location */
      CurWrAddress = CurWrAddress + 4;
    }
  }

  /* Return PAGE_FULL in case the valid page is full */
  return PAGE_FULL;
}
详细请看修改后的例子,读写函数也做了相应更改

STM32 FLASH模拟EEPROM进一步优化
上面优化过的例子在写数据无须查询直接写入就可,但是读数据在页数据少是效率提升明显,在页数据多时效率不明显,特别是页数据快满时就跟原来一样的。
说明:不管是官方还是优化过的例子在页交换时这个模拟EEPROM程序都将耗费不少时间的
//================================
如果你对时间要求不高完全不用考虑下面的了。
下面就进一步提升它的效率,方法如下:

为每1个保存的变量定义1个映射地址,就是在写数据时将写数据的地址偏移保存起来。比如第1次的数据映射地址是0,第2次的数据映射地址是1,那么读数据时就可以立即计算出地址。此方法对于1K页大小的每个数据将增加1个8位映射地址,对于2K页大小的每个数据将增加1个16位映射地址.

这里只提供方法,当然方法不是唯一的,有兴趣的自己去玩。
此帖出自stm32/stm8论坛
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 看起来很不错
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 给条裤子,鼓励积极思考。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 夏天热啊,应该给条裙子
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 
夏天热啊,应该给条裙子
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 cool
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 不错
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 oo
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 没看出什么特别的地方,我水平问题。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表