STC15单片机的EEPROM编程


STC15单片机是一个8位的单片机,据说在世界上销量最大,是国产的品牌。其中也有许多值得称道的地方,比如不用晶振,不用外部的存储器,Flash可以做内存使用等。可以进入休眠状态,外部中断就可以唤醒等。在用户需要保持数据,当掉电可以保存这些数据,等下次启动后继续使用数据。这个功能的完成要在程序中通过指令修改Flash或者是EEPROM的内容,这样在掉电时就不会丢失数据,等上电后通过初始化继续使用。下面介绍一下Flash或者时EEPROM的文件如何修改和保存。

修改EEPROM存储器的内容

要对EEPROM的内容进行修改,主要用到下面的程序:

  • 读取
  • 写入
  • 删除扇区

下面介绍这些分程序并加以说明

读取

void IapRead_n(u16 addr, u8 *DataAddr, u16 number)
{
    
    
	EA = 0;      			// disable interrupt
 	IAP_CONTR = ENABLE_IAP;  		// Enable IAP
	IAP_CMD = CMD_READ;   			// 设置IAP命令
 	do
 	{
    
    
  		IAP_ADDRL = addr;   // 低字节
  		IAP_ADDRH = addr >> 8;  // 设置IAP地址高字节
  		IAP_TRIG = 0x5A;     // 写触发命令(0x5A)
  		IAP_TRIG = 0xA5;     // 写触发命令(0xA5)
  		_nop_();       		// 等待ISP/IAP/EEPROM操作完成
  		*DataAddr = IAP_DATA;    // 读取的数据送给 DataAddr
  		addr++;
  		DataAddr++;
 	} while(--number);
	IapIdle();
 	EA = 1;
}

程序中不难理解,这个程序没有返回的数据,直接通过指针直接将EEPROM的内容传递给了目标区域的数据。即通过*DataAddr改变了存储在DataAddr指针下的数据。

写入

void IapWrite_n(u16 addr, u8 *DataAddr, u16 number)
{
    
    
 	EA = 0;       // 禁止中断
 	IAP_CONTR = ENABLE_IAP;   // Enable IAP
 	IAP_CMD = CMD_PROGRAM;   // 设置IAP命令
 	do
 	{
    
    
  		IAP_ADDRL = addr;   // 低字节
  		IAP_ADDRH = addr >> 8;  // 设置IAP地址高字节  
  		IAP_DATA = *DataAddr;  // DataAddr赋值给ISP_DATA
  		IAP_TRIG = 0x5A;   // 写触发命令(0x5A)
  		IAP_TRIG = 0xA5;   // 写触发命令(0xA5)
  		_nop_();     // 等待ISP/IAP/EEPROM操作完成
  		addr++;
  		DataAddr++;
 	}while(--number);
 	IapIdle();
 	EA = 1;
}

写入程序和读取程序基本是相反的操作,也没有返回的数据,直接用指针将外部数据写入到EEPROM中。

删除扇区

在程序中要用到删除扇区操作。

void IapEraseSector(WORD addr)
{
    
    
	 EA = 0;        // 关闭中断
	 IAP_CONTR = ENABLE_IAP;    // 使能IAP
	 IAP_CMD = CMD_ERASE;    // 设置IAP命令
	 IAP_ADDRL = addr;     // 设置IAP地址低字节
	 IAP_ADDRH = addr >> 8;    // 设置IAP地址高字节
	 IAP_TRIG = 0x5A;     // 写触发命令(0x5A)
	 IAP_TRIG = 0xA5;     // 写触发命令(0xA5)
	 _nop_();       // 等待ISP/IAP/EEPROM操作完成
	 IapIdle();
	 EA = 1;        // 打开中断
	
}

在程序中使用

在程序如果是读取数据的话可以直接使用读取分程序。如果是写入操作则首先要将写入的扇区擦除,即将写入扇区的内容全部写成0xFF。然后再使用写操作。擦除是按扇区来操作的,比如要写入的扇区地址为0xE400,则用下面的命令来删除115页的内容:
IapEraseSector(0xE400);然后再用写入分程序将要写入的内容写入EEPROM中。

猜你喜欢

转载自blog.csdn.net/weixin_44481398/article/details/92429730