打印
[STM8]

stm8s内部EEORM操作的一些疑问和大家讨论下

[复制链接]
1987|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pofu007|  楼主 | 2013-10-26 17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pofu007 于 2013-10-28 10:02 编辑

用STM8S的标准库来来构建代码, 在内部EEPROM存取一段数据。
1.初始化
void EEPROM_Config(void)
{
  FLASH_DeInit();
  FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
}

2.写入一个16个字节的数组
uint8_t  data[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

void SaveData(uint8_t *buf)
{
        uint32_t  n = 0;
          uint8_t  i = 0;
          FLASH_Unlock(FLASH_MEMTYPE_DATA);
   
            for(i = 0; i < 4; i++)
            {
                n = (uint32_t)*(buf + (i << 2) + 3);
                n << = 8;
                n += (uint32_t)*(buf + (i << 2) + 2);
                n << = 8;
                n += (uint32_t)*(buf + (i << 2) + 1);
                n << = 8;
                n += (uint32_t)*(buf + (i << 2));

                FLASH_ProgramWord(((uint32_t)0x4000 + (uint32_t)(i << 2)),  n);

                FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
        }
        
        // 疑问1:每次写完FLASH是不是最好锁住,如果经常要读写的话是否解锁一次就好,写完后不锁。
        FLASH_Lock(FLASH_MEMTYPE_DATA);
  
}


3.读取16字节的数组
void ReadData(uint8_t *buf)
{
        uint8_t i = 0;

        // 疑问2:读操作是否要解锁。
        
        for(i = 0; i < 4; i++)
        {
                *(buf + (i << 2)) = FLASH_ReadByte((uint32_t)0x4000 + (uint32_t)(i << 2));
                // 疑问3: 读操作之后是否要查询操作是否完成。
                *(buf + (i << 2) + 1) = FLASH_ReadByte((uint32_t)0x4000 + (uint32_t)((i << 2) + 1));
                *(buf + (i << 2) + 2) = FLASH_ReadByte((uint32_t)0x4000 + (uint32_t)((i << 2) + 2));
                *(buf + (i << 2) + 3) = FLASH_ReadByte((uint32_t)0x4000 + (uint32_t)((i << 2) + 3));
        }
        
}

提出疑问的原因是,一般情况下数据存取读出,都没什么问题,偶尔发现存储的数据似乎出现了些问题(不能确定,也很难复现,出现问题的数据,表现为无意义的数值时,在程序中会被自动修改成默认值)。
请教下我在存储数据的时候,是不是存在一些缺陷。
沙发
linliangqiu| | 2013-10-26 23:14 | 只看该作者
是不是在电源不稳定的时候操作了?

使用特权

评论回复
板凳
拿起书本| | 2013-10-27 17:01 | 只看该作者
这个应该与外设无关吧?
不是太了解,帮顶一下吧。

使用特权

评论回复
地板
pofu007|  楼主 | 2013-10-28 08:40 | 只看该作者
拿起书本 发表于 2013-10-27 17:01
这个应该与外设无关吧?
不是太了解,帮顶一下吧。

我的意思是,**作STM8S的内部EEPROM是不是有考虑欠当的地方,比如写的时候没写完我就去转去执行其他代码了。

使用特权

评论回复
5
bobo5650| | 2013-10-28 09:25 | 只看该作者
有一些型号有一个叫RWW还是什么的功能,就是在写EEPROM的时候还能同时执行代码。这种就会出现你说的“写的时候没写完我就去转去执行其他代码了”。一般来说写EEPROM,还是加校验比较好。

使用特权

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

本版积分规则

6

主题

60

帖子

1

粉丝