打印

stm32 an2594 EEPROM Emulation的小bug, 使用的朋友请绕行

[复制链接]
6370|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
psr|  楼主 | 2008-5-21 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用STM32 AN2594提供的EEPROM Emulation程序做参数值保存用时, 实际应用中发现在其中eeprom.c文件中(2007-10-8发布), 功能u16 EE_VerifyPageFullWriteVariable(u16 VirtAddress, u16 Data)中的同一数据值是否已经写入有点小错误:
while (Address < PageEndAddress)
  {
    /* Verify each time if Address and Address+2 contents are equal to Data and VirtAddress respectively */
    if (((*(vu16*)Address) == Data) && ((*(vu16*)(Address + 2)) == VirtAddress))
    {
      return FLASH_COMPLETE;
    }

如果已经写入值v1, 再写入值v2, 后再写入以前写过的值v1, 回读会读出v2的结果而不是期望的v1.

后来在http://www.st.com/mcu/forums-cat-6365-23.html确实看到有报告这个bug.

因时间限制, 小弟简单地在比较最后一次写入(最后一个匹配地址)的值是否一致, 不一致就再写一遍新值:

  /* Check each active page address starting from begining */
  while (Address < PageEndAddress)
  {
    /* Verify each time if Address and Address+2 contents are equal to Data and VirtAddress respectively */
    // if (((*(vu16*)Address) == Data) && ((*(vu16*)(Address + 2)) == VirtAddress))
    if ( (*(vu16*)(Address + 2)) == VirtAddress )
    {
        if((*(vu16*)Address) == Data)
            IsVariableValMatchedFlag = TRUE;
        else
            IsVariableValMatchedFlag = FALSE;
      // return FLASH_COMPLETE;
    }
    
    
    
沙发
香水城| | 2008-5-21 18:10 | 只看该作者

谢谢楼主

我们这里也会看看。

使用特权

评论回复
板凳
lut1lut| | 2008-5-22 11:28 | 只看该作者

是个bug

肯定不应该才小地址开始看是否有匹配的“数据-地址对”咯。否则读访问的时候,读不到这个latest updated的值。(读的时候是从大地址开始找)
LZ帖子里给出的st forum上的解决办法,修改简单并且可行,但是有点鲁莽,因为会造成本来不必要的page transfer和page erase,后者比较费时。而且如果真是page full了,这个算法要比较255次才得出结论。所以,可以作以下优化:
(1)先就来看一下,最后一个space是否还为0xffffffff来判断page full or not
(2)如果full了,也不要马上开始page transfer。从最后一个space开始,大地址往小地址察看,如果找到了同样地址上的数据不是此次要更新的值,再作page transfer和page erase也不迟。

使用特权

评论回复
地板
psr|  楼主 | 2008-5-22 17:01 | 只看该作者

两位说的有理!

哪位大哥哪天要是完善了, 还望传一版上来共享, 谢啦!

使用特权

评论回复
5
starm| | 2008-5-22 22:09 | 只看该作者

stm32 模拟eeprom的应用笔记也有这个bug

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

psr

8

主题

21

帖子

1

粉丝