EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器–一种掉电后数据不丢失的存储芯片。
简而言之就是你想断电后arduino还要保存一些参数,就使用EEPROM吧。
在各型号的arduino控制器上的AVR芯片均带有EEPROM,也有外接的EEPROM芯片,常见arduino控制器的EEPROM大小:
Arduino UNO、Arduino duemilanove-m328、Zduino m328均使用ATmega328芯片,EEPROM都为1K
Arduino duemilanove-m168的EEPROM为512bytes
Arduino 2560的EEPROM为4K
下面我们介绍arduino自带的EEPROM使用方法,arduino的库已经为我们准备好了EEPROM类库,我们要使用得先调用EEPROM.h,然后使用write和read方法,即可操作EEPROM。
另:下面的官方例子由于写成较早,所以讲EEPROM的大小都定为了512字节,实际使用中,大家可参照上面所说的EEPROM大小,自行更改。
1.写入
选择 File>Examples>EEPROM>eeprom_write
/* * EEPROM Write * * Stores values read from analog input 0 into the EEPROM. * These values will stay in the EEPROM when the board is * turned off and may be retrieved later by another sketch. */ #include <EEPROM.h> // EEPROM 的当前地址,即你将要写入的地址,这里就是从0开始写 int addr = 0; void setup() { } void loop() { //模拟值读出后是一个0-1024的值,但每字节的大小为0-255,所以这里将值除以4再存储到val int val = analogRead(0) / 4; // write the value to the appropriate byte of the EEPROM. // these values will remain there when the board is // turned off. EEPROM.write(addr, val); // advance to the next address. there are 512 bytes in // the EEPROM, so go back to 0 when we hit 512. addr = addr + 1; if (addr == 512) addr = 0; delay(100); }
2.读取
选择 File>Examples>EEPROM>eeprom_read
/* * EEPROM Read * * Reads the value of each byte of the EEPROM and prints it * to the computer. * This example code is in the public domain. */ #include <EEPROM.h> // start reading from the first byte (address 0) of the EEPROM int address = 0; byte value; void setup() { // initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } } void loop() { // read a byte from the current address of the EEPROM value = EEPROM.read(address); Serial.print(address); Serial.print("\t"); Serial.print(value, DEC); Serial.println(); // advance to the next address of the EEPROM address = address + 1; // there are only 512 bytes of EEPROM, from 0 to 511, so if we're // on address 512, wrap around to address 0 if (address == 512) address = 0; delay(500); }
3.清除
选择 File>Examples>EEPROM>eeprom_clear
清除EEPROM的内容,其实就是把EEPROM中每一个字节写入0,因为只用清一次零,所以整个程序都在setup部分完成。
/* * EEPROM Clear * * Sets all of the bytes of the EEPROM to 0. * This example code is in the public domain. */ #include <EEPROM.h> void setup() { // 让EEPROM的512字节内容全部清零 for (int i = 0; i < 512; i++) EEPROM.write(i, 0); // 清零工作完成后,将L灯点亮,提示EEPROM清零完成 digitalWrite(13, HIGH); } void loop() { }
原帖地址:http://www.arduino.cn/thread-1157-1-1.html
使用共用体结构保存其他类型的数据EEPROM:http://www.arduino.cn/thread-2684-1-1.html
在提供一个Arduino调用avrgcc eeprom函数的例程, 但Arduino自带的AVRGCC版本比较老,EEPROM没有float操作函数,所以要用这个程序,需要用新版的eeprom函数覆盖才行。
写EEPROM:
//奈何Col //www.openjumper.cn #include <avr/eeprom.h> //int addr = 0; float b=5.43; void setup() { float* addr=(float*)0x20; // for(int i=0;i<sizeof(float) eeprom_write_float(addr,b); pinMode(13,OUTPUT); } void loop() { digitalWrite(13,HIGH); delay(500); digitalWrite(13,LOW); delay(500); }
读EEPROM:
//奈何Col //www.openjumper.cn #include <avr/eeprom.h> //int addr = 0; float b; void setup() { float* addr=(float*)0x20; // for(int i=0;i<sizeof(float) b=eeprom_read_float(addr); delay(100); Serial.begin(9600); } void loop() { Serial.println(b); delay(1000); }