Suche C# CRC32 Check kompatibel zum STM32 CRC32

Gast #3298623
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.
Gast #3298631
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
}
Gast #3298941
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
Gast #3299004
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren