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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
|