По причине отличия встроенного алгоритма от известного CRC-32, расчёт ведётся по одному слову, каждое из которых изменяется, как и результат.
Потому же не получилось использовать готовую функцию CRC_CalcBlockCRC.
описание проблемы и метод решенияКод
uint32_t crc32_hardware(uint32_t *pData, uint32_t len)
{
uint32_t result;
// включение модуля на время расчёта
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
// сброс на начальное значение
CRC_ResetDR();
// расчёт
for (int i = 0; i < len; i++)
CRC_CalcCRC(__RBIT(*pData++));
result = __RBIT(CRC_GetCRC()) ^ 0xffffffff;
// отключение модуля
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, DISABLE);
return result;
}
Ещё и данные этой функции надо скармливать по 32 бита. В результате отказался от этого модуля и применил программный расчёт с википедии.