Forum: Mikrocontroller und Digitale Elektronik CRC Berechnung Firmware


von Leonhard (Gast)


Lesenswert?

Guten Morgen,

bezüglich einer CRC Berechnung über eine Firmware von insgesamt 128kByte 
suche ich ein Verfahren und wie man dieses realisieren könnte.

von PittyJ (Gast)


Lesenswert?

Google spuckt sowas aus:
https://www.lammertbies.nl/comm/info/crc-calculation.html

Warum geht das nicht?

von Dr. Sommer (Gast)


Lesenswert?

Implementiere den CRC Algorithmus wie er auf Wikipedia steht. Was gibt's 
da noch an Verfahren zu suchen?

von Leonhard (Gast)


Lesenswert?

Auf dieser Seite war ich bereits schon. Mir ist nur noch nicht ganz klar 
wie so eine CRC Berechnung über einen 128kByte Block realisiert werden 
kann.

von Leonhard (Gast)


Lesenswert?

Natürlich ohne Lookup Tabelle.

von Michael D. (Firma: indEAS) (indeas)


Lesenswert?

Die Microchip PIC24er Familie hat eine "CRC-Engine" an Bord:
http://ww1.microchip.com/downloads/en/DeviceDoc/39714a.pdf

von Viewer (Gast)


Lesenswert?

Leonhard schrieb:
> Guten Morgen,
>
> bezüglich einer CRC Berechnung über eine Firmware von insgesamt 128kByte
> suche ich ein Verfahren und wie man dieses realisieren könnte.

CRC32 oder ADLER32

von Erwin D. (Gast)


Lesenswert?

Viewer schrieb:
> Leonhard schrieb:
>> Guten Morgen,
>>
>> bezüglich einer CRC Berechnung über eine Firmware von insgesamt 128kByte
>> suche ich ein Verfahren und wie man dieses realisieren könnte.
>
> CRC32 oder ADLER32

Adler berechnet KEINE CRC

Zur CRC ist auch wichtig zu wissen, welches Polynom verwendet wird und 
welcher Startwert. Wenn die nicht übereinstimmen bei Sender und 
Empfänger, kommen unterschiedliche Ergebnisse raus und somit nützt das 
nix...

von Leonhard (Gast)


Lesenswert?

Ich möchte eine CRC32 Berechnung realisieren.
Die Berechnung soll auf der PC Seite sowie im Mikrocontroller 
durchgefühert werden.

von Leonhard (Gast)


Lesenswert?

Es gibt auf dem Mikrocontroller einen CRC Engine. Allerdings weiss ich 
die exakte Implementierung nicht. Auf der PC Seite soll ja auch die 
Berechnung durchgeführt werden.

von Leonhard (Gast)


Lesenswert?

Startwert: 0
Polynom: 0x4C11DB7

von Erwin D. (Gast)


Lesenswert?

Leonhard schrieb:
> Startwert: 0
> Polynom: 0x4C11DB7

Damit hast du doch schon alles, ws du brauchst. Die Umsetzung ist hier 
beschrieben.
https://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung

Wenn das nicht reicht, gibt es noch die Suchmaschine deines geringsten 
Mißtrauens. Da gibt es unzählige Beispiele, wie man den Algorithmus 
implementieren kann.

von Erwin D. (Gast)


Lesenswert?

Nochwas: Wenn auf dem (unbekannten) µC eine CRC-Engine existiert, gibts 
da bestimmt ein Datenblatt und Application Notes vom Hersteller. Und 
auch dafür existieren garantiert Beispiele und Anleitungen in Hülle und 
Fülle. Wenn du verrätst, um welchen µC es sich handelt, findet sich hier 
im Forum vielleicht sogar jemand, der genau das schonmal gemacht hat und 
dir Tipps geben kann.

von Kaj (Gast)


Lesenswert?

Leonhard schrieb:
> Polynom: 0x4C11DB7
Meinst du nicht eher 0x104C11DB7 ?

von Leonhard (Gast)


Lesenswert?

Ich benutzte den XMC4700 von Infineon.

von ♪Geist (Gast)


Lesenswert?

Leonhard schrieb:
> Guten Morgen,
>
> bezüglich einer CRC Berechnung über eine Firmware von insgesamt 128kByte
> suche ich ein Verfahren und wie man dieses realisieren könnte.

Hier bitte schön, das habe ich aus meiner Firmware für dich rausgekrammt 
:)
1
uint32_t crc32_check (uint8_t* buf, uint16_t len) {
2
3
  uint32_t* pBuffer = (uint32_t*)buf;
4
  uint32_t BufferLength = (len/4);
5
  uint32_t index = 0;
6
7
  if(!CRCenabledFlag) {
8
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
9
  }
10
  CRC_ResetDR();
11
12
  for(index = 0; index < BufferLength; index++) {
13
     CRC->DR = __RBIT(pBuffer[index]);
14
  }
15
  return __RBIT(CRC->DR) ^ 0xFFFFFFFF;
16
}

von ♪Geist (Gast)


Lesenswert?

EDIT: Ahh jetzt...Ha

Leonhard schrieb:
> Ich benutzte den XMC4700 von Infineon.

Ach jetzt...
Schau Hier: habe für dich gegoogelt:
http://www.infineon.com/cms/en/product/promopages/aim-mc/dave_downloads.html

von Leonhard (Gast)


Lesenswert?

Die interne CRC Berechnung von Infineon habe ich schon Inbetrieb 
genommen.
Die Berechnung scheint auch zu funktionieren. Jetzt benötige ich diese 
Implementierung auch auf der PC Seite.

von Leonhard (Gast)


Lesenswert?

Die folgende Implemntierung bringt mir auf der PC Seite nichts.
1
uint32_t crc32_check (uint8_t* buf, uint16_t len) {
2
3
  uint32_t* pBuffer = (uint32_t*)buf;
4
  uint32_t BufferLength = (len/4);
5
  uint32_t index = 0;
6
7
  if(!CRCenabledFlag) {
8
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
9
  }
10
  CRC_ResetDR();
11
12
  for(index = 0; index < BufferLength; index++) {
13
     CRC->DR = __RBIT(pBuffer[index]);
14
  }
15
  return __RBIT(CRC->DR) ^ 0xFFFFFFFF;
16
}

von Erwin D. (Gast)


Lesenswert?

Leonhard schrieb:
> Jetzt benötige ich diese
> Implementierung auch auf der PC Seite.

Dann schau dir mal den verlinkten Wikipedia-Artikel an. Da steht ein 
C-Beispiel für die CRC32 drin.

von DerDan (Gast)


Lesenswert?

Das Tool SRecCut http://srecord.sourceforge.net/ kann ganz tool CRC 
berechnungen durchfüren und in dein Image einfügen. Auch der IAR 
Compiler bringt dafür Tools mit...

mfg

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.