2014-08-04 01:47 AM
Hi,
I created a C# class which calculates the CRC32 checksum exactly like the STM This may be useful to others:using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Security.Cryptography;
namespace
JCC224_User_Interface
{
public
static
class
CRC32
{
public
static
UInt32 calculateWord(UInt32 crc, UInt32 data)
{
int
i;
crc = crc ^ data;
for
(i = 0; i < 32; i++)
{
if
((crc & 0x80000000) != 0)
{
crc = (crc << 1) ^ 0x04C11DB7;
// Polynomial used in STM32
}
else
{
crc = (crc << 1);
}
}
return
(crc);
}
public
static
UInt32 calculateBuffer(UInt32 initial_value, UInt32[] buffer)
{
for
(
int
i = 0; i < buffer.Length; i++)
{
initial_value = calculateWord(initial_value, buffer[i]);
}
return
initial_value;
}
}
}
#crc32
2014-08-04 07:37 AM
https://community.st.com/0D50X00009XkYj5SAF
https://community.st.com/0D50X00009XkbNMSAZ
https://community.st.com/0D50X00009XkZVESA3
Edit: fixing DEAD LINKs, original post from Aug 2014
2018-02-14 09:34 AM
Greetings all,
I independently wrote thisC# code and verified this is working. Enjoy.
I also want to add that Ispent a lot of time working with the Keil debugger -- DO NOT TRUST THE DEBUGGER FOR CRC. Always work out your CRC value using code, not the debug windows. The debug window gives you an incorrect CRC value (e.g.0x12345678 -> 0x877BB728 and not the correct value of0xDF8A8A2B).
public static UInt32 ComputeSTM32Checksum(UInt32[] inputData, UInt32 initial = 0xFFFFFFFF, UInt32 polynomial = 0x04C11DB7)
{
UInt32 crc = initial;
foreach (UInt32 current in inputData)
{
crc ^= current;
// Process all the bits in input data.
for (uint bitIndex = 0; (bitIndex < 32); ++bitIndex)
{
// If the MSB for CRC == 1
if ((crc & 0x80000000) != 0)
{
crc = ((crc << 1) ^ polynomial);
}
else
{
crc <<= 1;
}
}
}
return crc;
}�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?
Tests to check:
uint result1 = ComputeSTM32Checksum(new uint[] { 0x12345678 });
Trace.Assert(result1 == 0xDF8A8A2B);
uint result2 = ComputeSTM32Checksum(new uint[] { 0x8E09BAF6 });
Trace.Assert(result2 == 0x5C00CC44);
uint result3 = ComputeSTM32Checksum(new uint[] { 0x12345678, 0x8E09BAF6 });
Trace.Assert(result3 == 0x04F1F147);
uint result4 = ComputeSTM32Checksum(new uint[] { 0x8E09BAF6, 0x12345678 });
Trace.Assert(result4 == 0x90B2EE2D);�?�?�?�?�?�?�?�?