要点,擦除数据就是写入0
1.寄存器操作
void EEPROM_init(void)
{
do
{
FLASH_CR1=0x00;
FLASH_CR2=0x00;
FLASH_NCR2=0xFF;
FLASH_DUKR = 0xAE; // 写入第一个密钥
FLASH_DUKR = 0x56; // 写入第二个密钥
}
while((FLASH_IAPSR & 0x08) == 0); // 若解锁未成功,则重新再来}还有一个加锁的功能,一
}
void EEPROM_lock(void)
{
FLASH_IAPSR=(u8)(~0x08); //重新上锁
}
//EEPROM指定地址写入一个数据
//addr:相对地址 dat:数据
void EEPROM_write(unsigned char addr, unsigned char dat)
{
unsigned char *p;
p=(unsigned char *)(EP_HEADER_ADDR + addr);
*p=dat;
while(!(FLASH_IAPSR&0x04)); //等待写操作成功
}
//EEPROM指定地址读出一个数据addr:相对地址
unsigned char EEPROM_read(unsigned char addr)
{
unsigned char *p;
p=( unsigned char *)(EP_HEADER_ADDR + addr);
return *p;
}
2库函数操作
uint8_t Timer_Setting[6][10];
/*******************************************************************************
* ==EEPROM初始化函数==
* FLASH_DeInit(); --> 复位EEPROM的寄存器值
* FLASH_Unlock(FLASH_MEMTYPE_DATA); --> 解锁 对 Data EEPROM memory 进行操作
*FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD); --> 标准编程时间
*******************************************************************************/
void EEPROM_INIT(void)
{
FLASH_DeInit();
FLASH_Unlock(FLASH_MEMTYPE_DATA);
FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
}
#define EEPROM_HEAD_ADDR 0x004000
//当写EEPROM时,将此字节的数据写入到EEPROM的首地址,表示操作过EEPROM。
//上电读EEPROM时,若检测到EEPROM的首地址的字节为此字节则读出内部数据。
#define FLAG_VALIDDATA 0x55
//------------------------------------------------------------------------------------------------------------
// 名称: Read_EEPROM 。
// 功能: 读EEPROM,若内有有效数据则读出 。
// 调用:无 。
// 返回: 无 。
// 说明: 无。
// 形参: 无 。
// 形参取值范围: 无 。
//------------------------------------------------------------------------------------------------------------
void Read_EEPROM(void)
{
u8 i,j;
//EEPROM解除保护。
FLASH_Unlock(FLASH_MEMTYPE_DATA);
//若EEPROM的首地址即第一个字节是标志字节,可知之前向EEPROM中写入过数据,应读出。
if(FLASH_ReadByte(EEPROM_HEAD_ADDR) == FLAG_VALIDDATA)
{
//将10组共60个字节的数据从EEPROM中读出 。
for(i=0; i<10; i++)
{
for(j=0; j<6; j++)
{
Timer_Setting[i][j] = FLASH_ReadByte(EEPROM_HEAD_ADDR+1+i*6+j);
}
}
}
//EEPROM加上保护。
FLASH_Lock(FLASH_MEMTYPE_DATA);
}
//------------------------------------------------------------------------------------------------------------
// 名称: Write_EEPROM 。
// 功能: 将数据写入到EEPROM中 。
// 调用:无 。
// 返回: 无 。
// 说明: 无。
// 形参: 无 。
// 形参取值范围: 无 。
//------------------------------------------------------------------------------------------------------------
void Write_EEPROM(void)
{
u8 i,j;
//EEPROM解除保护。
FLASH_Unlock(FLASH_MEMTYPE_DATA);
//STM8S003F3一共有128字节的EEPROM空间。
//写入前,全部擦除。
for(i=0; i<128; i++)
{
FLASH_EraseByte(EEPROM_HEAD_ADDR + i);
}
//在EEPROM的首地址写入标志字节,表示EEPROM被使用过,内有有效数据。
FLASH_ProgramByte(EEPROM_HEAD_ADDR, FLAG_VALIDDATA);
//将10组共60个字节的数据写入EEPROM中。
for(i=0; i<10; i++)
{
for(j=0; j<6; j++)
{
FLASH_ProgramByte((EEPROM_HEAD_ADDR+1+i*6+j), Timer_Setting[i][j]);
}
}
//EEPROM加上保护。
FLASH_Lock(FLASH_MEMTYPE_DATA);
}