mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CRC32 über 32bit Werte


Autor: Hoellenprogger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Im STM32 ist eine 32bit CRC-Engine in Hardware vorhanden. Dort kann ich 
32bit werte hineingeben und es kommen 32bit werte heraus. Nun muss ich 
soetwas in Software nachbilden. Ich weiss wie das mit chars als 
eingangswerte funktioniert. Aber wie mache ich das mit 32bit 
eingangswerten? 4 Chars hintereinader funktioniert ja nicht.
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#define CRC32POLYREV 0xEDB88320 /* CRC-32 Polynom, umgekehrte Bitfolge */
 
int datastream[]={1,0,0,0,1,1,0,0}; /* ASCII-"1", LSB zuerst */
int databits=8;
uint32_t crc32_rev=0xffffffff; /* Schieberegister, Startwert (111...) */
 
int main(void)
{   int i;
    for (i=0; i<databits; ++i)
        if ((crc32_rev & 1) != datastream[i])
             crc32_rev=(crc32_rev>>1) ^ CRC32POLYREV; 
        else 
             crc32_rev=crc32_rev>>1;
    printf("0x%08X\n",crc32_rev ^ 0xffffffff); /* inverses Ergebnis, MSB zuerst */
    return EXIT_SUCCESS;
}

Das ist von Wikipedia. Wenn ich das mit Databits = 32 mache 
funktionierts nicht. Muss noch etwas anderes geändert werden?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aufpassen int ist ggf auf einem Microcontroller nur 16bit breit!

Und "funktioniert nicht" ist ein eindeutiger Fall von "Nutzer zu doof 
für Fehlerbeschreibung" Problem... ;)

WAS gibst du rein, WAS kommt raus, WAS erwartest du wären so die 
interesanten Fragen.

Autor: Hoellenprogger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

auf dem STM32 mit Keil ist int 32bit breit. Hab ich auch überprüft.

Funktioniert nicht heisst wenn ich einen Wert von 0 als bitfolge 
festlege, dann erwarte ich als Rest (also crc32_rev) 0x04c11db7. Ich 
erhalte aber 0x21ffdf1c.
int datastream[]={0,0,0,0, 0,0,0,0, 0,0,0,0 ,0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
int size = sizeof(datastream);
int databits=32;

unsigned int crc32_rev=0xffffffff; /* Schieberegister, Startwert (111...) */

    for (i=0; i<databits; ++i)
        if ((crc32_rev & 1) != datastream[i])
             crc32_rev=(crc32_rev>>1) ^ CRC32POLYREV;
        else
             crc32_rev=crc32_rev>>1;
    printf("0x%08X\n",crc32_rev ^ 0xffffffff); /* inverses Ergebnis, MSB zuerst */

Hier nochmal der auf 32bit erweiterte Code

Autor: Hoellenprogger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Leider etwas verwirrt. Ich programmiere natürlich auf PC. Mit Borland 
und da ist int 32bit breit.

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Mit Borland und da ist int 32bit breit."

Hast Du das überprüft?  bei TurboC ist es nämlich nur 16-Bit.
Long ist 32-Bit.


Stimmt der Startwert 0xffffffff mit dem der Hardwareunit überein?

Macht die HW-Unit am Schluß auch das
^ 0xffffffff ?

CRC ist halt nicht CRC...
Dazu haben wir schon etliche Beiträge geschrieben.
Hast Du schonmal eine andere SW-Routine versucht?

Normalerweise ist ja der Datenwert nicht als Bit-Array abgespeichert.

Das bekommen wir schon hin!

Autor: Hoellenprogger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Manchmal hilft es echt ein paar Stunden etwas Anderes zu machen und dann 
nochmal in Ruhe das Ganze anzuschauen.

Ich habs jetzt geschafft. Man kann diese Routine benutzen nur müssen die 
Bitwerte gedreht werden (MSB<->LSB).

Das mit int hatte ich schon getestet. Sonst würde bei einer Zuweisung
unsigned int x = 0xffffffff;

eine Warnung kommen.

Das Problem an sich war, dass im Datenblatt des STM32 nicht genau stand, 
was die Hardware-Unit genau macht. Durch Probieren mit 0xaaaaaaaa und 
0x55555555 bin ich dann drauf gekommen.

Autor: Reinhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe auch das Problem die Hardware-CRC per Software nachzubilden.

Welche Bitwerte müssen gedreht werden?

kannst Du bitte die getestete Routine noch mitteilen?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.