dwwzl 发表于 2013-12-31 08:50:06

stm8s eeprom如何在代码中预置数据?

比如我在代码里使用了以下eeprom空间
 // eeprom 存储项定义
__no_init __eeprom unsigned char ee_damp_c;
__no_init __eeprom unsigned char ee_dot_c;
__no_init __eeprom unsigned char ee_default_c;
__no_init __eeprom unsigned char ee_polling_addr;
 
 
在代码中如何初始化预置数据,想在下载代码的时候一同写入eeprom区,可以做到吗?我用的下载器是ST-link v2
仿真平台IAR FOR STM8
 
请大家指点!

fengye5340 发表于 2013-12-31 09:24:38

RE:stm8s eeprom如何在代码中预置数据?

1、将你的EEPROM写入数据定义成常量数组。
2、可以实现下载。
   实现有三个方法,一是编写专门的读写EEPROM函数,需要写入解锁命令。二是 利用这三个函数,你既然定义了__eeprom 这个字段,用这三个函数实现下载比较好,可以参考一下相关例程。FLASH_Unlock()FLASH_ProgramByte()FLASH_WaitForLastOperation()
三,实现编程器载入,那样的方式有时会不成功的,所以,用一二方法较好。

勒布朗 发表于 2013-12-31 19:46:35

RE:stm8s eeprom如何在代码中预置数据?

void __eeprom_write_many(unsigned short addr_eep,unsigned short size,unsigned short dummy,unsigned short addr_ram)
{
   
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);   
FLASH_Unlock(FLASH_MEMTYPE_DATA);
   
for(unsigned short i=0;i

有缘于你 发表于 2013-12-31 20:19:55

RE:stm8s eeprom如何在代码中预置数据?

#include "stm8s_conf.h"
void __eeprom_write_8(unsigned short addr_eep,unsigned char data)
{
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Unlock(FLASH_MEMTYPE_DATA);

FLASH_ProgramByte(addr_eep, data);

FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Lock(FLASH_MEMTYPE_DATA);
}
void __eeprom_write_16(unsigned short addr_eep,unsigned short data)
{
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Unlock(FLASH_MEMTYPE_DATA);

FLASH_ProgramByte(addr_eep,   data/256);
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

FLASH_ProgramByte(addr_eep+1, data%256);
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

FLASH_Lock(FLASH_MEMTYPE_DATA);
}
void __eeprom_write_32(unsigned short addr_eep,unsigned long data)
{
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Unlock(FLASH_MEMTYPE_DATA);

FLASH_ProgramByte(addr_eep,   (unsigned char)(data>>24));
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

FLASH_ProgramByte(addr_eep+1, (unsigned char)(data>>16));
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

FLASH_ProgramByte(addr_eep+2,   (unsigned char)(data>>8));
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

FLASH_ProgramByte(addr_eep+3, (unsigned char)(data>>0));
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);

FLASH_Lock(FLASH_MEMTYPE_DATA);
}

void __eeprom_write_many(unsigned short addr_eep,unsigned short size,unsigned short dummy,unsigned short addr_ram)
{

FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
FLASH_Unlock(FLASH_MEMTYPE_DATA);

for(unsigned short i=0;i

wkuang 发表于 2013-12-31 22:50:56

RE:stm8s eeprom如何在代码中预置数据?

手动做一套预置数据的方案。 不要依靠编译器等等。
如果要预置数据,建议在EEPROM中的固定地址存放一个标志,表示EEPROM是否被初始化过,再用一个标志表示EEPROM是否写入了预置数据。
1、如果EEPROM未被初始化,则初始化EEPROM(第一次刷固件时用)
2、如果EEPROM初始化过了,则检测与之数据是否存在,不存在则写入,存在则后续可使用;
3、软件刷新,更新标志。
可靠性的方案,尽量不依赖编译器,用自己的代码实现方案

dwwzl 发表于 2014-1-7 07:48:43

RE:stm8s eeprom如何在代码中预置数据?

:P非常的感谢大家的回复啊,大有裨益!

konway 发表于 2017-4-11 11:56:29

只因为少了FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
这条语句,连续读写出错,搞了几天。:L
感谢各位前辈
页: [1]
查看完整版本: stm8s eeprom如何在代码中预置数据?