/*
这两天项目开发中,用到STM8的EEPROM功能,几个数据要掉电保存,在网上也查了一下EEPROM操作,发现网上出现的问题主要有两点:
1、EEPROM读写不成功;
2、EEPROM读写的时间太长;
看了一下ST的库函数,自己测试了一下,没有发现什么问题,比较正常;在读写EEPROM期间,也有动态扫描LED数码管,没有发现数码管有闪烁。
操作过程中:
1、开发平台:STM8S105K4T6 IAR6.3 ST库版本 V2.1.0
2、操作EEPROM,使用到的库函数:
FLASH_Unlock(FLASH_MEMTYPE_DATA);
while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);
FLASH_ProgramByte(FLASH_DATA_START_PHYSICAL_ADDRESS + dLocal_Addr,dLocal_Data);
FLASH_Lock(FLASH_MEMTYPE_DATA);
FLASH_ReadByte(FLASH_DATA_START_PHYSICAL_ADDRESS + dLocal_Addr)
3、自己封装了3个函数:测试通过
void MEEPROM_Init(void);//用于第一次上电及上电初始化
void MEEPROM_WriteByte(u16 dLocal_Addr,BYTE dLocal_Data);//写一个数据到EEPROM中
BYTE MEEPROM_ReadByte(u16 dLocal_Addr);//从EEPROM中,读取一个字节的数据
4、整个函数包:一个头文件,一个.C函数体文件
*/
/********************** 系统变量及头文件 *********************************/
#ifndef __A20_EEPROM_CON_H
#define __A20_EEPROM_CON_H
//--EEPROM中存储数据地址的分配----------------------------------------
#define MACOR_EEADDR_SYSINT 0
#define MACOR_EEADDR_DIPMODE 1
void MEEPROM_Init(void);
void MEEPROM_WriteByte(u16 dLocal_Addr,BYTE dLocal_Data);
BYTE MEEPROM_ReadByte(u16 dLocal_Addr);
#endif
/**********************
STM8内部EEPROM读写程序
***********************/
#include "stm8s.h"
#include "A00_main.h"
/********************************************************************
****1.EEPROM数据初始化
*********************************************************************/
void MEEPROM_Init(void)
{
BYTE dLocal_1;
FLASH_DeInit();
dLocal_1 = MEEPROM_ReadByte(MACOR_EEADDR_SYSINT);
if(dLocal_1 == 0xAA) //EEPROM区有初始化
{
//时钟显示模式相关初始化
dSYS_DipMode = MEEPROM_ReadByte(MACOR_EEADDR_DIPMODE);
if(dSYS_DipMode == 1) //进入动态显示
{
dClock_RollNUM = 0;
dClock_RollTmr = 0;
str_SysClock.dClock_SetBit = 0;
MClock_Sec_Dot_OnOff(DISABLE);
}
else //进入时分显示
{
MClock_Sec_Dot_OnOff(ENABLE);
str_SysClock.dClock_SetBit = 3;
}
}
else //初次上电,EEPROM区需要初始化
{
//时钟显示模式相关初始化
dSYS_DipMode = 0;
MClock_Sec_Dot_OnOff(ENABLE);
str_SysClock.dClock_SetBit = 3;
MEEPROM_WriteByte(MACOR_EEADDR_SYSINT,0xAA);
MEEPROM_WriteByte(MACOR_EEADDR_DIPMODE,dSYS_DipMode);
}
return;
}
/*******************************************************************************
****2.EEPROM中写入一个字节
**** dLocal_Addr:EEPROM中的地址,从0开始,在函数写时,加入了初始地址 FLASH_DATA_START_PHYSICAL_ADDRESS
**** 当前EEPROM空间为:0x4000--0x43FF;该参量的取值范围:0 - 0x3FF
**** dLocal_Data:要写入EEPOM中的数据
*******************************************************************************/
void MEEPROM_WriteByte(u16 dLocal_Addr,BYTE dLocal_Data)
{
FLASH_Unlock(FLASH_MEMTYPE_DATA);
while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);
FLASH_ProgramByte(FLASH_DATA_START_PHYSICAL_ADDRESS + dLocal_Addr,dLocal_Data);
FLASH_Lock(FLASH_MEMTYPE_DATA);
return;
}
/*******************************************************************************
****3.从EEPROM中读取一个字节
**** dLocal_Addr:EEPROM中的地址,从0开始,在函数写时,加入了初始地址 FLASH_DATA_START_PHYSICAL_ADDRESS
**** 当前EEPROM空间为:0x4000--0x43FF;该参量的取值范围:0 - 0x3FF
*******************************************************************************/
BYTE MEEPROM_ReadByte(u16 dLocal_Addr){
BYTE dLocal_1;
dLocal_1 = FLASH_ReadByte(FLASH_DATA_START_PHYSICAL_ADDRESS + dLocal_Addr);
return dLocal_1;
}
上一篇:EEPROM读写操作常见的陷阱
下一篇:STC单片机片内EEPROM的读写
推荐阅读最新更新时间:2024-03-16 16:09