Программирование AVR Arduino: библиотека EEPROM Fri, March 29 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Arduino: библиотека EEPROM Печать
Добавил(а) microsin   

EEPROM это энергонезависимая память (nonvolatile memory), т. е. она может сохранить свое содержимое после выключения питания устройства.

Микроконтроллер (MCU) на платах Arduino и Genuino, основанных на AVR, обладают встроенной памятью EEPROM. Она хранит свои значения, когда питание платы выключено (это работает наподобие маленького HDD). Библиотека EEPROM позволяет читать и записывать байты EEPROM.

Поддерживаемые MCU на различных платах Arduino и Genuino имеют на борту разный объем памяти EEPROM: 1024 байт на ATmega328P, 512 байт на ATmega168 и ATmega8, 4 килобайта (4096 байт) на ATmega1280 и ATmega2560. Платы Arduino и Genuino 101 эмулируют EEPROM на основе FLASH на области размером 1024 байт.

Для использования функций библиотеки нужно подключить заголовочный файл EEPROM.h в начале скетча:

#include < EEPROM.h>

Примеры можно найти в документации [2]. Во врезках ниже приведено подробное описание функций библиотеки.

Считывает байт из EEPROM. Ячейки, в которых ничего не было записано, имеют значение 255 (0xFF). В качестве параметра передается адрес ячейки. Синтаксис:

EEPROM.read(address)

Пример использования:

#include < EEPROM.h>
 
int a = 0;
int value;
 
void setup()
{
   Serial.begin(9600);
}
 
void loop()
{
   value = EEPROM.read(a);
 
   Serial.print(a);
   Serial.print("\t");
   Serial.print(value);
   Serial.println();
 
   a = a + 1;
 
   if (a == 512)
      a = 0;
   delay(500);
}

Запишет байт в EEPROM. В качестве параметров передается адрес ячейки и значение записываемого байта. Функция ничего не возвращает. Синтаксис:

EEPROM.write(address, value)

Замечание: запись в EEPROM занимает 3.3 мс. Память EEPROM имеет запас по устойчивости 100000 циклов запись/стирание, так что нужно быть осторожным при записи, не следует слишком часто записывать в EEPROM.

Пример использования:

#include < EEPROM.h>
 
void setup()
{
   for (int i = 0; i < 255; i++)
      EEPROM.write(i, i);
}
 
void loop()
{
}

Запишет байт в EEPROM. Значение будет записано только в том случае, если оно отличается от уже записанного по тому же адресу. Синтаксис такой же, как у функции write:

EEPROM.update(address, value)

Использование функции update вместо write позволяет экономить ресурс EEPROM, если записываемые данные меняются не часто.

Пример использования:

#include < EEPROM.h>
 
void setup()
{
   for (int i = 0; i < 255; i++)
   {
      // Здесь будет выполняться запись точно так же,
      // как и при EEPROM.write(i, i).
      EEPROM.update(i, i);
   }
   for (int i = 0; i < 255; i++)
   {
      // Запись "12" в ячейку 3 произойдет только первый раз,
      // остальные 254 раза запись производиться не будет.
      EEPROM.update(3, 12);
   }
}
 
void loop()
{
}

Прочитает из EEPROM объект любого типа. Параметром data может быть любой тип, например float, или даже пользовательская структура данных. Возвращаемое значение - указатель на данные переданного объекта. Синтаксис:

EEPROM.get(address, data)

Пример использования:

#include < EEPROM.h>
 
struct MyObject
{
   float field1;
   byte field2;
   char name[10];
};
 
void setup()
{
   float f = 0.00f;   // переменная для хранения данных, прочитанных из EEPROM.
   int eeAddress = 0; // адрес EEPROM, откуда начинается чтение
   Serial.begin( 9600 );
   while (!Serial)
   {
      ; // ожидание соединения с портом. Это нужно только для плат Leonardo.
   }
 
   Serial.print( "Read float from EEPROM: " );
   // Извлечение данных float из EEPROM в позиции eeAddress:
   EEPROM.get( eeAddress, f );
   // Это может вывести на печать 'ovf, nan', если данные в EEPROM имеют
   // неправильный формат:
   Serial.println( f, 3 );
 
   // get() также можно использовать для чтения в пользовательскую структуру.
   eeAddress = sizeof(float); // перемещение адреса за следующий байт
                              // после float 'f'
   MyObject customVar; // Переменная для сохранения пользовательского объекта,
                       // который считывается из EEPROM.
   EEPROM.get( eeAddress, customVar );
 
   Serial.println( "Read custom object from EEPROM: " );
   Serial.println( customVar.field1 );
   Serial.println( customVar.field2 );
   Serial.println( customVar.name );
}
 
void loop(){ /* пустой цикл */ }

Запишет в EEPROM данные любого типа. В параметрах передается адрес EEPROM и объект, содержащий записываемые данные. Функция возвратит указатель на данные записываемого объекта. Синтаксис:

EEPROM.put(address, data)

Примечание: функция put использует EEPROM.update() для выполнения записи, поэтому она не перезаписывает значение, если оно не поменялось.

Пример использования:

#include < EEPROM.h>
 
struct MyObject
{
   float field1;
   byte field2;
   char name[10];
};
 
void setup()
{
   Serial.begin(9600);
   while (!Serial)
   {
      ; // ожидание соединения с последовательным портом. Это нужно
        // только для плат со встроенным портом USB.
   }
 
   float f = 123.456f;  // Переменная для сохранения в EEPROM.
   int eeAddress = 0;   // Адрес ячейки, куда мы хотим сохранить данные.
 
   EEPROM.put(eeAddress, f);
   Serial.println("Written float data type!");
 
   /** Функция put была разработана так, чтобы можно было сохранять
       и пользовательские структуры. **/
 
   // Данные пользователя для сохранения:
   MyObject customVar =
   {
      3.14f,
      65,
      "Working!"
   };
 
   eeAddress += sizeof(float); // перемещение адреса за следующий байт
                               // после float 'f'
 
   EEPROM.put(eeAddress, customVar);
   Serial.print("Written custom data type!\n");
   Serial.print("View the example sketch eeprom_get\n")
   Serial.print(" to see how you can retrieve the values!");
}
 
void loop(){ /* пустой цикл */ }

Этот оператор позволяет использовать идентификатор EEPROM наподобие массива. Этим методом можно напрямую читать и записывать ячейки EEPROM. EEPROM[address] возвратит ссылку на ячейку EEPROM с адресом address.

Пример использования:

#include < EEPROM.h>
 
void setup()
{
   unsigned char val;
 
   // Чтение первой ячейки EEPROM:
   val = EEPROM[0];
 
   // Запись первой ячейки EEPROM:
   EEPROM[0] = val;
 
   // Сравнение содержимого EEPROM с оригинальной переменной:
   if( val == EEPROM[0] )
   {
      // Тут какие-нибудь действия...
   }
}
 
void loop(){ /* пустой цикл */ }

[Ссылки]

1. EEPROM Library site:docs.arduino.cc.
2. A guide to EEPROM site:docs.arduino.cc.

 

Добавить комментарий


Защитный код
Обновить

Top of Page