搜索
bottom↓
回复: 0

海尔hr7p90单片机Flash空间当数据EEPROM源程序

[复制链接]

出0入0汤圆

发表于 2013-11-4 22:17:06 | 显示全部楼层 |阅读模式
在群中网友及版主的协助下,把hr7p90芯片的Falsh在系统编程功能进行了封装,这样就可以将掉电要保存的数据存放在芯片的Flash区,下次上电时重新读取。采用这个功能,就可省掉需外置24或93存储器的麻烦,但如果将芯片重新烧写程序时,存放在Flash中的EEPROM数据也会全部变为FF。
代码如下:有异常请联系我进行修正。
//通过IAP读写芯片的Flash空间,用于保存掉电需恢复的数据

#include "hic.h"
#include "hr7p90h.h"

#define uchar unsigned char
#define uint  unsigned 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个区来读写

section3  unsigned char FlashWriteDataBuff[128];
#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[ucBufferAddr++] = ROMDH;
                FlashWriteDataBuff[ucBufferAddr++] = ROMDL;               
        }
        return(FlashWriteDataBuff[ucAddress]);
}

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[ucBufferAddr++] = ROMDH;
                FlashWriteDataBuff[ucBufferAddr++] = ROMDL;               
        }
//修改指定单元的内容
        FlashWriteDataBuff[ucAddress] = 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[ucBufferAddr++] ;

                ROMDL = FlashWriteDataBuff[ucBufferAddr++] ;
                __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);


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 17:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表