Arduino:Примеры/EEPROMCrc

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

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Проверка 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.

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