单片机
返回首页

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

2020-02-16 来源:51hei

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


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<*Len;i++)

        {

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

        }

}

//

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章