Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/EEPROMCrc

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Проверка EEPROM-памяти по методу CRC[1]

Микроконтроллер на плате Arduino/Genuino имеет, как правило, 512 байт EEPROM-памяти (у моделей Uno и Mega ее объем составляет 1 Кб и 4 Кб соответственно) – она хранит информацию, даже если плата находится в выключенном состоянии. Другими словами, это что-то вроде крошечного жесткого диска.

CRC – это простой способ проверки, были ли данные изменены или повреждены. Это что-то вроде подписи, т.е. любое изменение CRC-значения означает, что сохраненные данные тоже изменились. Целью данного примера является показать, как объект EEPROM можно использовать в виде массива. В нем CRC-значение рассчитывается прямо на EEPROM-данных.

Необходимое оборудование

  • Плата Arduino или Genuino

Цепь

Для этого примера цепь строить не нужно.

ArduinoUNO bb.png

Схема

ArduinoUNO sch.png

Код

  1. /***
  2.     Автор – Кристофер Эндрюс (Christopher Andrews).
  3.     CRC-алгоритм генерируется CRC-калькулятором pycrc, лицензия MIT (https://github.com/tpircher/pycrc ).
  4.  
  5.    CRC – это простой способ проверки, были ли данные изменены
  6. или повреждены. Целью данного примера является показать, как объект
  7. EEPROM можно использовать в виде массива. В нем CRC-значение
  8. рассчитывается прямо на EEPROM-данных.
  9.  
  10. ***/
  11.  
  12. #include <Arduino.h>
  13. #include <EEPROM.h>
  14.  
  15. void setup() {
  16.  
  17.   // запускаем последовательную коммуникацию:
  18.   Serial.begin(9600);
  19.   while (!Serial) {
  20.     ; // ждем подключения последовательного порта (нужно только для плат со штатным USB-портом)
  21.   }
  22.  
  23.   // Показываем объем данных, которые будут подвержены CRC-проверке:
  24.   Serial.print("EEPROM length: "); // "Объем данных: "
  25.   Serial.println(EEPROM.length());
  26.  
  27.   // Показываем результат вызова функции eeprom_crc():
  28.   Serial.print("CRC32 of EEPROM data: 0x"); // "CRC32-значение EEPROM-данных: 0x"
  29.   Serial.println(eeprom_crc(), HEX);
  30.   Serial.print("\n\nDone!"); // "\n\nГотово!"
  31.  
  32. }
  33.  
  34. void loop() {
  35.   /* пустой цикл */
  36. }
  37.  
  38. unsigned long eeprom_crc(void) {
  39.  
  40.   const unsigned long crc_table[16] = {
  41.     0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
  42.     0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
  43.     0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
  44.     0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
  45.   };
  46.  
  47.   unsigned long crc = ~0L;
  48.  
  49.   for (int index = 0 ; index < EEPROM.length()  ; ++index) {
  50.     crc = crc_table[(crc ^ EEPROM[index]) & 0x0f] ^ (crc >> 4);
  51.     crc = crc_table[(crc ^ (EEPROM[index] >> 4)) & 0x0f] ^ (crc >> 4);
  52.     crc = ~crc;
  53.   }
  54.   return crc;
  55. }

См.также

  1. EEPROM.read()
  2. EEPROM library reference
  3. EEPROM Clear - Fills the content of the EEPROM memory with “0”.
  4. EEPROM Read – Reads values stored into EEPROM and prints them on Serial.
  5. EEPROM Write – Stores values read from A0 into EEPROM.
  6. EEPROM Iteration – Programming examples on how to go through the EEPROM memory locations.
  7. EEPROM Put – Put values in EEPROM using variable semantics (differs from EEPROM.write() ).
  8. EEPROM Get – Get values from EEPROM and prints as float on serial.
  9. EEPROM Update – Stores values read from A0 into EEPROM, writing the value only if different, to increase EEPROM life.

Внешние ссылки

  1. Arduino - EEPROMCrc