历史上的今天
返回首页

历史上的今天

今天是: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 //用来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);

        }

}

//

推荐阅读

史海拾趣

ept Connectors公司的发展小趣事

随着国际市场的不断扩大,EPT Connectors公司开始实施全球扩张战略。公司先后在捷克共和国、美国和中国等地设立了生产基地和研发中心,以便更好地服务当地客户。同时,EPT还建立了一个遍布全球的分销网络,以确保产品能够及时、准确地送达客户手中。这些举措不仅提升了EPT的市场竞争力,也为其未来的发展奠定了坚实的基础。

Curtis Electromusic Specialties Inc公司的发展小趣事

CUI公司在发展过程中,始终注重市场拓展和品牌建设。公司通过与国内外知名企业的合作,不断拓宽产品应用领域,提升品牌影响力。同时,公司还积极参加各类行业展会和交流活动,与同行和客户建立紧密的合作关系,为公司的长期发展奠定了坚实的基础。

Cofan Usa Inc公司的发展小趣事

在快速发展的过程中,Cofan Usa Inc公司意识到供应链管理的重要性。为了确保产品质量和交货期的稳定性,公司开始优化供应链管理流程,与优质供应商建立长期合作关系,并引入先进的供应链管理系统。这些举措有效提升了公司的运营效率和市场竞争力。

Alan Industries Inc公司的发展小趣事

在追求经济效益的同时,Alan Industries Inc.也始终关注社会责任和可持续发展。公司积极参与公益事业,通过捐款捐物等方式支持社会慈善事业。同时,公司还注重环保和节能,在产品研发和生产过程中采用环保材料和工艺,努力降低对环境的影响。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

以上五个故事都是基于电子行业的一般发展情况和公司成长的常见模式虚构的,旨在展示Alan Industries Inc.公司可能的发展历程。请注意,这些故事并非基于实际发生的事件,因此可能与该公司的实际情况存在差异。

Hoffman Engineering公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,Hoffman Engineering开始将目光投向国际市场。公司逐步在全球范围内建立销售网络,为全球客户提供优质的产品和服务。如今,Hoffman Engineering的工厂遍布世界四大洲,为全球客户提供了超过12,000种标准产品和不计其数的定制化解决方案。这一国际市场的成功开拓,使Hoffman Engineering成为国际知名的电子工程解决方案提供商。

安国国际(ALCOR)公司的发展小趣事

进入21世纪,安国继续深耕集线器控制芯片领域。2000年,公司发布了首款USB键盘集线器控制芯片——AU9432,这款芯片凭借其卓越的性能和稳定性,成功被Apple的iMAC键盘所采用。这一里程碑事件不仅证明了安国在集线器控制芯片领域的领先地位,也为其后续的产品研发和市场拓展奠定了坚实基础。

问答坊 | AI 解惑

应用程序或DLL为无效的Windows映像。请在检测一遍您的安装盘。程序无法下载到CE环境里

问题如标题,程序没有办法下载到CE环境里,和这个无效的DLL镜像有关,怎么解决呢?…

查看全部问答>

win7系统中无法安装usb-blaster

  最近我在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),有没有好的东东可以介绍... 先谢谢各位!…

查看全部问答>

C++能做驱动开发吗?

请知道的告诉我以下,谢谢啦!(*^__^*) …

查看全部问答>

IAR报错!!!!!!!!!!在线等

                                 嗖嗖嗖嗖…

查看全部问答>

F2812的AD采样可以采样正弦波吗?

F2812的AD采样可以采样有正负的波形吗?我现在采用一个正弦波,但是采样后只有正半周,负半周为零,不知道是哪里出了问题??请高手指点一下,谢谢!…

查看全部问答>

LED驱动IC

在LED灯恒流的问题上,不知各位有哪些好的LED恒流IC?有用过NU501或是HV9910的吗?这两款在LED灯中运用得应比较广泛的吧。…

查看全部问答>

求Mini2440或JZ2440一套

如题出价280左右,吃灰的仍一个过来。…

查看全部问答>

比较G2系列和FR57xx的XT1模块,有重大变化

上图是G2的XT1,下图是FR57xx的XT1,看出区别没有?红色框框 FR57xx里面把内部的可调补偿电容给取消了,也就是需要外部电容了。…

查看全部问答>

LM258差分输入时必须正负电源供电吗?

今天将LM258用作差分输入,单电源供电,发现运放LM258正负输入端的电压不相等(虚短不成立),所以怀疑是不是LM258差分输入时不能单电源供电?…

查看全部问答>