最近编译STM8S003时需要使用flash库函数,看起来简单,实则折腾了超过1天。今天总结方法如下:
1.修改stm8s.h 156行 #define RAM_EXECUTION 注释去掉 如果用的是COSMIC这个 可以不去
2、在project的source和include files中添加 stm8s_flash文件
3.右键点击项目文件,选择settings->linker->category->Input,然后Code,constants那一区域添加.FLASH_CODE,注意要大写!
此时使用flash的函数不会再报错了。
至于在主文件中#include "stm8s_flash.h" 这个是没有必要的。
//读E2pRom
void Read_EEPROM(void)
{
//EEPROM解除保护。
FLASH_Unlock(FLASH_MEMTYPE_DATA);
//若EEPROM的首地址即第一个字节是标志字节,可知之前向EEPROM中写入过数据,应读出。
if(FLASH_ReadByte(EEPROM_HEAD_ADDR)==FLAG_VALIDDATA)//0,1,2
{
//2个字节的数据从EEPROM中读出 。
lastsavestate[0]= FLASH_ReadByte(EEPROM_HEAD_ADDR);//补水仪
lastsavestate[1]= FLASH_ReadByte(EEPROM_HEAD_ADDR+1);//按摩棒
}else {
lastsavestate[0]=0;
lastsavestate[1]=0;
}
//EEPROM加上保护。
FLASH_Lock(FLASH_MEMTYPE_DATA);
}
//写E2prom
void Write_EEPROM(void)
{
//EEPROM解除保护。
FLASH_Unlock(FLASH_MEMTYPE_DATA);
//STM8S003F3一共有128字节的EEPROM空间。
//写入前,全部擦除。
FLASH_EraseBlock(0,FLASH_MEMTYPE_DATA); //擦除块
//在EEPROM的首地址写入标志字节,表示EEPROM被使用过,内有有效数据。
FLASH_ProgramByte(EEPROM_HEAD_ADDR, FLAG_VALIDDATA);
FLASH_ProgramByte((EEPROM_HEAD_ADDR),lastsavestate[0]);
FLASH_ProgramByte((EEPROM_HEAD_ADDR+1),lastsavestate[1]);
//EEPROM加上保护。
FLASH_Lock(FLASH_MEMTYPE_DATA);
}