Если вы принимаете кучу данных, в целостности и корректности которых вы должны быть уверены (например прошивки), то имеет смысл перед их использованием убедиться, что при передачи ни один никакой бит не был повреждён. В случае с прошивкой устройство просто может превратиться в кирпич. Перебирать каждое слово и сверять его -- очень долго. Есть хорошее решение для такой задачи -- использовать контрольную сумму (хеш-сумму). В stm32 имеется аппаратный модуль CRC32.
Циклический избыточный код (англ. Cyclic redundancy check, CRC) — алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных. CRC является практическим приложением помехоустойчивого кодирования, основанным на определённых математических свойствах циклического кода. // Википедия
Детально разбирать работу CRC32 мы не будем, вы можете ознакомиться с этим самостоятельно (например тут часть 1, часть 2 и часть 3).
У саго блока всего два регистра. Один для ввода данных \ вывода контрольной суммы (DR
). И второй это регистр контроля (CR
) у которого, к тому же всего один активный бит сброса.
Пример использования:
xxxxxxxxxx
// turn on CRC32 peripheral
RCC->AHBENR |= RCC_AHBENR_CRCEN;
// reset the calculation (default value is 0xFFFFFFFF)
CRC->CR = CRC_CR_RESET;
for (uint32_t i = 0; i < data_size; i++)
CRC->DR = data[i];
crc32 = CRC->DR;
// std periph
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
CRC_ResetDR();
CRC_CalcBlockCRC(data, data_size);
// or
// for(uint32_t i = 0; i < data_size; i++)
// CRC_Calc(data[i]);
crc32 = CRC_GetCRC();
У этого блока, однако, есть недостатки. Первый, не столь существенный, заключается в фиксированном палиндроме (0x04C11DB7
).
Второй, кроется в том, что расчёт суммы происходит не по классическому алгоритму -- данные побитово переставляются и инвертируются. Подробнее об этом вы можете прочитать в блоке Alex-EXE, там же можно скачать утилиту для Windows, которая рассчитывает CRC32 так же как и STM32. Реализацию можно найти здесь (на Си и на Delphi).
Назад | Оглавление | Дальше