//****************************************************************************
//
// CRCSTM32 - Forward and Reverse CRC32 Computation on the ST Micro STM32
// Copyright (C) 2010-2021 C Turvey, All rights reserved
//
// sourcer32@gmail.com
//
//****************************************************************************
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
typedef unsigned long uint32_t;
//****************************************************************************
uint32_t Crc32(uint32_t Crc, uint32_t Data)
{
int i;
Crc = Crc ^ Data;
for(i=0; i<32; i++)
if (Crc & 0x80000000)
Crc = (Crc << 1) ^ 0x04C11DB7; // Polynomial used in STM32
else
Crc = (Crc << 1);
return(Crc);
}
//****************************************************************************
uint32_t Crc32Rev(uint32_t CurrentCrc, uint32_t DesiredCrc)
{
uint32_t Data;
int i;
for(i=0; i<32; i++)
if (DesiredCrc & 0x00000001)
#if 1
DesiredCrc = ((DesiredCrc ^ 0x04C11DB7) >> 1) | 0x80000000; // Long form
#else // or
DesiredCrc = (DesiredCrc >> 1) ^ 0x82608EDB; // Back feeding polynomial
#endif
else
DesiredCrc = (DesiredCrc >> 1);
Data = DesiredCrc ^ CurrentCrc;
return(Data); // Data Pattern to get Desired CRC from Current CRC
}
//****************************************************************************
int main(int argc, char **argv)
{
printf("%08X (0x2608EDB8)\n\n",Crc32(0, 0x00000008)); // 0x2608EDB8
printf("%08X (0x490D678D)\n\n",Crc32(0, 0x04C11DB7)); // 0x490D678D
printf("%08X (0x00000000)\n\n",Crc32(0x04C11DB7, 0x04C11DB7));
printf("%08X (0x2F69E5B4)\n\n",Crc32Rev(0xAAAAAAAA, 0x12345678));
printf("%08X (0x12345678)\n\n",Crc32(0xAAAAAAAA, 0x2F69E5B4));
printf("%08X (0x80E886A3)\n\n",Crc32(0, 0x66666666));
printf("%08X (0x84299B14)\n\n",Crc32(1, 0x66666666));
printf("%08X (0x47EC5BD8)\n\n",Crc32(0xFFFFFFFF, 0x66666666));
printf("%08X (0xC704DD7B)\n\n",Crc32(0xFFFFFFFF, 0));
printf("%08X (0x04C11DB7)\n\n",Crc32(0, 1));
return(0);
}
//****************************************************************************
__CRC_CLK_ENABLE();
CRC->CR = 1;
printf("%08X\n", CRC->DR);
CRC->DR = 0x66666666;
printf("%08X\n", CRC->DR);
FFFFFFFF
47EC5BD8