海尔hr7p90单片机Flash空间当数据EEPROM源程序
在群中网友及版主的协助下,把hr7p90芯片的Falsh在系统编程功能进行了封装,这样就可以将掉电要保存的数据存放在芯片的Flash区,下次上电时重新读取。采用这个功能,就可省掉需外置24或93存储器的麻烦,但如果将芯片重新烧写程序时,存放在Flash中的EEPROM数据也会全部变为FF。代码如下:有异常请联系我进行修正。
//通过IAP读写芯片的Flash空间,用于保存掉电需恢复的数据
#include "hic.h"
#include "hr7p90h.h"
#define uchar unsigned char
#define uintunsigned int
/************************************************************************************************************
*函数:unsigned int ReadUnit(unsigned int unit)
*功能:读取某个FLASH单元的值并返回。
*输入:unit,单元地址
*输出:temp,单元值
************************************************************************************************************/
unsigned int ReadUnit(unsigned int unit)
{
unsigned int temp;
FRAH = unit/256;
FRAL = unit%256;
__Asm TBR;
temp = ROMDH*256+ROMDL;
return temp;
}
/************************************************************************************************************
*函数:void EraseFlashPro(void)
*功能:产生FLASH擦除时序。
*输入:无
*输出:无
************************************************************************************************************/
void EraseFlashPro(void)
{
GIE = 0;
MEWS = 1; //ERASE
WREN = 1;
ROMCH = 0X55;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
ROMCH = 0XAA;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
MTRG = 1;
while(MTRG);
GIE = 1;
}
/************************************************************************************************************
*函数:void WriteFlashPro(void)
*功能:产生FLASH写入时序。
*输入:无
*输出:无
************************************************************************************************************/
void WriteFlashPro(void)
{
GIE = 0;
MEWS = 0; //ERASE
WREN = 1;
ROMCH = 0X55;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
ROMCH = 0XAA;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
__Asm nop;
MTRG = 1;
while(MTRG);
GIE = 1;
}
/***********************************************************************************
*函数:void EraseFlashPage(unsigned char page)
*功能:擦除某页FLASH,HR7P90的地址空间为0-0x3FFF,所以擦除的页号为0-63
*输入:page,页
*输出:无
************************************************************************************************************/
void EraseFlashPage(unsigned char page)
{
//lect flash page
FRAH = page;
//erase the flash page
EraseFlashPro();
}
/************************************************************************************************************
*函数:void WriteProBufUnit(unsigned int unit,unsigned int data)
*功能:设置写入单元的地址指针unit,将写入数据放入编程缓冲器。执行WriteFlashPro后将数据写入设置的FLASH单元
*输入:unit,单元地址
*输出:无
************************************************************************************************************/
void WriteProBufUnit(unsigned int unit,unsigned int data)
{
//write data to probuff
FRAH = unit/256;
FRAL = unit%256;
ROMDL = data%256;
ROMDH = data/256;
__Asm TBW;
}
//以下为新增的应用层接口,实现读写Flash中1个区的内容
//由于目前IDE只支持将1个Sector定义成数组,故1页Falsh的空间只用1个区来读写
section3unsigned char FlashWriteDataBuff;
#define c_CurrentFlashPageNo 0x3F //HR7P90h的最后1页,共计1K字节的内容
uchar ReadMCUFlash(uchar ucAddress)
{
uchar ucCount;
uchar ucBufferAddr;
ucBufferAddr = 0;
for(ucCount=0; ucCount<64; ucCount++)
{
FRAH = c_CurrentFlashPageNo;
FRAL = ucCount;
__Asm TBR;
FlashWriteDataBuff = ROMDH;
FlashWriteDataBuff = ROMDL;
}
return(FlashWriteDataBuff);
}
void NewWriteMCUFlash(uchar ucAddress,uchar ucWriteData)
{
uchar ucCount;
uchar ucBufferAddr;
//将1区数据读取到内存缓冲区
ucBufferAddr = 0;
for(ucCount=0; ucCount<64; ucCount++)
{
FRAH = c_CurrentFlashPageNo;
FRAL = ucCount;
__Asm TBR;
FlashWriteDataBuff = ROMDH;
FlashWriteDataBuff = ROMDL;
}
//修改指定单元的内容
FlashWriteDataBuff = ucWriteData;
//擦除指定页的全部空间
FRAH = c_CurrentFlashPageNo;
//erase the flash page
EraseFlashPro();
//将缓冲区的内容写回Flash编程缓冲区
//将1区数据回写到Flash编程缓冲表
ucBufferAddr = 0;
for(ucCount=0; ucCount<64; ucCount++)
{
FRAH = c_CurrentFlashPageNo;
FRAL = ucCount;
ROMDH = FlashWriteDataBuff ;
ROMDL = FlashWriteDataBuff ;
__Asm TBW;
}
//执行Flash编程缓冲表写入存储器的操作
WriteFlashPro();
}
主调程序写法如下:
// ReadMCUFlash(99);
// NewWriteMCUFlash(0x00,0x5A);
// ucTemp = ReadMCUFlash(0x00);
// NewWriteMCUFlash(0x00,0xA5);
// ucTemp = ReadMCUFlash(0x00);
// NewWriteMCUFlash(0x00,0xAA);
// ucTemp = ReadMCUFlash(0x00);
// NewWriteMCUFlash(0x00,0x55);
// ucTemp = ReadMCUFlash(0x00);
页:
[1]