STC32G库函数(四)——EEPROM

首先,我们先来看一下EEPROM是什么意思:EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。

而STC32G系列的单片机拥有IAP的功能,可以将内部Data Flash当做EEPROM,也就是可以对程序存储区进行擦写想要在断电时依旧保存的数据。stc32g12k128拥有128kB的程序储存区,全部用来存放程序肯定是用不完的,所以还剩下很多的空间可以当做EEPROM,这对某些项目要求的是很有必要的。

接下来我们看一下怎样利用库函数进行IAP/EEPROM的操作:首先肯定是先将STC32G_EEPROM.c这个源文件添加到工程文件中。

#include "STC32G_EEPROM.h"

//========================================================================
// 函数: void ISP_Disable(void)
// 描述: 禁止访问ISP/IAP.
// 参数: non.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void DisableEEPROM(void)
{
	IAP_CONTR = 0;			//禁止IAP操作
	IAP_CMD   = 0;			//去除IAP命令
	IAP_TRIG  = 0;			//防止IAP命令误触发
	IAP_ADDRE = 0xff;   //将地址设置到非 IAP 区域
	IAP_ADDRH = 0xff;   //将地址设置到非 IAP 区域
	IAP_ADDRL = 0xff;
}

//========================================================================
// 函数: void EEPROM_Trig(void)
// 描述: 触发EEPROM操作.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2014-6-30
//========================================================================
void EEPROM_Trig(void)
{
	F0 = EA;    //保存全局中断
	EA = 0;     //禁止中断, 避免触发命令无效
	IAP_TRIG = 0x5A;
	IAP_TRIG = 0xA5;                    //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
																			//送完A5H后,IAP命令立即被触发启动
																			//CPU等待IAP完成后,才会继续执行程序。
	_nop_();   //由于STC32G是多级流水线的指令系统,触发命令后建议加4个NOP,保证IAP_DATA的数据完成准备
	_nop_();
	_nop_();
	_nop_();
	EA = F0;    //恢复全局中断
}

//========================================================================
// 函数: void EEPROM_read_n(u32 EE_address,u8 *DataAddress,u16 number)
// 描述: 从指定EEPROM首地址读出n个字节放指定的缓冲.
// 参数: EE_address:  读出EEPROM的首地址.
//       DataAddress: 读出数据放缓冲的首地址.
//       number:      读出的字节长度.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void EEPROM_read_n(u32 EE_address,u8 *DataAddress,u16 number)
{
	IAP_ENABLE();                           //设置等待时间,允许IAP操作,送一次就够
	IAP_READ();                             //送字节读命令,命令不需改变时,不需重新送命令
	do
	{
		IAP_ADDRE = (u8)(EE_address >> 16); //送地址高字节(地址需要改变时才需重新送地址)
		IAP_ADDRH = (u8)(EE_address >> 8);  //送地址中字节(地址需要改变时才需重新送地址)
		IAP_ADDRL = (u8)EE_address;         //送地址低字节(地址需要改变时才需重新送地址)
		EEPROM_Trig();                      //触发EEPROM操作
		*DataAddress = IAP_DATA;            //读出的数据送往
		EE_address++;
		DataAddress++;
	}while(--number);

	DisableEEPROM();
}

//========================================================================
// 函数: void EEPROM_SectorErase(u32 EE_address)
// 描述: 把指定地址的EEPROM扇区擦除.
// 参数: EE_address:  要擦除的扇区EEPROM的地址.
// 返回: non.
// 版本: V1.0, 2013-5-10
//========================================================================
void EEPROM_SectorErase(u32 EE_address)
{
	IAP_ENABLE();                       //设置等待时间,允许IAP操作,送一次就够
	IAP_ERASE();                        //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
																			//只有扇区擦除,没有字节擦除,512字节/扇区。
																			//扇区中任意一个字节地址都是扇区地址。
	IAP_ADDRE = (u8)(EE_address >> 16); //送扇区地址高字节(地址需要改变时才需重新送地址)
	IAP_ADDRH = (u8)(EE_address >> 8);  //送扇区地址中字节(地址需要改变时才需重新送地址)
	IAP_ADDRL = (u8)EE_address;         //送扇区地址低字节(地址需要改变时才需重新送地址)
	EEPROM_Trig();                      //触发EEPROM操作
	DisableEEPROM();                    //禁止EEPROM操作
}

//========================================================================
// 函数: void EEPROM_write_n(u32 EE_address,u8 *DataAddress,u16 number)
// 描述: 把缓冲的n个字节写入指定首地址的EEPROM.
// 参数: EE_address:  写入EEPROM的首地址.
//       DataAddress: 写入源数据的缓冲的首地址.
//       number:      写入的字节长度.
// 返回: non.
// 版本: V1.0, 2012-10-22
//========================================================================
void EEPROM_write_n(u32 EE_address,u8 *DataAddress,u16 number)
{
	IAP_ENABLE();                       //设置等待时间,允许IAP操作,送一次就够
	IAP_WRITE();                        //宏调用, 送字节写命令
	do
	{
		IAP_ADDRE = (u8)(EE_address >> 16); //送地址高字节(地址需要改变时才需重新送地址)
		IAP_ADDRH = (u8)(EE_address >> 8);  //送地址中字节(地址需要改变时才需重新送地址)
		IAP_ADDRL = (u8)EE_address;         //送地址低字节(地址需要改变时才需重新送地址)
		IAP_DATA  = *DataAddress;         //送数据到IAP_DATA,只有数据改变时才需重新送
		EEPROM_Trig();                    //触发EEPROM操作
		EE_address++;                     //下一个地址
		DataAddress++;                    //下一个数据
	}while(--number);                   //直到结束
	DisableEEPROM();
}

而我们在调用是也是很方便的,直接调用EEPROM_read_n()函数读和调用EEPROM_write_n()函数写就行。关于EEPROM大小的设置,这个需要在烧录软件上设置:如图所示将EEPROM设置为64k(注意:无论EEPROM设置为多少,EEPROM的地址始终从FE:0000h开始)

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值