/*******************************************************************************
Copyright (C), 2003-2009, winpark Electronics Co., Ltd.
Flie name: for STM8Sxxx--eeprom
Author: black.lu
Version: V1.00
Date: 2010-6-29
Description:对STM8系列单片机的内部EEPROM进行操作
*******************************************************************************/
#include "File_Include.h"
//----------------------------------------------------------
#define MASS_KEY1 0XAE //写操作密钥,注意FLASH与EEPROM的密钥相反
#define MASS_KEY2 0X56
//----------------------------------------------------------
/***********************************************************
* 函数:void STM8_EEPROM_Init(void)
* 说明:EEPROM的寄存器初始化
* 参数:无
* 输出:无
* 返回:无
***********************************************************/
void STM8_EEPROM_Init(void)
{
//都初始化为默认值
FLASH_CR1=0X00;
FLASH_CR2=0X00;
FLASH_NCR2=0XFF;
}
/***********************************************************
* 函数:void STM8_EEPROM_MASS(void)
* 说明:对STM8的EEPROM写使能和写保护
* 参数:bool mass_en
0--写保护
1--写使能
* 输出:无
* 返回:无
***********************************************************/
void STM8_EEPROM_MASS(bool mass_en)
{
if(mass_en) //写使能
{
FLASH_DUKR=MASS_KEY1;
FLASH_DUKR=MASS_KEY2;
while(!FLASH_IAPSR_DUL)asm("nop"); //等待硬件置位
}
else //写保护
{
FLASH_IAPSR_DUL=0;
}
}
/***********************************************************
* 函数:void STM8_EEPROM_Write_Byte(void)
* 说明:EEPROM写一字节函数
* 参数:uint16 address----写入数据的地址
uint8 dat----写入的一字节数据
bool mass_en----密钥开启选择
* 输出:无
* 返回:无
***********************************************************/
void STM8_EEPROM_Write_Byte(uint16 address, uint8 dat, bool mass_en)
{
if(mass_en) //是否需要密钥
{
STM8_EEPROM_MASS(1); //密钥使能
}
*((uint8 *)address)=dat; //写入地址
// STM8_EEPROM_MASS(0); //禁止写入,直接在使用时将其禁止
}
/***********************************************************
* 函数:uint8 STM8_EEPROM_Read_Byte(uint8 address)
* 说明:EEPROM读取地址一字节函数
* 参数:address----需要读取的地址
* 输出:无
* 返回:uint8
***********************************************************/
uint8 STM8_EEPROM_Read_Byte(uint16 address)
{
uint8 lc_dat_buf;
lc_dat_buf=*((uint8 *)address); //读取偏移地址数据
return lc_dat_buf;
}
/***********************************************************
* 函数:void STM8_EEPROM_Write_NByte(void)
* 说明:EEPROM写N字节函数
* 参数:uint16 address----写入数据的起始地址的地址
uint8 *p----写入的数据指针
uint8 n-----写入的个数
* 输出:无
* 返回:无
***********************************************************/
void STM8_EEPROM_Write_NByte(uint16 address, uint8 *p, uint8 n)
{
uint16 lc_adr_buf;
uint8 i;
STM8_EEPROM_MASS(1); //密钥使能
lc_adr_buf=address; //起始地址
for(i=0;i<n;i++)
{
*((uint8 *)lc_adr_buf)=*p;
lc_adr_buf++;
p++;
}
STM8_EEPROM_MASS(0); //禁止写入
}
/***********************************************************
* 函数:void STM8_EEPROM_Read_NByte(void)
* 说明:EEPROM读N字节函数
* 参数:uint16 address----读取的数据的起始偏移地址
uint8 *p----读取后存入的首地址
uint8 n-----读取的个数
* 输出:无
* 返回:无
***********************************************************/
void STM8_EEPROM_Read_NByte(uint16 address, uint8 *p, uint8 n)
{
uint16 lc_adr_buf;
uint8 i;
for(i=0;i<n;i++)
{
*p=*((uint8 *)lc_adr_buf);
p++;
lc_adr_buf++;
}
}