Всем спасибо! Отдельная благодарность SciFi! Научился готовить hw
crc. унутри готовая функция, авось кому пригодится uint32_t calc_hw_crc32(uint32_t crc32, uint8_t * buf, size_t byte_len)
{
uint32_t last_data = { 0 };
uint32_t dword_len = (byte_len >> 2);
uint32_t tail_byte_len = (byte_len & 3);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
CRC_ResetDR();
if (crc32 != DEF_CRC32)
{
CRC_ResetDR();
for(uint8_t i = 0; i < 32; i ++)
{
if (crc32 & 0x00000001)
{
crc32 = ((crc32 ^ 0x04C11DB7) >> 1) | 0x80000000; // Long form
}
else
{
crc32 = (crc32 >> 1);
}
}
crc32 = CRC_CalcCRC(crc32 ^ DEF_CRC32);
}
crc32 = CRC_CalcBlockCRC((uint32_t *)buf, dword_len);
if (tail_byte_len == 0)
{
return crc32;
}
else
{
memcpy(&last_data, &buf[byte_len - tail_byte_len], tail_byte_len);
}
switch ( tail_byte_len )
{
case 1:
{
last_data = buf[byte_len - tail_byte_len] << 24;
} break;
case 2:
{
last_data = *( (uint16_t *)(&buf[byte_len - tail_byte_len]) );
last_data <<= 16;
} break;
case 3:
{
last_data = *( (uint16_t *)(&buf[byte_len - tail_byte_len]) );
last_data <<= 8;
last_data += buf[byte_len - tail_byte_len + 2]<<24;
} break;
}
crc32 = CRC_CalcCRC(last_data);
return crc32;
}