EEPROM

1、概述

ME32x系列是内嵌ARM Cortex™ M0/M3核的32位微控制器。该系列控制器由敏矽微电子有限公司自主开发,并具有自主知识产权。敏矽微电子的微控制器包括有通用MCU和专用SOC系列,具有非常高的性价比,是MCU产品升级换代和国外产品替代的最佳选择。通用功能有高精度ADC,CAN接口,I2S音频接口,UART串口,SPI接口,I2C总线接口,看门狗定时器(WDT),通用计数器/定时器。特殊接口包括人机界面控制器(LCD驱动,电容触摸按键)和马达控制功能模块。

EEPROM作为比较廉价和方便数据存储器,被广泛使用并且习惯思维。而MCU Flash与EEPROM相比,除使用方法略有差异外,作为数据存储器,所起的效果是一样的。

2、MCU Flash与EEPROM使用比较

擦除

擦除时间

编程

编程时间

硬件接口

擦写寿命

MCU Flash

扇区为单位擦除,擦除后数据为0xFF

5ms

32位word 编程

7us

通过寄存器接口设置编程,读Flash通过指针直接读

10万次

EEPROM

没有单独擦除功能

-

Byte编程

-

I2C接口

100万次

3、使用MCU Flash 存储数据举例

以ME32S003系列为例,下面说明如何使用MCU Flash 存储小量的数据(注意,本例重点在探讨实现的一个思路,程序调试请用户自行解决)。

ME32S003系列有32K Flash,我们拿出1K, 即两个扇区来存储数据,在这里约定一个数据存储单元为64 Bytes(包括标志)。

两个扇区有16个存储单元,换句话说,可以存储10万x 16 =160 次数据,远远超过EEPROM的寿命。

所有需要存储数据放在一个数据结构中,方便存储和提取数据:

#defineDATA_AREA_ADDRESS 62*512 //数据扇区起始地址
#defineDATA_AREA_SIZE 2*512 //两个扇区大小
#defineDATA_UINT_SIZE 64 //每一个存储单元大小,一定要整除扇区大小(512)
#defineDATA_UINT_FLAG 0x5555AAAA
typedef struct {
uint32_t flag;
uint32_t data1;
…
} data_uint_type;
voidflash_erase(uint32_t startaddr, uint32_t size)
{
uint32_t endaddr;
endaddr=startaddr+size;
     //erase sector
     while(startaddr<endaddr)
     {
              FMC->ADDR = startaddr; // setup addr
              FMC->CMD = 0x04; //Triggerprogramming
              while ((FMC->CMD &0x100)!=0);
              startaddr+=512;
     }
return;  
}
uint8_t flash_word_program(uint32_taddr, uint32_t worddata) //返回一个非0的数据当错误发生时
{
     //program word
              FMC->ADDR = addr; // set upaddr     
              FMC->DATA =worddata;
              FMC->CMD = 0x02; //Triggerprogramming
              while ((FMC->CMD &0x100)!=0);
              if (*(uint32_t *)addr== worddata)
      return 0;
else
      return 1;
}
data_uint_type* data_area_init(void)//返回一个指向数据单元的指针,空指针表示没有数据
{
data_uint_type* ptr;
ptr=get_last_data_uint_ptr();
if (((uint32_t) ptr==DATA_AREA_ADDRESS)&&(ptr->flag!==DATA_UINT_FLAG))
{
flash_erase(DATA_AREA_ADDRESS,DATA_AREA_SIZE);
ptr= null;
}
}
data_uint_type* get_last_data_uint_ptr(void)//返回一个指向数据单元的指针
{
uint32_tstartuintaddr,enduintaddr,temp;
startuintaddr= DATA_AREA_ADDRESS/DATA_UINT_SIZE;
enduintaddr= startuintaddr+DATA_AREA_SIZE/ DATA_UINT_SIZE-1;
while(startuintaddr!=enduintaddr)
{
              temp= (startuintaddr+ enduintaddr)>1;
              if ((data_uint_type*)(temp* DATA_UINT_SIZE)->flag==DATA_UINT_FLAG)
                       startuintaddr= temp;          
else
                enduintaddr= temp
}
startuintaddr =startuintaddr * DATA_UINT_SIZE;
if (((data_uint_type*)startuintaddr)->flag!=DATA_UINT_FLAG)
return (data_uint_type*) 0;
else
                {
                        If (startuintaddr< (DATA_AREA_ADDRESS+DATA_AREA_SIZE))
                                 {
                                          If  (((data_uint_type*)(startuintaddr+ DATA_UINT_SIZE)->flag==DATA_UINT_FLAG)
                                          return(data_uint_type*)(startuintaddr+ DATA_UINT_SIZE) ;
}else
return (data_uint_type*)(startuintaddr) ;
}
}
uint8_tstore_data_uint(data_uint_type* sur_data_ptr, data_uint_type* dst_data_ptr) //返回一个非0的数据当错误发生时
{
     uint32_t n,temp0,temp1,temp2,*dataptr;
     temp1= sizeof(data_uint_type) >>2;
if((temp1<<2)!= sizeof(data_uint_type))
     temp1++;
     temp2=(uint32_t) dst_data_ptr;
     dataptr=(uint32_t *) sur_data_ptr;
     //erase sector
     if ((DATA_AREA_ADDRESS==temp2)&&(dst_data_ptr->flag==DATA_UINT_FLAG))
     {
              flash_erase(DATA_AREA_ADDRESS, DATA_AREA_SIZE);//erase whole data sectors
     }
     for (n=0;n<temp1;n++)
     {
              if (flash_word_program(temp2, *dataptr++))
      return 1;
              temp2 +=4;
     }
return 0;
}

系统启动时,先调用data_area_init()函数,返回当前数据单元指针,你可以使用memory copy 复制数据到你的程序中。如果是空指针,你需要对你的数据赋予初值,并把它存储到数据区。

全局变量:

data_uint_typemydata;
data_uint_type * dataptr;
main(void)
{
…
dataptr=data_area_init();//初始化
if((uint32_t)dataptr==0) //空指针
{
//对mydata赋予初值
…
//存储数据到Flash 数据区
data_ptr =(data_uint_type *) DATA_AREA_ADDRESS;
store_data_uint(&mydata,data_ptr);
}
…
//任何时候,调用store_data_uint()把mydata数据存储到Flash
data_ptr++;
if ((uint32_t)data_ptr==DATA_AREA_ADDRESS)
data_ptr =(data_uint_type *) DATA_AREA_ADDRESS;
store_data_uint(&mydata,data_ptr);
…
//data_ptr永远指向当前Flash 数据
…
}

注意事项:

由于mydata的地址是编译器自动设定的,如果发生mydata地址不是word对齐地址,需要手动设置。总之,要确保mydata地址是word对齐的。

4、Revision History

来源:敏矽MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 112

航顺芯片HK32MCU经过三年多高速发展,脚踏实地不断壮大,已量产二十五大家族300余款HK32MCU,拥有200多项发明专利和知识产权.获得国家工信部小巨人/深圳市十大风云人物/中国成立70周年深圳三十大创业榜样/国家高新技术企业等荣誉。航顺HK32MCU已成为业界知名品牌,并被资本市场和客户高度认可,与小米、 汇顶、 中航、上汽集团、长城哈佛、通用五菱、大众斯柯达、长虹、 康佳、 海信、 TCL、创维、友讯达、安吉尔、上海沪工、众辰等企业完成批量交付,连续引入顺为资本/汇顶科技/中航联创/中科院国科投等战略投资。

同时航顺芯片存储器EEPROM和NOR Flash也在不断发展壮大,今天我们就来介绍一下航顺HK24CXX-EEPROM和HK25QXX-NOR Flash。

EEPROM:电气可抹除式可编程只读存储器即Electrically Erasable Programmable Read-Only Memory(EEPROM),是在1978年Intel通过改良EPROM而诞生,它胜过电气可编程只读存储器(EPROM)的优势,就是除了在使用中可编程、也能擦除,掉电后数据不丢失,可以保存100年,可以擦写100万次,具有较高的可靠性。例如航顺芯片的HK24C家族(2K-512K),拥有上述优点的同时极具性价比,公司成立至今已完成百亿颗HK24CXX-EEPROM的交付。

“航顺芯片EEPROM和NOR

NOR Flash:一种非易失闪存芯片,也属于广义的EEPROM,因为它也是电擦除的ROM。但是为了区别于一般的按字节为单位的擦写的EEPROM,大家都叫它Flash。

NOR Flash做的改进就是擦除时不再以字节为单位,而是以块为单位,一次简化了电路,数据密度更高,降低了成本。容量上M的ROM一般都是NOR Flash。如航顺芯片NOR Flash家族(4M-128M),重点介绍一下HK25Q128,这是一款存储容量128M的NOR Flash,拥有航顺芯片唯一的ID:68,大大提高了存储程序的安全性,与此同时拥有10万次以上的擦写和20年的数据保存。NOR Flash是可以进行字节寻址,程序是可以直接HK25Q128里面运行的。

“航顺芯片EEPROM和NOR

“航顺芯片EEPROM和NOR

航顺芯片从成立至今一直致力于控制器高端MCU和存储芯片的研发,从0到1期间花费了大量资金投入,EEPROM和NOR Flash两个家族一直是最经典的,应用行业遍布各行各业,在未来航顺芯片将会继续打造更多的控制器高端MCU和存储芯片家族,在自主研发的道路上打造航顺无边界生态平台级企业。

来源:航顺芯片研发
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 205

作者:安森美半导体逻辑、开关和存储业务部Julio Song

物联网(IoT)没有表现出短暂流行的迹象,预计十年内将会有规律地出现越来越多相互联接的事物。这不足为奇,因为我们不断想象寻找利用技术去做事的新方法并开发新旧技术的全新应用。每个新应用都会向网络添加许多端点,使IoT日益变大。

该趋势目前在使用的、在大部分RF频谱中运行的不同无线技术的激增可见一斑。它们大多包含在工业、科学和医疗(ISM)定义下的免授权频段,通常仅排除可能归为电信的应用。

生活更舒适

涉及大量IoT端点,即使不是数千亿,也可能高达数百亿,使调试和维护环节面临着挑战。假设我们不是为下一代创造了一个巨大的废物管理问题,这些设备都将运行多年,因此在设计时需要适当地考虑维护和维修。

使这一后勤问题复杂化的是许多IoT端点成本非常低,其所提供的维护水平可能不支持相对较高的现场维护成本。基础设施的成本也必须尽可能地降低,因此采用免授权的无线方案。

甚至相对较小的工厂也可能很快会有成千上万的IoT端点,因此不难理解为什么网状网络技术已成为首选的局域网拓扑。它支持远程监视和维护每台设备,还提供网络中一定程度的冗余,因为网状拓扑能够承受那些可能由无线电干扰引起的重大中断或某些端点的总故障。

IoT中另一种流行的拓扑,尤其针对位于远程区域的传感器,是低功耗广域网(LPWAN)采用的星型网络。这些网络优先考虑范围和低功耗而非有效载荷,通常支持非常短的传输而不是长距离传输,可能仅限每天传输一次。因此,它们通常最适用于不受延迟影响的工作数据。

网络拓扑的选择几乎将完全取决于应用,尽管端点的财务成本可能相对较低,但其可能提供很重要的数据。一些分析师估计,LPWAN的价值将在短短几年内达500亿美元,该数字基于设备及其提供的服务的总价值。

当现场端点发生故障时,几乎不可避免地需要对其进行修复。如果不能通过网络远程进行,则需要出车维修,这需要维修工程师前往现场并尽可能快而高效地解决问题。

一旦到达现场,问题可能会增加,因为很有可能端点无法通过物理或电子方式访问。即使端点易于访问,工程师可能也很难弄清为何它无法正常工作,因为端点的设计可能基于单个系统单芯片(SoC)。目前的集成度使这种情况变得越来越普遍。

针对IoT的两个‘E’

电子行服务的所有领域都在本地存储有关设备活动的数据,这比物联网存在的时间更久。利用非易失性存储器记录数据已被确立为记录关键系统信息的一种有效方案。存储在非易失性存储器中的数据可让您深入地了解设备的运行方式及其为何会停止工作。它们还被广泛用于存储功能参数、校准数据,以及可能需要定期更新、在断电时却可保留的其他类型信息。

这种活动对基本的存储技术产生了巨大的压力,因为它要求极端的耐久性,高于某些流行的存储器例如闪存所提供的耐久性。因此,优选的技术是EEPROM。

在某些应用中,在正常工作期间连续写入EEPROM并不少见,这推动了对可承受数百万次读写周期而不会出现故障的存储技术的需求。这不包括可能仅能支持100,000个周期或更少的编程和擦除持久性的其他类型的存储器。

现在,通过在单个器件中集成EEPROM存储和RFID联接,即使出现电源故障或完全断电的情况,工程师也可以通过设计IoT端点,使其存储工作数据并与服务工程师通信这呈现了服务和维护的全新范例,并且完全适用于IoT(见图1)。

图1:将支持RFID的EEPROM添加到IoT端点,将为几十亿台设备的调试、维修和维护提供一个新的维度

Tablet/Phone:平板电脑/手机

RF Reader/Writer:RF读写器

LED TV:LED电视

Motor Trim from EEPROM:EEPROM调节电机

MCU:微控制单元

Adjustable Current Regulator:可调的电流调节器

TV Trim from EEPROM:EEPROM调节电视

Trim parameters, diagnostic data, remote maintenance:调整参数、诊断数据、远程维护

图1:将支持RFID的EEPROM添加到IoT端点,为几十亿台设备的调试、维修和维护提供一个新的维度

也许更重要的是,所讨论的方案将无线联接的操作距离从不到10厘米(这是无源RFID的典型值)扩展达150厘米。这确切地将无源RFID在IoT中的应用提高到新的维度。即使系统没有上电,也能使用RFID在1.5m的距离上读写数据到EEPROM,将帮助工程师在部署现场之后,更经济高效地调试、维护、维修和修复端点。

独特的方案

安森美半导体开发的N24RF系列RF EEPROM集成了一个符合ISO 15693 / ISO 18000-3 Mode 1标准的RF收发器,以及4、16或64 kbit的EEPROM存储器,采用8引脚SOIC或TSSOP封装它提供200万次编程、擦除周期,具有200年的数据保留能力,且可在-40至+ 105°C的温度范围内工作。

该器件使用无源RFID,因此不依赖外部电源。取而代之的是,它的所有电力都在连接到一个外部线圈天线时获得。该器件被归类为高频(HF)RFID,在13.56 MHz的载波频率下运行,使其能够以低速(1.65 kbit / s)和高速(26.48 kbit / s)与RFID读卡器进行通信,最高可达53 kbit / s的快速指令。它是无源RFID实施的独特方法,可在1.5m的距离内实现这一目标。

即使电路的其余部分断电或出现故障,使用无源RFID也可以询问IoT端点以恢复故障后的重要数据记录。它还支持空中更新(OTA)校准或操作参数,同时端点仍在运行。芯片间通信使用I2C总线实施,主机处理器在正常操作期间能从该器件读取和写入,从而使校准或操作参数能在现场更新而不中断服务。

N24RFxx器件使用Reader Talks First(RTF)技术,当通过感应耦合施加电磁场时,该器件将被唤醒。它提供更广的范围,意味着工程师能够查询可能难以接近的IoT端点例如灯具,仅需使用位于该灯具下方的RFID读卡器就可实现。

安全特性包括64位唯一标识符(UID),以及支持多个32位密码,并具有针对不同存储扇区的锁定功能。(在选定的器件中)另一个特性是电压输出引脚,可提供足够的电能以支持单独的超低功耗微控制器。

总结

在许多需要高耐久性和经验证的数据保留应用中,EEPROM广泛用于数据记录和参数存储。通过添加RFID功能,可在1.5米的距离无线、安全地访问相同的数据,从而为IoT端点设计提供了一个新的维度。

关于安森美半导体

安森美半导体(ON Semiconductor,美国纳斯达克上市代号:ON)致力于推动高能效电子的创新,使客户能够减少全球的能源使用。安森美半导体领先于供应基于半导体的方案,提供全面的高能效电源管理、模拟、传感器、逻辑、时序、互通互联、分立、系统单芯片(SoC)及定制器件阵容。公司的产品帮助工程师解决他们在汽车、通信、计算机、消费电子、工业、医疗、航空及国防应用的独特设计挑战。公司运营敏锐、可靠、世界一流的供应链及品质项目,一套强有力的守法和道德规范计划,及在北美、欧洲和亚太地区之关键市场运营包括制造厂、销售办事处及设计中心在内的业务网络。更多信息请访问http://www.onsemi.cn

围观 37

EEPROM & EPROM

EEPROM是指带电可擦可编程只读存储器,是一种掉电后数据不丢失的存储芯片,EEPROM可以在电脑上或专用设备上擦除已有信息,重新编程,一般用在即插即用。

EPROM是一种断电后仍能保留数据的计算机储存芯片,它是一组浮栅晶体管,被一个提供比电子电路中常用电压更高电压的电子器件分别编程。一旦编程完成后,EPROM只能用强紫外线照射来擦除,通过封装顶部能看见硅片的透明窗口,很容易识别EPROM,这个窗口同时用来进行紫外线擦除。

EEPROM和EPROM的发展历程不同

在微机的发展初期,BIOS都存放在ROM中,ROM内部的资料是在ROM的制造工序中,在工厂里用特殊的方法被烧录进去的,其中的内容只能读不能改,一旦烧录进去,用户只能验证写入的资料是否正确,不能再作任何修改。如果发现资料有任何错误,则只有舍弃不用,由于ROM制造和升级的不便,后来人们发明了PROM。

最初从工厂中制作完成的PROM内部并没有资料,用户可以用专用的编程器将自己的资料写入,但是这种机会只有一次,一旦写入后也无法修改,若是出了错误,已写入的芯片只能报废。PROM的特性和ROM相同,但是其成本比ROM高,而且写入资料的速度比ROM的量产速度要慢,一般只适用于少量需求的场合或是ROM量产前的验证。

EPROM芯片可重复擦除和写入,解决了PROM芯片只能写入一次的弊端。EPROM芯片有一个很明显的特征,在其正面的陶瓷封装上,开有一个玻璃窗口,透过该窗口,可以看到其内部的集成电路,紫外线透过该孔照射内部芯片就可以擦除其内的数据,完成芯片擦除的操作要用到EPROM擦除器。

EPROM芯片在写入资料后,还要以不透光的贴纸或胶布把窗口封住,以免受到周围的紫外线照射而使资料受损。EPROM的编程需要使用编程器完成。编程器是用于产生EPROM编程所需要的高压脉冲信号的装置。编程时将EPROM的数据送到随机存储器中,然后启动编程程序,编程器便将数据逐行地写入EPROM中。

一片编程后的EPROM,可以保持其数据大约10到20年,并能无限次读取。擦除窗口必须保持覆盖,以防偶然被阳光擦除。老式电脑的BIOS芯片,一般都是EPROM,擦除窗口往往被印有BIOS发行商名称、版本和版权声明的标签所覆盖。EPROM已经被EEPROM取代。

由于EPROM操作的不便,后来出的主板上BIOS ROM芯片大部分都采用EEPROM。EEPROM的擦除不需要借助于其它设备,它是以电子信号来修改其内容而且是以Byte为最小修改单位,不必将资料全部洗掉才能写入,彻底摆脱了EPROM Eraser和编程器的束缚。

EEPROM在写入数据时,仍要利用一定的编程电压,此时,只需用厂商提供的专用刷新程序就可以轻而易举地改写内容。

借助于EEPROM芯片的双电压特性,可以使BIOS具有良好的防毒功能,在升级时,把跳线开关打至“on”的位置,即给芯片加上相应的编程电压,就可以方便地升级;平时使用时,则把跳线开关打至“off”的位置,防止CIH类的病毒对BIOS芯片的非法修改。

EEROM和EPROM的性能区别

EPROM是一种可重写的存储器芯片,并且其内容在掉电的时候也不会丢失,它是非易失性的。它通过EPROM编程器进行编程,EPROM编程器能够提供比正常工作电压更高的电压对EPROM编程。

一旦经过编程,EPROM只有在强紫外线的照射下才能够进行擦除。为了进行擦除,EPROM的陶瓷封装上具有一个小的石英窗口,这个石英窗口一般情况下使用不透明的粘带覆盖,当擦除时将这个粘带揭掉,然后放置在强紫外线下大约20分钟。

EEPROM是一种电可擦除可编程只读存储器,并且其内容在掉电的时候也不会丢失。在平常情况下,EEPROM与EPROM一样是只读的,需要写入时,在指定的引脚加上一个高电压即可写入或擦除,而且其擦除的速度极快。

通常EEPROM芯片又分为串行EEPROM和并行EEPROM两种,串行EEPROM在读写时数据的输入/输出是通过2线、3线、4线或SPI总线等接口方式进行的,而并行EEPROM的数据输入/输出则是通过并行总线进行的。

EEPROM和EPROM的应用区别

对于一个需要开关设置参数的小型系统,可以把诸如波特率、同步和异步选择、数据长度等参数储存在EEPROM中,制定一个数据序列或表格,使用户方便地完成选择。每次上电CPU按EEPROM中设定的参数进行指定的工作方式设茕。

对于大规模的计算机及通讯阿络,可把诸如通道配置、数据速率以及终端的承受能力等控制信息用表格的形式显示在CRT上,用在CRT上对系统可以方便地进行组态,EEPROM可以很好地将这些数据和表格存储下来,解决了通讯网络的稳定性和灵活性问题。

EPROM是一种常用的存储器,在单片机开发应用中一般用它作为程序存储器,实际上它也是一种可编程逻辑器件。除了可以用它实现逻辑函数外,还可以用它实现一些复杂的测量和控制,通常的数字式电压表采用液晶显示,显示亮度不高,显示的数字也不大,在此介绍采用A/D转换器和EPROM为核心构成的大型显示LED数字式直流电压表。适合于教学实验演示及测控设备的仪表台柜等的应用场合。

本文整合自网络,版权归原作者。

围观 963

FLASH 和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有 FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。

在芯片的内电路中,FLASH和EEPROM不仅电路不同,地址空间也不同,操作方法和指令自然也不同,不论冯诺伊曼结构还是哈佛结构都是这样。技术上,程序存储器和非易失数据存储器都可以只用FALSH结构或EEPROM结构,甚至可以用“变通”的技术手段在程序存储区模拟“数据存储区”,但就算如此,概念上二者依然不同,这是基本常识问题。

EEPROM:电可擦除可编程只读存储器,Flash的操作特性完全符合EEPROM的定义,属EEPROM无疑,首款Flash推出时其数据手册上也清楚的标明是EEPROM,现在的多数Flash手册上也是这么标明的,二者的关系是“白马”和“马”。至于为什么业界要区分二者,主要的原因是 Flash EEPROM的操作方法和传统EEPROM截然不同,次要的原因是为了语言的简练,非正式文件和口语中Flash EEPROM就简称为Flash,这里要强调的是白马的“白”属性而非其“马”属性以区别Flash和传统EEPROM。

Flash的特点是结构简单,同样工艺和同样晶元面积下可以得到更高容量且大数据量下的操作速度更快,但缺点是操作过程麻烦,特别是在小数据量反复重写时,所以在MCU中Flash结构适于不需频繁改写的程序存储器。

很多应用中,需要频繁的改写某些小量数据且需掉电非易失,传统结构的EEPROM在此非常适合,所以很多MCU内部设计了两种EEPROM结构,FLASH的和传统的以期获得成本和功能的均衡,这极大的方便了使用者。随着ISP、IAP的流行,特别是在程序存储地址空间和数据存储地址空间重叠的MCU系中,现在越来越多的MCU生产商用支持IAP的程序存储器来模拟EEPROM对应的数据存储器,这是低成本下实现非易失数据存储器的一种变通方法。为在商业宣传上取得和双EEPROM工艺的“等效”性,不少采用Flash程序存储器“模拟”(注意,技术概念上并非真正的模拟)EEPROM数据存储器的厂家纷纷宣称其产品是带EEPROM的,严格说,这是非常不严谨的,但商人有商人的目的和方法,用Flash“模拟”EEPROM可以获取更大商业利益,所以在事实上,技术概念混淆的始作俑者正是他们。

从成本上讲,用Flash“模拟”EEPROM是合算的,反之不会有人干,用EEPROM模拟Flash是怎么回事呢?这可能出在某些程序存储空间和数据存储空间连续的MCU上。这类MCU中特别是存储容量不大的低端MCU依然采用EEPROM作为非易失存储器,这在成本上反而比采用Flash和传统EEPROM双工艺的设计更低,但这种现象仅仅限于小容量前提下。因Flash工艺的流行,现在很多商人和不够严谨的技术人员将程序存储器称为Flash,对于那些仅采用传统EEPROM工艺的MCU而言,他们不求甚解,故而错误的将EEPROM程序存储器称为“ 模拟Flash”,根本的原因是他们未理解Flash只是一种存储器结构而非存储器的用途,错误的前提自然导致错误的结论。

商业上讲,用EEPROM模拟 Flash是不会有人真去做的愚蠢行为,这违背商业追求最大利益的原则,技术上也不可行,而对于技术人员而言。本质的问题是Flash是一种存储器类型而非MCU中的程序存储器,即使MCU的程序存储器用的是Flash,但其逆命题不成立。

来源:huazhongwang

围观 427

1、EEPROM介绍

Electrically Erasable Programmable Read Only Memory 电气可拭除可编程只读存储器

发展过程:ROM – > PROM –> EPROM –> EEPROM

2、EEPROM和FLASH的区别

2.1 使用上的区别

  •  FLASH用于存放程序,在程序运行过程中不能更改。我们编写的程序是烧录到FLASH中的;
  •  RAM用作程序运行时的数据存储器;
  •  EEPROM用于存放数据,是用来保存掉电后用户不希望丢的数据,开机时用到的参数。运行过程中可以改变。

FLASH是用于存储程序代码的,有些场合也可能用它来保存数据,当然前提是该单片机的FLASH工艺是可以自写的(运行中可擦写),但要注意FLASH的擦写次数通常小于一万次,而且通常FLASH只能按块擦除。EEPROM不能用来存程序,通常单片机的指令寻址不能到这个区域。EEPROM的擦写次数应有百万次,而且可以按字节擦写。 EEPROM在一个PAGE内是可以任意写的,FLSAH则必须先擦除成BLANK,然后再写入,而一般没有单字节擦除的功能,至少一个扇区擦除。

2.2 结构上的区别

EEPROM和FLASH都是非易失性存储器。

FLASH的全称是FLASH EEPROM,但跟常规EEPROM的操作方法不同。

FLASH 和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有 FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。

3、EEPROM的使用方法

AVRGCC里面自带有EEPROM读写函数。

使用时需包含头文件#include <avr/eeprom.h>,部分读写函数如下:

#define eeprom_is_ready() bit_is_clear(EECR, EEWE)//检测EEPROM是否准备好。OK返回1(返回EEWE位)

#define eeprom_busy_wait() do {} while (!eeprom_is_ready())//等待EEPROM操作完成

extern uint8_t eeprom_read_byte (const uint8_t *addr);//读取指定地址的一个字节8bit的EEPROM数据

extern uint16_t eeprom_read_word (const uint16_t *addr);//读取指定地址的一个字16bit的EEPROM数据

extern void eeprom_read_block (void *buf, const void *addr, size_t n);//读取由指定地址开始的指定长度的EEPROM数据

extern void eeprom_write_byte (uint8_t *addr, uint8_t val);//向指定地址写入一个字节8bit的EEPROM数据

extern void eeprom_write_word (uint16_t *addr, uint16_t val);//向指定地址写入一个字16bit的EEPROM数据

使用示例:

/*-----------------------------------------------------------------------------
 *  从EEPROM中读取配置信息
 *----------------------------------------------------------------------------*/
uint8_t read_EEPROM_config(void)
{
    factory_mode               = eeprom_read_byte ( (uint8_t  *)0x10 );
    short_address              = eeprom_read_word ( (uint16_t *)0x11 );
    transmit_power_DBM_uin     = eeprom_read_byte ( (uint8_t  *)0x13 );
    pan_id                     = eeprom_read_word ( (uint16_t *)0x14 );
    channel_page               = eeprom_read_byte ( (uint8_t  *)0x16 );
    channel                    = eeprom_read_byte ( (uint8_t  *)0x17 );
    return 1;
}

/*------------------------------------------------------------------------------
 * 将从串口读出的配置信息存放于EEPROM中
 *-----------------------------------------------------------------------------*/
uint8_t write_EEPROM_config(void)
{
    eeprom_write_byte ( (uint8_t  *)0x10,factory_mode );
    eeprom_write_word ( (uint16_t *)0x11,short_address );
    eeprom_write_byte ( (uint8_t  *)0x13,transmit_power_DBM_uin );
    eeprom_write_word ( (uint16_t *)0x14,pan_id );
    eeprom_write_byte ( (uint8_t  *)0x16,channel_page );
    eeprom_write_byte ( (uint8_t  *)0x17,channel );

    return 1;
}

通过串口向单片机发送配置命令,单片机收到指令后,利用函数write_EEPROM_config()将相应的配置信息存放于EEPROM中。系统初始化时,利用函数read_EEPROM_config()从EEPROM中取出相应的数据,用于系统的初始化。

转自: Andy Cheung

围观 388

页面

订阅 RSS - EEPROM