stm8s--eeprom

要点,擦除数据就是写入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);
}

你可能感兴趣的:(stm8s--eeprom)