最近编译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);
}
设计资源 培训 开发板 精华推荐
- 使用 ROHM Semiconductor 的 BD5252 的参考设计
- 使用 STMicroelectronics 的 HVLED001 的参考设计
- orangepi-zerov2.0
- LT3970EDDB-3.42 3.3V 降压转换器的典型应用
- 【电源】XL4005 -5A大电流输出
- LT1021DCN8-7 精密 DAC 电压基准的典型应用
- AD8313-EVALZ,AD8313 评估板,0.1GHz 至 2.5GHz,70dB 对数检波器/控制器
- LTC4211 演示板,具有多功能电流控制功能的热插拔控制器(20A 版)
- LDK130PU10R 1V、300 mA 低静态电流极低噪声 LDO 的典型应用固定版本电路
- 基于PTN5100 USB Type-C Power Delivery PHY的典型应用