EEPROM是单片机应用系统中经常会用到的存储器,它主要用来保存一些掉电后需要保持不变的数据。在以前的单片机系统中,通常都是在单片机外面再扩充一个EEPROM芯片,这种方法除了增加成本外,也降低了可靠性。现在,很多单片机的公司都推出了集成有小容量EEPROM的单片机,这样就方便了使用,降低了成本,提高了可靠性。STM8单片机芯片内部也集成有EEPROM,容量从640字节到2K字节。最为特色的是,在STM8单片机中,对EEPROM的访问就象常规的RAM一样,非常方便。EEPROM的地址空间与内存是统一编址的,地址从004000H开始,大小根据不同的芯片型号而定。
示例程序
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "stm8s207R8.h"
#include "prohead.h"
/***************************************************************
*********************************/
/********************************************************************************************************
* Function: Derive_FlashUNLock
* Object: 解锁ROM
* 输入: 无
* 输出: 无
* 备注: 无
********************************************************************************************************/
void Derive_FlashUNLock(void)
{
do
{
FLASH_DUKR = 0xae; // 写入第一个密钥
FLASH_DUKR = 0x56; // 写入第二个密钥
}
while(!(FLASH_IAPSR&CHSBIT3)); // 等待解锁
}
/********************************************************************************************************
* Function: Derive_EPWrite
* Object: 写EEPROM
* 输入: 头地址(0~1535) 数据指针 数据长
* 输出: 无
* 备注: 1.5K EEPROM 不能超过
********************************************************************************************************/
void Derive_EPWrite(u16 Adr, u8 *pData, u16 Len)
{
u8 *p;
//p指针指向EEPROM 对应的单元
p = (u8*)0x4000 + Adr;
//解锁
Derive_FlashUNLock();
//写数据
for( ; Len > ZERO; Len--)
{
*p++ = *pData++;
//等待写完成
while(!(FLASH_IAPSR&CHSBIT2));
}
//加锁
FLASH_IAPSR &= CLRBIT1;
}
/********************************************************************************************************
* Function: Derive_EPRead
* Object: 读EEPROM
* 输入: 头地址(0~1535) 数据存放指针 数据长
* 输出: 无
* 备注: 1.5K EEPROM
********************************************************************************************************/
void Derive_EPRead(u16 Adr, u8 *pData, u16 Len)
{
u8 *p;
//p指针指向EEPROM 对应的单元
p = (u8*)0x4000 + Adr;
//解锁
Derive_FlashUNLock();
//读数据
for( ; Len > ZERO; Len--)
*pData++ = *p++;
//加锁EEPROM
FLASH_IAPSR &= CLRBIT1;
}
main()
{
//STM8S 207R8 共有1.5K字节EEPROM
u8 num[]={0,1,2,3,4,5,6,7,8,9};
//从EERPOM首地址开始 写入0~9
Derive_EPWrite(0, num, sizeof(num));
//从EERPOM首地址开始 读入10个数进num数组
Derive_EPRead(0, num, sizeof(num));
//OK
while (1);
}