Arduino:Примеры/EEPROMCrc: различия между версиями
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Myagkij (обсуждение | вклад) м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">») |
Нет описания правки |
||
Строка 25: | Строка 25: | ||
==Код== | ==Код== | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/*** | /*** | ||
Автор – Кристофер Эндрюс (Christopher Andrews). | Автор – Кристофер Эндрюс (Christopher Andrews). |
Версия от 18:18, 14 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Проверка EEPROM-памяти по методу CRC[1]
Микроконтроллер на плате Arduino/Genuino имеет, как правило, 512 байт EEPROM-памяти (у моделей Uno и Mega ее объем составляет 1 Кб и 4 Кб соответственно) – она хранит информацию, даже если плата находится в выключенном состоянии. Другими словами, это что-то вроде крошечного жесткого диска.
CRC – это простой способ проверки, были ли данные изменены или повреждены. Это что-то вроде подписи, т.е. любое изменение CRC-значения означает, что сохраненные данные тоже изменились. Целью данного примера является показать, как объект EEPROM можно использовать в виде массива. В нем CRC-значение рассчитывается прямо на EEPROM-данных.
Необходимое оборудование
- Плата Arduino или Genuino
Цепь
Для этого примера цепь строить не нужно.
Схема
Код
/***
Автор – Кристофер Эндрюс (Christopher Andrews).
CRC-алгоритм генерируется CRC-калькулятором pycrc, лицензия MIT (https://github.com/tpircher/pycrc ).
CRC – это простой способ проверки, были ли данные изменены
или повреждены. Целью данного примера является показать, как объект
EEPROM можно использовать в виде массива. В нем CRC-значение
рассчитывается прямо на EEPROM-данных.
***/
#include <Arduino.h>
#include <EEPROM.h>
void setup() {
// запускаем последовательную коммуникацию:
Serial.begin(9600);
while (!Serial) {
; // ждем подключения последовательного порта (нужно только для плат со штатным USB-портом)
}
// Показываем объем данных, которые будут подвержены CRC-проверке:
Serial.print("EEPROM length: "); // "Объем данных: "
Serial.println(EEPROM.length());
// Показываем результат вызова функции eeprom_crc():
Serial.print("CRC32 of EEPROM data: 0x"); // "CRC32-значение EEPROM-данных: 0x"
Serial.println(eeprom_crc(), HEX);
Serial.print("\n\nDone!"); // "\n\nГотово!"
}
void loop() {
/* пустой цикл */
}
unsigned long eeprom_crc(void) {
const unsigned long crc_table[16] = {
0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
};
unsigned long crc = ~0L;
for (int index = 0 ; index < EEPROM.length() ; ++index) {
crc = crc_table[(crc ^ EEPROM[index]) & 0x0f] ^ (crc >> 4);
crc = crc_table[(crc ^ (EEPROM[index] >> 4)) & 0x0f] ^ (crc >> 4);
crc = ~crc;
}
return crc;
}
См.также
- EEPROM.read()
- EEPROM library reference
- EEPROM Clear - Fills the content of the EEPROM memory with “0”.
- EEPROM Read – Reads values stored into EEPROM and prints them on Serial.
- EEPROM Write – Stores values read from A0 into EEPROM.
- EEPROM Iteration – Programming examples on how to go through the EEPROM memory locations.
- EEPROM Put – Put values in EEPROM using variable semantics (differs from EEPROM.write() ).
- EEPROM Get – Get values from EEPROM and prints as float on serial.
- EEPROM Update – Stores values read from A0 into EEPROM, writing the value only if different, to increase EEPROM life.