//-------------------------------------------------------------------------------
// Подсчет CRC32 как в STM32 по умолчанию. (CRC32_POLY 0x04C11DB7) ???
static const uint32_t Crc32Table[] = {
0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9, 0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005,
0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61, 0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD
};
uint32_t DR; // (Data Register) Так в STM32 называется аппаратный регистр CRC
void crc32_ini(void) {DR = 0xFFFFFFFF;}
void crc32_upd(uint32_t data) {
DR = DR ^ data;
DR = (DR << 4) ^ Crc32Table[DR >> 28];
DR = (DR << 4) ^ Crc32Table[DR >> 28];
DR = (DR << 4) ^ Crc32Table[DR >> 28];
DR = (DR << 4) ^ Crc32Table[DR >> 28];
DR = (DR << 4) ^ Crc32Table[DR >> 28];
DR = (DR << 4) ^ Crc32Table[DR >> 28];
DR = (DR << 4) ^ Crc32Table[DR >> 28];
DR = (DR << 4) ^ Crc32Table[DR >> 28];
}
uint32_t crc32_get(void) {return DR;}
uint32_t crc32_calc(uint32_t *pData, int size) {
crc32_ini();
while(size > 0) {
crc32_upd(*pData++);
size -= 4;
}
uint32_t crc32 = crc32_get();
return crc32;
}
//-------------------------------------------------------------------------------