请教如何调用文件 掉电不丢失
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
//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);
}
}
//
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』