Пробовал считать CRC32. Код такой:
Код
srec_cat sec.bin --binary -crc32-b-e 0x08 --output sec_new.bin --binary
Результат получился 0x4DB8ECF5. Нашел
онлайн калькулятор CRC - результат совпал. Но попробовал посчитать то же самое на stm - не вышло, считал как программным, так и аппаратным методом - в обоих методах результат одинаковый (0xEC5DBEA0)
Код
//===================================================================
uint32_t sw_calculate_soft_crc(uint32_t *pinput, uint32_t length)
{
uint32_t initial_crc = 0xFFFFFFFF; // начальное значение
uint32_t* input_data = pinput;
uint32_t polynom = 0x4C11DB7; // полином
uint32_t crc = 0 ; // контрольная сумма
uint32_t index = 0;
uint32_t bindex = 0;
while( index<length )
{
if(index==0){ crc = initial_crc ^ input_data[index];}
else { crc = crc ^ input_data[index]; }
while( bindex<(sizeof(input_data[index])*8) )
{ // if MSB of CRC = 1
if((crc>>31)==1){crc=(crc<<1)^polynom;}
else {crc=(crc<<1); }
bindex++;
}
bindex=0;
index++;
}
return crc;
}
//===================================================================
uint32_t sw_calculate_crc(uint32_t *input_data, uint32_t length)
{
// присваиваем адрес начала данных
uint32_t* pBuffer = input_data;
uint32_t index = 0;
uint32_t result = 0;
__CRC_CLK_ENABLE(); //Включить тактирование
CRC->CR = CRC_CR_RESET; //Сброс контрольного регистра
while(index<length) //Запись данных в регистр данных для расчета
{
CRC->DR = pBuffer[index++];
tmp++;
}
result = CRC->DR; //Извлечь просчитаную контрольную сумму
__CRC_CLK_DISABLE(); //Выключить тактирование
return result;
}
А вот, собственно, вызов функций:
Код
uint32_t CRC_val = 0;
uint32_t CRC_val2 = 0;
uint32_t data_table[]={0x11111111,0x11111111};
CRC_val = sw_calculate_crc(data_table, sizeof(data_table)/sizeof(uint32_t));
CRC_val2= sw_calculate_soft_crc(data_table, sizeof(data_table)/sizeof(uint32_t));
Вопрос по прежнему открыт.