gdrc 发表于 2013-11-4 22:17:06

海尔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]
查看完整版本: 海尔hr7p90单片机Flash空间当数据EEPROM源程序