×
单片机 > 单片机程序设计 > 详情

STC单片机内置EEPROM读取与保存 函数调用 .c和.h文件

发布时间:2020-08-27 发布时间:
|

请教如何调用文件  掉电不丢失


1、读取3参数个数  改动后 保存到 EEPROM

我的用法是 :


unsigned int  Temp_Buf[3];                           //定义缓存:

Read_Flash_Message(ks_Addr,Temp_Buf, 3);//读取:函数是:void Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len);


Save_Flash_Message(ks_Addr,Temp_Buf, 3);//保存    函数是 :void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len);


现在是  无法保存  调取的也不对


//以下为.h文件

//使用单片机内部的Flash,模拟EEPROM使用

//STC15W4K48S4 单片机,可以使用IAP命令擦写内部Flash

//起始地址 0X0000 结束 0X27FF  其中,512Byte一个扇区

//一共20个扇区  一个扇区可以存储一组参数,这样就可以直接擦出整个扇区修改内容


#ifndef        __IAP_EEPROM__H_

#define        __IAP_EEPROM__H_

#include "STC15W.h"

#include "intrins.h"



#define        ks_Addr                                0X0000

#define        tz_Addr                                0X0200

#define        tm_Addr                                0X0400




//保存内容到Flash

void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len);

//从Flash读取内容

void Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len);

//读取某地址一个字节

unsigned char Read_One_Byte(unsigned int addr);

void Erase_IAP(unsigned int addr);

void Write_One_Byte(unsigned int addr,unsigned char dat);


#endif


以下为.c文件


#include "IAP_EEPROM.h"

//#include //用来CLI交互

//STC15W4K48S4 单片机,可以使用IAP命令擦写内部Flash

//起始地址 0X0000 结束 0X27FF  其中,512Byte一个扇区


//关闭IAP功能

void Close_IAP(void)

{

        IAP_CONTR = 0;

        IAP_CMD = 0;

        IAP_TRIG = 0;

        IAP_ADDRH = 0;

        IAP_ADDRL = 0;

}

//擦除某地址所在的扇区

void Erase_IAP(unsigned int addr)

{

                IAP_CONTR = 0x82;//允许IAP操作,设置IAP操作速度         

    IAP_CMD = 0x03;//扇区擦除命令            

    IAP_ADDRL = addr;              

    IAP_ADDRH = addr >> 8;//地址赋值          

    IAP_TRIG = 0x5a;                

    IAP_TRIG = 0xa5;//触发命令               

    _nop_();_nop_();_nop_();            

    Close_IAP();//清空IAP操作寄存器等

}

//在某地址写入一个字节

void Write_One_Byte(unsigned int addr,unsigned char dat)

{

                IAP_CONTR = 0x82;//允许IAP操作,设置IAP操作速度   

    IAP_CMD = 0x02;//IAP写命令

    IAP_ADDRL = addr;

    IAP_ADDRH = addr >> 8;//地址赋值

    IAP_DATA = dat;//更新写寄存器

    IAP_TRIG = 0x5a;

    IAP_TRIG = 0xa5;//触发

    _nop_();

    Close_IAP();//清空IAP操作寄存器等

}

//读取某地址一个字节

unsigned char Read_One_Byte(unsigned int addr)

{

                unsigned char dat=0;//定义一个待返回的数据

    IAP_CONTR = 0x82;//允许IAP

    IAP_CMD = 0x01;//IAP读命令

    IAP_ADDRL = addr;

    IAP_ADDRH = addr >> 8;//地址赋值

    IAP_TRIG = 0x5a;

    IAP_TRIG = 0xa5;//触发

    _nop_();_nop_();_nop_();_nop_();

    dat = IAP_DATA;

                Close_IAP();//清空IAP操作寄存器等

    return dat;

}

//保存内容到Flash

void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len)

{

        unsigned int i=0;

        Erase_IAP(Addr);//擦除对应扇区

        

        if(Len >= 511)

                Len = 511;

        

        Write_One_Byte(Addr,Len>>8);//长度写入首地址

        Write_One_Byte(Addr+1,(Len&0X00FF));//长度写入首地址

        for(i=0;i

        {

                Write_One_Byte((Addr+2+i),Buf[i]);

        }

}

//从Flash读取内容

void Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len)

{

        unsigned int i=0;

        *Len = Read_One_Byte(Addr); //首先读取长度信息

        *Len <<= 8;

        *Len += Read_One_Byte(Addr+1);

        

        if(*Len >= 511)

                *Len = 511;

        

        for(i=0;i

        {

                Buf[i] = Read_One_Byte(Addr+2+i);

        }

}

//



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容