历史上的今天
今天是:2025年02月16日(星期日)
2020年02月16日 | 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 //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); } } //
上一篇:单片机指纹识别程序
下一篇:单片机驱动EC11编码器
史海拾趣
|
最近我在win7的操作系统中一直无法安装usb-blaster驱动程序,导致我无法在quartus II软件中下载程序,如图F:\\picture\\no hardware.jpg 但是我在安装usb-blaster驱动程序的时候,系统弹出对话框F:\\picture\\drivers.jpg,我怀疑是因 ...… 查看全部问答> |
|
想从上层开发(asp.net..c#) 转到 底层的嵌入开发(C)....请前辈指点....回答必得分 现在以有一年的上层开发经验....对asp.net..c# 什么的开发都 比较行了... 但现在有一个很好的机会 ...不过是做底层的嵌入开发(C).... 请高手给点好的意见...... 如果转入嵌入开发(C),有没有好的东东可以介绍... 先谢谢各位!… 查看全部问答> |
|
F2812的AD采样可以采样有正负的波形吗?我现在采用一个正弦波,但是采样后只有正半周,负半周为零,不知道是哪里出了问题??请高手指点一下,谢谢!… 查看全部问答> |
|
上图是G2的XT1,下图是FR57xx的XT1,看出区别没有?红色框框 FR57xx里面把内部的可调补偿电容给取消了,也就是需要外部电容了。… 查看全部问答> |
|
今天将LM258用作差分输入,单电源供电,发现运放LM258正负输入端的电压不相等(虚短不成立),所以怀疑是不是LM258差分输入时不能单电源供电?… 查看全部问答> |




