Forum: PC-Programmierung Suche C# CRC32 Check kompatibel zum STM32 CRC32


von Artur (Gast)


Lesenswert?

Ich verwende beim stm32 den Hardware-CRC32 Check basierend auf das 
0x04C11DB7 Polynom. Leider finde ich nichts brauchbares für C#, was mir 
die gleichen Ergebnisse liefert. Die Funktion im uC Programm sieht 
folgendermaßen aus:
1
uint32_t
2
crc32_check (char *buf, uint16_t len) {
3
4
  uint32_t* pBuffer = buf;
5
  uint32_t BufferLength = (len / 4);
6
  uint32_t index = 0;
7
8
  if(!CRCenabledFlag) {
9
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
10
  }
11
  CRC_ResetDR();
12
13
  for(index = 0; index < BufferLength; index++) {
14
     CRC->DR = pBuffer[index];
15
  }
16
    return CRC->DR;
17
}
Hat jemand zufällig C# oder C Code, mit dem man auf das gleiche Ergebnis 
kommt? Ich muss CRC-32/BZIP2 konforme Prüfsummen erstellen und diese 
ebenfalls im STM32 auf richtigkeit prüfen.

von Mr.T (Gast)


Lesenswert?

Probier mal diesen code auf dem STM und vergleiche mit der HW-CRC32.
1
/****************************************************************************************
2
  Name    : CRCDriverCalculateCRC32SW()
3
  Function: Calculates a CRC32 equal to the HW CRC32 in software for a memory-block
4
5
  Parameters:
6
  Name                I/O  Type    Remark
7
  inBuffer_PU8            I  uint8*    calc CRC from this address on
8
  inSize_U32            I  uint32    that many bytes to calc CRC for
9
 ***************************************************************************************/
10
extern uint32_t CRCDriverCalculateCRC32SW(uint8_t* inBuffer_PU8, uint32_t inSize_U32)
11
{
12
  const uint32_t  kCRC32Polynominal_U32 = 0xEDB88320ul;
13
  uint32_t      myCRC32_U32 = 0xFFFFFFFFul;
14
  uint8_t      myIndex_U8, myByte_U8;
15
  uint32_t      myBufferIndex_U32;
16
17
  for(myBufferIndex_U32 = 0; myBufferIndex_U32 < inSize_U32; myBufferIndex_U32++) {
18
    myByte_U8 = inBuffer_PU8[myBufferIndex_U32];
19
    for(myIndex_U8 = 0; myIndex_U8 < 8; myIndex_U8++) {
20
      myCRC32_U32 = ((myCRC32_U32 & 1ul) != (myByte_U8 & 1u)) ? (myCRC32_U32 >> 1) ^ kCRC32Polynominal_U32 : myCRC32_U32 >> 1;
21
      myByte_U8 >>= 1u;
22
    }
23
  }
24
  return ~myCRC32_U32;
25
}

von Artur (Gast)


Lesenswert?

Ach, was auch seltsam ist, bei dem Polynom 0x04C11DB7 müsste meiner 
Meinung das Ergebnis mit einer F beginnen, was aber beim STM32 nicht der 
Fall ist.

von Artur (Gast)


Lesenswert?

@ Mr.T: in deinem Beispiel wird ein dem STM32 unbekanntes Polynom 
verwendet, ich bezweifele, dass da gleiches Ergebnis rauskommt.

von Mr.T (Gast)


Lesenswert?

Artur schrieb:
> @ Mr.T: in deinem Beispiel wird ein dem STM32 unbekanntes Polynom
> verwendet, ich bezweifele, dass da gleiches Ergebnis rauskommt.

Wenn Du das glaubst, dann lass es.

von Artur (Gast)


Lesenswert?

Ok, ich bin mir sicher :)

von Mr.T (Gast)


Lesenswert?

Artur schrieb:
> Ok, ich bin mir sicher :)

Dann gib heute abend Dein Diplom/Urkunde beim Pförtner ab.

von Artur (Gast)


Lesenswert?

Ist nur ein FH Diplom, ist sowieso nichts wert...
Aber back to Topic: Deine Funktion liefert auch ein anderes Ergebnis als 
die non-plus-ultra-crc-check-webseite:
http://www.lammertbies.nl/comm/info/crc-calculation.html

von Norbert (Gast)


Lesenswert?

Was sind die anderen Randbedingungen?
Startwert?
Finaler XOR Wert?
Ausrichtung der Daten?
Finales drehen der XOR Summe vor/nach dem XOR?

von Norbert (Gast)


Lesenswert?


von Artur (Gast)


Lesenswert?

Norbert schrieb:
> Was sind die anderen Randbedingungen?
> Startwert?
> Finaler XOR Wert?
> Ausrichtung der Daten?
> Finales drehen der XOR Summe vor/nach dem XOR?


width=32 poly=0x04c11db7 init=0xffffffff refin=false refout=false 
xorout=0xffffffff check=0xfc891918 name="CRC-32/BZIP2"

scheinbar kompatibel zu STM32

von Artur (Gast)


Lesenswert?

Ok, meine C# Funktion war schon korrekt, die STM Funktion musste jedoch 
angepasst werden.
1
uint32_t my_crc32(uint8_t* data, uint32_t len)
2
{
3
    uint32_t* pBuffer = (uint32_t*) data;
4
    uint32_t BufferLength = len/4;
5
    uint32_t index = 0;
6
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
7
    CRC_ResetDR();
8
      
9
    for(index = 0; index < BufferLength; index++)
10
    {
11
        CRC->DR = __RBIT(pBuffer[index]);
12
    }
13
    return __RBIT(CRC->DR) ^ 0xFFFFFFFF;
14
}
(c) STM Forum

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.