本帖最后由 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));
}
}
提出疑问的原因是,一般情况下数据存取读出,都没什么问题,偶尔发现存储的数据似乎出现了些问题(不能确定,也很难复现,出现问题的数据,表现为无意义的数值时,在程序中会被自动修改成默认值)。
请教下我在存储数据的时候,是不是存在一些缺陷。 |