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 ;
} /*------------------------------------------------------------------------------
* 将从串口读出的配置信息存放于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 ;
}

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

http://blog.sina.com.cn/s/blog_503cd6a90100fhnu.html

最新文章

  1. heartbeat在yum系发行版本的处理资料
  2. 【VS】vs修改大小写快捷键
  3. SVN 错误 Access to SVN Repository Forbidden的原因及解决方法
  4. java分享第六天(冒泡排序)
  5. PHP不能创建csv中文名文件
  6. 使用 XMPP 构建一个基于 web 的通知工具——转
  7. 酒旗少年狂暖风,至0基本的前端开发project教师们学习计划
  8. Xamarin.android Activity动画切换效果实现
  9. centos6.x升级protobuf操作流程.
  10. linux环境下快速安装Mariadb和Redis
  11. php如何解决中文乱码问题?
  12. Netty源码分析(一):Netty总览
  13. pip安装pycrypto报错:Microsoft Visual C++ 14.0 is required. 和 SSLError: HTTPSConnectionPool的解决办法
  14. PHP 获取数组是几维数组
  15. ADO.NET的五大对象【转】
  16. tar+nc传输文件的使用
  17. XXXcannot be resolved to a type
  18. Java几种单例模式的实现与利弊
  19. 几个简单易懂的排序算法php
  20. sysbench安装及性能测试

热门文章

  1. Java中输入输出流
  2. dp类模板
  3. TCP/IP Note1
  4. hdu6121 build a tree(树)
  5. 【题解】ZJOI2010贪吃的老鼠
  6. [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]
  7. D. Relatively Prime Graph
  8. Spring学习-- IOC 容器中 bean 的生命周期
  9. struts2学习笔记(二)
  10. bzoj2002 弹飞绵羊 lct版